SQL - Structured Query Language

Propaganda
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
Download