Prévia do material em texto
Prof. Luiz Vivacqua
Projeto de Banco de Dados
Banco de Dados II
Prof. Luiz Antônio Vivacqua C. Meyer
(luiz.vcm@gmail.com)
Prof. Luiz Vivacqua
SQL - CONSULTAS
❑Sintaxe Geral
SELECT [ALL/DISTINCT] coluna1, coluna2, ..., colunaN
FROM nome_tabela1, nome_tabela2, ..., nome_tabelaN
[WHERE predicado]
[GROUP BY coluna1, coluna2, ..., colunaX]
[HAVING predicado]
[ORDER BY coluna1[asc/desc], coluna2[asc/desc], ..., colunaY[asc/desc]];
Prof. Luiz Vivacqua
SQL - CONSULTAS
Peça
Fornecedor
Fornecimento
Prof. Luiz Vivacqua
SQL - CONSULTAS
Recuperação Simples: Obter a identificação de todas as
peças fornecidas.
Select id_peca
from fornecimento;
Prof. Luiz VivacquaProf. Luiz A. Vivacqua C. Meyer
SQL - CONSULTAS
Recuperação Simples sem ocorrência de duplicatas.
Obter o código dos fornecedores que fornecem peça
Select Distinct id_peca From fornecimento;
Recuperação simples de toda a tabela. Obter todas as
informações dos fornecedores
Select * From Fornecedor;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Recuperação qualificada: Obter a identificacao dos fornecedores de
SP com status > 20.
Select codigo, nome
From fornecedor
Where Cidade =’sp’ and status > 20;
Obs: A condição ou predicado que segue WHERE pode incluir os
operadores comparativos =, >, <, >=, <=, <> e os operadores lógicos
AND, OR, NOT.
Recuperação com Ordenação: Obter a identificação e o
status de fornecedores de SP, na ordem decrescente de status.
Select codigo, Status
From fornecedor Where cidade = ‘sp’
Order by status desc;
Prof. Luiz Vivacqua
SQL - CONSULTAS
CONSULTA COM JUNÇÃO : RECUPERA DADOS DE
MAIS DE UMA TABELA.
Obter o nome dos fornecedores que fornecem peças.
Select distinct nome
From Fornecedor, Fornecimento
Where Fornecedor.codigo=id_forn;
Junção com condição adicional: Obter o nome do fornecedor
que fornece a peça P3.
Select distinct nome
From Fornecedor, Fornecimento
Where Fornecedor.codigo=id_forn
and id_peca=´p3´;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Junção de três tabelas: Obter o nome das peças que são fornecidas
por fornecedores do RJ
Select Distinct P.nome
From fornecedor S, peca P, fornecimento SP
Where S.codigo = id_forn
and P.codigo = id_peca
and S.cidade=´rio´;
Inner Join
Obter o nome dos fornecedores que fornecem peças.
Select distinct nome
From Fornecedor INNER JOIN Fornecimento
ON fornecedor.codigo = id_forn;
Prof. Luiz Vivacqua
SQL - CONSULTAS
LEFT JOIN
Obter o nome dos fornecedores e
a qtde fornecida de peças
inclusive dos que não fazem fornecimento
Select nome, qtde
From Fornecedor LEFT JOIN Fornecimento
ON fornecedor.codigo = id_forn;
RIGHT JOIN – O inverso do Left join
Obter o nome das peças e o nome dos
fornecedores na mesma cidade inclusive
os fornecedores em outras cidades
select P.nome, F.nome
from peca P RIGHT JOIN fornecedor F
ON P.cidade=F.cidade
Prof. Luiz Vivacqua
SQL - CONSULTAS
Full Join – Left Join + Right Join
Select P.nome, F.nome, P.cidade, F.cidade
from peca P FULL JOIN fornecedor F
ON P.cidade=F.cidade
Prof. Luiz Vivacqua
SQL - CONSULTAS
Funções embutidas
COUNT – retorna o número de linhas na tabela.
SUM – retorna a soma dos valores na coluna que tem que ser
numérica.
AVG – retorna a média de valores na coluna que tem que ser
numérica.
MAX – retorna o maior valor na coluna.
MIN – retorna o menor valor na coluna.
Obter o número total de fornecedores.
Select count(*) From fornecedor;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter o número de fornecedores que fornecem peças
Select count(DISTINCT id_forn)
From fornecimento;
Obter o número de fornecimentos para a peça P2.
Select count(*)
From Fornecimento
Where id_peca = ‘p2’
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter a quantidade total de peças P2 fornecidas.
Select SUM(Qtde)
From fornecimento
Where id_peca = ‘p2’;
Uso do Group By
A cláusula group by pode ser usada em conjunto com
funções de forma de agrupar o resultado segundo uma
ou mais colunas.
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter a quantidade total de cada peça fornecida.
Select id_peca, SUM(Qtde)
From fornecimento
Group by id_peca;
Uso do having
A cláusula having funciona para os Grupos assim como o
Where para linhas.
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter a identificação da peça e a soma das quantidades fornecidas
de todas as peças fornecidas com qtde > 500.
Select id_peca, SUM(Qtde)
From fornecimento
Group by id_peca
Having SUM(Qtde) > 500;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Recuperação com Like
_ vale para qq caracter
% vale para qq sequência de n caracteres onde n pode ser 0.
Negação – Not Like
Obter a identificação e a cor das peças cujos nomes começam
com a letra “R”.
Select codigo, cor
From Peca
Where nome like ‘r%';
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter a identificação, peso e cor das peças cujos nomes começam
com a letra “r”, tem “b” na terceira letra e terminam com “e”.
Select codigo, peso, cor
From Peca
Where nome like ‘r_b%e';
Recuperação com NULL
Usado para testar a presença ou ausência de valores nulos.
Obter a identificação dos fornecedores com status igual a nulo.
Select codigo
From fornecedor
Where status IS NULL;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Recuperação com Subconsulta
❑Subconsulta é uma expressão SELECT FROM WHERE aninhada dentro de
uma cláusula WHERE ou HAVING.
❑É executada uma vez antes da execução da consulta externa
Obter os nomes dos fornecedores que fornecem a peça P2.
Select distinct nome
From fornecedor
Where codigo IN (Select id_forn
From fornecimento
Where id_peca = ‘p2’);
Prof. Luiz Vivacqua
SQL - CONSULTAS
Subconsulta com vários níveis de aninhamentos.
Obter os nomes dos fornecedores que forneçam pelo menos
uma peça verde.
Select distinct nome
From fornecedor
Where codigo IN (Select id_forn
From fornecimento
Where id_peca IN (Select codigo
From Peca
where cor = 'verde'));
Prof. Luiz Vivacqua
SQL - CONSULTAS
Subconsulta c/ operador diferente de IN
Obter a identificação e o nome dos fornecedores localizados na
mesma cidade que o fornecedor S1
Select codigo, nome
From fornecedor
Where cidade = (Select cidade
From fornecedor
Where codigo = ‘s1’);
Prof. Luiz Vivacqua
SQL - CONSULTAS
Função numa subconsulta
Obter o nome e a cidade dos fornecedores cujo status seja inferior
ao maior status existente.
Select nome, cidade
From fornecedor
Where status < (Select MAX(status)
From fornecedor);
Prof. Luiz Vivacqua
SQL - CONSULTAS
Subconsulta correlacionada:
❑Uma subconsulta correlacionada referencia uma ou mais colunas
na instrução SQL externa.
❑Usado quando se precisa de uma resposta para uma pergunta que
depende de um valor em cada linha contida em uma consulta
externa
❑É executada uma vez para cada linha na consulta externa
❑O operador EXISTS verifica a existência de linhas retornadas por uma
Subconsulta. Embora possa ser usado em subconsultas não correlacionadas,
geralmente é usado neste tipo de subconsulta.
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter o nome dos fornecedores que fizeram fornecimento
Select codigo, nome from fornecedor T1
Where EXISTS (select 1
from fornecimento T2
where T2.id_forn = T1.codigo);
Obs: Como EXISTS apenas verifica
A existência de linhas retornadas pela
subconsulta, uma subconsulta não
precisa retornar uma coluna, ela pode
retornar um valor literal, melhorando
o desempenho
Prof. Luiz Vivacqua
SQL - CONSULTAS
Obter o nome dos fornecedores que não fizeram fornecimento
select nome from fornecedor T1
where NOT EXISTS (select 1
FROM fornecimento T2
where T1.codigo = T2.id_forn)
Forma negativa:
Prof. Luiz Vivacqua
SQL - CONSULTAS
Dicas:
❑ Normalmente, EXISTS oferece um desempenho melhor
do que IN em subconsultas.
❑Quando uma lista de valores contem um valor nulo, NOT EXISTS
retorna verdadeiro, mas NOT IN retorna falso
Exemplo:
Insert into fornecimento values(13, null, ‘p1’,300)
Select nome from fornecedor T1where NOT EXISTS (select 1
FROM fornecimento T2
where T1.codigo = T2.id_forn)
Select nome from fornecedor
where codigo NOT IN (select id_forn
FROM fornecimento)
Prof. Luiz Vivacqua
SQL - CONSULTAS
select nome from fornecedor where cidade NOT IN('sp');
select nome from fornecedor where cidade NOT IN('sp‘, null);
Prof. Luiz Vivacqua
SQL - CONSULTAS
Operadores de conjunto
Combinam os resultados das consultas que devem ter o mesmo
número de colunas com o mesmo tipo de dados.
Union
É o operador de união da teoria de conjuntos tradicionais. O resultado
é a união dos resultados da cada consulta. As duplicidades são
sempre eliminadas.
Obter a identificação das peças que pesam mais de 15 ou
que são fornecidas por S2.
Select codigo
From Peca
Where peso > 15
UNION
Select id_peca
From fornecimento
Where id_forn = ‘S2’;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Consulta com Intersect
É o operador de interseção de conjuntos. O resultado é a interseção
dos resultados da cada consulta.
Obter as cidades onde existam fornecedores e peças.
Select cidade
From fornecedor
INTERSECT
Select cidade
From Peca;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Consulta com EXCEPT
É o operador de subtração de conjuntos. O resultado apresenta as
linhas da primeira consulta que não estão na segunda consulta.
Obter as cidades onde existam fornecedores e que não existam peças.
Select cidade
From fornecedor
EXCEPT
Select cidade
From Peca;
Prof. Luiz Vivacqua
SQL - CONSULTAS
Usando a expressão CASE
Similar ao IF...THEN...ELSE de outras linguagens
CASE WHEN CONDIÇÃO THEN RESULTADO
[WHEN ...]
[ELSE RESULT]
END
CONDIÇÃO é uma expressão que retorna um boleano
Se a cláusula ELSE for omitida e nenhuma condição for verdade
o resultado é NULO.
Prof. Luiz Vivacqua
SQL - CONSULTAS
EXEMPLOS:
Select codigo,status,
Case Status
WHEN 10 Then 'OTIMO'
WHEN 20 Then 'BOM'
WHEN 30 Then 'REGULAR'
ELSE 'RUIM'
End
From Fornecedor;
Expressão CASE pesquisada
Select codigo, status,
Case
WHEN status=10 THEN ‘ÓTIMO’
WHEN status=20 THEN ‘BOM’
WHEN status=30 THEN ‘REGULAR’
ELSE ‘RUIM’
End
From Fornecedor;