SQL - Structured Query Language Linguagem de Consulta Estruturada Introdução ao SQL SQL é a linguagem padrão da indústria de bancos de dados relacionais. O padrão ANSI a adotou em 1986. Os principais Bancos de Dados Relacionais aceitam alguma forma do SQL, procurando estar no padrão ANSI. Abaixo, algumas terminologias em Banco de Dados: Tabela Estrutura básica de armazenamento de dados; Linha Combinação dos valores das colunas em uma tabela. O mesmo que registro; Coluna Representa um tipo de dados em uma tabela. É descrita por um nome de coluna; Atributo Área que pode conter um tipo de dados. É a interseção de O mesmo que campo; Chave Primária É a coluna que identifica com exclusividade cada uma linha com uma coluna. linha de uma tabela; Chave Estrangeira É uma coluna ou conjunto de colunas referente a uma chave primária de uma outra tabela. A partir da chave estrangeira podemos relacionar tabelas (join). Comando Select O comando principal do SQL é o comando recuperador de informações, o SELECT. Este comando permite recuperar (exibir) dados de uma ou mais tabelas. Quando utilizamos em mais de uma tabela, devemos utilizar o relacionamento de chaves primárias e estrangeiras para transformar dois registros em um só. Na verdade, a tabela criada é apenas lógica. Na execução do Select existem apenas duas cláusulas obrigatórias: o próprio Select, que define as colunas a serem exibidas e o FROM, que define as tabelas que serão utilizadas. Exemplo: SELECT * FROM alunos onde "*" significa que todas as colunas serão exibidas e "Alunos" é o nome da tabela. No lugar do "*", você pode informar os campos que você deseja exibir. Também pode alterar o nome da coluna exibida (apenas para o resultado do select). Exemplo: SELECT aluno Código, nome, nascimento Data FROM alunos O comando acima exibe três campos da tabela alunos, sendo que o primeiro e o terceiro campo tiveram o nome da coluna alterada para Código e Data, respectivamente. 2.2.Cláusula Where Responsável por filtrar linhas da tabela, definindo uma ou mais condições. Exemplo: Exibir todos os campos da tabela ALUNOS onde o sexo é igual a "F": Select * From Alunos Where sexo = "F" Na cláusula Where podemos utilizar mais de uma condição, ligando-as com AND e OR. Como estas ligações lógicas são do SQL e não do aplicativo, NÃO usamos os pontos no início e no fim (.and. e .or.), utilizadas normalmente na linguagem de programação. Outras duas opções do Where são o IN e o BETWEEN. O IN é semelhante ao OR, podendo usar qualquer valor (numérico, data ou caracter) e seus valores de comparação ficam entre parênteses. Usamos o IN quando os valores de comparação são mínimos ou quando há intervalos entre eles (01 ou 05, 'A' ou 'M' ou 'T'). Já o BETWEEN é uma opção de faixa de valores, que não contém intervalos (salários entre R$500 e R$900, nomes de 'A' até 'F'). Exemplos: Select Select Select Select * * * * from from from from alunos alunos alunos alunos where where where where cidade in ("01","04","37") sexo = "F" and turno in ("M","V") month(nascimento) between 1 and 6 nome in ("A","C") and day(nascimento) between 10 and 20 Observação: Podemos utilizar a opção NOT para condições contrárias do IN e BETWEEN. Opção Like no Where Esta opção é utilizada na pesquisa parcial de dados, como nome incompleto de cliente, sobrenome igual a nome, etc. Para utilizar o Like, definimos que tipo de substituição queremos em um campo caracter: substituição de um ou mais caracteres. Utilizamos: _ (underline) : define a substituição de apenas um caracter; % (percentual): define a substituição de uma cadeia de caracteres (string), não importa o tamanho. Podemos usar a opção NOT para negação. Exemplos: Listar todas as pessoas onde o nome inicia com 'EDUARDO' Select * From alunos Where nome Like 'EDUARDO %' Listar todas as pessoas que possuam, nome ou sobrenome, Select * From alunos Where nome Like '% PAULA %' Listar todos os nomes onde a segunda letra é 'A' Select * From alunos Where nome Like '_A%' 'PAULA' Cláusula Order By Ordena a Exemplo: exibição por uma ou mais colunas definidas (e separadas por vírgula). SELECT aluno, nome,curso FROM Alunos ORDER BY curso, nome Os campos que forem usados na cláusula ORDER BY não são obrigados a aparecer na lista definida pelo SELECT. Após o nome da coluna ordenada, podemos usar a opção DESC para ordernar de forma descendente, senão a opção ASC (ascendente) que já é padrão. Podemos substituir o nome do campo pelo seu número da posição no select. Exemplo: SELECT aluno, nome, curso FROM alunos ORDER BY 3, 2 Funções do SQL O SQL possui funções próprias que calculam valores agrupando mais de uma linha. Pode ser a contagem de linhas (registros) ou um cálculo com um campo numérico da tabela. AVG() : COUNT(): MIN() : MAX() : SUM() : calcula a média de uma coluna de dados numéricos. conta o número de itens selecionado em uma coluna. determina o menor valor de Item_Selecionado em uma coluna. determina o maior valor de Item_Selecionado em uma coluna. totaliza uma coluna de dados numéricos. Exemplos: Qual é a média de débitos dos alunos da cidade "01" Select avg(debito) from alunos where cidade = "01" Quantos alunos do sexo feminino estudam o curso "02" select count(*) from alunos where sexo = "F" and curso = "02" Qual é o menor e o maior débito dos alunos do turno matutino select min(debito), max(debito) from alunos where turno = "M" Qual é a soma e quantos alunos devem acima de R$ 100,00 select sum(debito), count(*) from alunos where debito > 100 Cláusula Group By Agrupa as linhas de consulta com base nos valores de uma ou mais colunas. O parâmetro pode ser o nome do campo ou seu número no resultado do comando Select. A cláusula Group By é muito útil quando a utilizamos para trabalhar junto às funções do comando Select, como encontrar a soma de um campo numérico, dependendo de outro campo (sum), ou simplesmente contar o número de registro agrupados (count). Exemplo: Quantos alunos existem em cada curso? Select curso, count(*) Quantidade From alunos GROUP BY CURSO Quantos alunos estudam por turno e curso? Select turno, curso, count(*) From alunos GROUP BY 1, CURSO Cláusula Having Especifica uma condição de filtragem que os grupos devem satisfazer para que sejam incluídos nos resultados da consulta. HAVING deve ser utilizada com GROUP BY. Ela pode incluir quantas condições de filtragem você desejar, conectadas com o operador AND ou OR. Você também pode utilizar NOT para inverter o valor de uma expressão lógica. A maior importância da cláusula Having é ser utilizada como o WHERE, porém para o resultado do GROUP BY. No where, não há como utilizar as funções do SELECT dentro do where (sum, count, min ...); somente o HAVING aceita estas funções na filtragem. Exemplo: Quantos alunos existem em cada curso? Exiba apenas os que possuem 44 alunos. Select curso, count(*) Quantidade From alunos group by curso HAVING count(*) = 44 Quantos alunos estudam por turno e curso, onde o menor débito é igual a R$10,00? Select turno, curso, count(*) From alunos GROUP BY 1, CURSO HAVING MIN(DEBITO) = 10 Opção Distinct Uma seleção padrão é executada com a opção ALL, que trabalha com todas as linhas da(s) tabela(s). A opção DISTINCT exclui linhas duplicadas das colunas selecionadas. Observação: Você só pode utilizar DISTINCT uma vez em cada SELECT. Exemplo: Exibir as linhas existentes da tabela alunos que combinam cidade e turno: Select Distinct cidade, turno from alunos Relacionamento (Join) Para criarmos um banco de dados, a análise dos dados (utilizando Ferramentas CASE) deve gerar informações normalizadas para não haver armazenamento redundante. A partir do DER (Diagrama Entidade-Relacionamento) ligamos as chaves primárias às chaves estrangeiras para identificar as relações entre tabelas. No SQL, esta ligação sempre deve ser informada no comando para recuperar uma Query que pode possuir campos de mais de uma tabela. Por exemplo, no comando Select, para exibir o código do funcionário e a UF da sua cidade devemos executar: SELECT funcions.funcionario, cidades.uf FROM funcions, cidades WHERE funcions.cidade = cidades.cidade Note que o campo PODE ser precedido do nome da tabela mais um ponto, para mostrar de qual tabela corresponde o campo. Se exibir nomes de campo iguais de duas tabelas, você DEVE colocar o nome da tabela antes do campo. Exemplo: SELECT funcions.nome, cidades.nome FROM funcions, cidades WHERE funcions.cidade = cidades.cidade De qualquer forma, sempre a condição de ligação é a comparação entre chave primária e chave estrangeira. NUNCA esqueça de colocar esta condição de ligação, senão haverá uma geração de relacionamento errado (N para N inválido). O nome da tabela pode ser substituído, na identificação dos campos, por um apelido (alias). Desta forma, você estará customizando a digitação do comando. Exemplo: SELECT f.funcionario, f.nome, c.cidade, c.nome, c.uf FROM funcions F, cidades C WHERE f.cidade = C.cidade A Query exibida não é uma tabela (ou visão) física. É lógica. Por isso, não haverá criação física (no HD) de uma nova tabela. Cuidado: se há join com duas tabelas, há uma condição de ligação. Se há join com mais de duas tabelas, haverá mais de uma condição de ligação. Exemplo: SELECT f.nome, c.nome, e.nome FROM funcions f, cidades c, estab e WHERE f.cidade = c.cidade AND f.estab = e.estab Operadores As colunas recuperadas pelo comando SELECT, até agora, foram atributos das tabelas em sua forma simples ou utilizando funções do aplicativo (val(), month(), year(), etc). Mas também podemos gerar colunas que são resultados de cálculos aritméticos, utilizando operadores como: +, -, *, /, **. Exemplos: Exiba o nome do funcionário e seu salário com aumento de 5% SELECT nome, salario * 1.05 Com_Aumento FROM funcions Exiba a duplicata 10 com o valor menos R$3,00 e o campo pago dividido por 3 SELECT duplicata, valor - 33 Valor, pago / 3 Dividido FROM duplics Por falta de exemplo, digite o comando abaixo SELECT nome, 3 ** 3 Potencia FROM funcions where salario > 1400 Outros exemplos de alteração das colunas recuperadas são a concatenação e as funções substr() e iif(). Normalmente são utilizados para emissão de relatório ou consultas: Exiba dia e ano do nascimento e código mais nome concatenados dos funcionarios SELECT substr(dtoc(nascimento),1,5), funcionar+' - '+nome FROM funcions Exiba o valor das duplicatas e 'alto ' se valor é maior que R$20,00 senão 'baixo' SELECT valor, iif(valor>20,'alto ','baixo') FROM duplics Sub-Query A cláusula WHERE do comando Select serve para filtrar, com condições, o número de linhas recuperadas numa query. Porém, pode haver situação que a condição não pode ser concretizada com as informações atuais do Select. Para isso, usamos o resultado de um Select para auxiliar na condição da cláusula WHERE, tendo um select dentro de outro select (Sub-Query). Exemplo: Quais são os funcionários que recebem mais que a média de todo o cadastro? .Forma Simples: Select avg(salario) from funcions (para achar o salario medio: 348,85) Select * from funcions where salario > 348.85 .SUB-QUERY: Select * from funcions where salario > (select avg(salario) from funcions) Quais são os funcionários do mesmo estabelecimento dos funcionários 24 e 127? Select * from funcions where estab in ; (select estab from funcions where val(funcionar) in (24,127)) OBSERVAÇÕES: Atenção com a quantidade de linhas do segundo select. Se retornar uma linha, utilizar =, >, <, <>. Se retornar mais de uma linha, TEM que utilizar IN. pode-se Repare nos exemplos acima: o resultado da sub-query deve ser sempre compatível com campo da condição do Select principal. o Cláusula UNION Combina os resultados finais de um SELECT com os resultados finais de outro SELECT. Como padrão, UNION verifica os resultados combinados e elimina linhas duplicadas. Utilizando ALL, o comando não elimina linhas duplicadas. Observações Importantes para o UNION: Não é possível utilizar UNION para combinar subconsultas; Os dois comandos SELECT devem ter o mesmo número de colunas na saída da consulta; Cada coluna nos resultados da consulta de um SELECT deve ter o mesmo tipo de dado e a mesma largura da coluna correspondente ao outro SELECT; Se uma cláusula ORDER BY estiver incluída, ela afetará o resultado inteiro. Só utilize número de coluna. Exemplos: Crie uma query exibindo os bancos e estabelecimentos em ordem alfabética: Select * from bancos UNION Select * from estabs order by 2 Crie uma query diferentes): exibindo os bancos e cidades em ordem alfabética Select banco+space(3),nome+space(10),space(2) from bancos UNION Select cidade, nome, uf from cidades order by 2 (estruturas Veja um UNION mais complexo. Junte um select de totais de cooperados por banco e outro select de cooperados. Exiba na ordem de sub-totais e cooperados por banco: Select 1,count(*),banco,space(32) from cooperados group by 3 UNION ; Select 2,val(cooperado),banco,nome from cooperados order by 3,1 Cláusula JOIN Normalmente, criamos querys com relacionamentos entre tabelas para saber informações que possuem realmente relacionamento (nome do estabelecimento do funcionario, nome da uf do funcionario, etc). Porém, em algum momento, podemos precisar justamente do contrário, isto é, registros que não se relacionam com a outra tabela. Motivo: a chave primária de uma tabela não existe na chave secundária de outra tabela. INNER JOIN - especifica que o resultado da consulta contém somente linhas de uma tabela, que correspondem a uma ou mais linhas em outra tabela. O mesmo uso do Where que conhecemos. LEFT JOIN - especifica que o resultado da consulta contém todas as linhas da tabela à esquerda da palavra-chave JOIN, correspondendo apenas às linhas da tabela à direita da palavra-chave JOIN. RIGHT JOIN - especifica que o resultado da consulta contém todas as linhas à direita da palavra-chave JOIN, correspondendo apenas às linhas da esquerda da palavra-chave JOIN. da tabela tabela à FULL JOIN - especifica que o resultado da consulta correspondentes e não correspondentes de ambas as tabelas. as contém todas linhas ON - especifica as condições para as quais as tabelas são associadas. EXEMPLO: Quais são as cidades que não possuem nenhum aluno cadastrado de sua procedência: SELECT a.cidade, c.cidade, c.nome from alunos a RIGHT JOIN cidades c ; ON a.cidade = c.cidade where a.cidade = space(2) Comando INSERT Inclui um registro ao final de uma tabela contendo os valores de campo especificados. Quando o registro a ser adicionado for de uma tabela do banco de dados, com definição de integridade referencial, chave primária e chaves secundárias poderá haver problemas da inserção como repetição da chave primária e campos não nulos. Cláusulas: INTO tabela - Define o nome da tabela (nome_de_campos) - lista dos campos do registro que receberão os valores do VALUES VALUES (valores) - Valores a serem atribuídos nos campos identificados. Devem estar na mesma sequência e mesmo tipo dos campos. Exemplo: Incluir um registro na tabela cidades com valores correspondentes: INSERT INTO cidades (cidade, nome, uf) VALUES ("00020","BETIM","MG") Incluir um registro na tabela Funcions: INSERT INTO funcions (funcionar,nome,nascimento,salario) VALUES ("000090","MARIA JUVENTINA",ctod("05/05/80"),700) Comando UPDATE Altera valores de uma ou mais linhas da tabela especificada. Devem ser tomados os mesmos cuidados do comando INSERT quanto a chave primária e integridade referencial. Sintaxe: UPDATE nome_tabela - identifica o nome da tabela SET atribuição1,atribuição n - define os campos a serem alterados WHERE condição especifica os registros a Se omitida a atualização será feita para todos os registros. serem alterados. Exemplo: Altere a UF da cidade 20 da tabela cidades para "RJ" UPDATE cidades SET uf = "RJ" WHERE cidade = "00020" Altere o salário dos funcionários da cidade "01", acrescentando 5% UPDATE funcions SET salario = salario * 1.05 WHERE cidade = "01" Comando DELETE Marca um ou mais registros para exclusão. Sintaxe: DELETE FROM nome_tabela - Define o nome da tabela dos registros a serem excluidos WHERE condição - Especifica os registros a serem excluidos. Exemplo: Excluir o registro onde código do funcionário é 000735 DELETE FROM funcions WHERE funcionar = "000735" Excluir os funcionarios que recebem mais de R$ 1000,00. DELETE FROM funcions WHERE salario > 1000