Você está na página 1de 31

Projeto de Banco de Dados

Laboratório de Banco de Dados


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
Prof.A.Luiz
Vivacqua
Vivacqua
C. Meyer
SQL - CONSULTAS
Peça

Fornecimento

Fornecedor

Prof. Luiz
Prof.A.Luiz
Vivacqua
Vivacqua
C. Meyer
SQL - CONSULTAS

Recuperação Simples: Obter a identificação de todas as


peças fornecidas.
Select id_peca
from fornecimento;

Prof. Luiz Vivacqua


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
Prof.A.Luiz
Vivacqua
Vivacqua
C. Meyer
SQL - CONSULTAS
Recuperação qualificada: Obter a identificacao dos fornecedores de
SP com status > 20.
Select id, 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 id, 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.id=id_forn;

Junção com condição adicional: Obter o nome do fornecedor


que fornece a peça P2.
Select distinct nome
From Fornecedor, Fornecimento
Where Fornecedor.id=id_forn
and id_peca=´p2´;

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 Peca.nome
From fornecedor S, peca P, fornecimento SP
Where S.id = id_forn
and P.id = id_peca
and S.cidade=´rj´;

Inner Join
Obter o nome dos fornecedores que fornecem peças.
Select distinct nome
From Fornecedor INNER JOIN Fornecimento
ON fornecedor.id = 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.id = 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 id, 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 id, 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 id
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 id 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 id IN (Select id_forn
From fornecimento
Where id_peca IN (Select id
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 id, nome
From fornecedor
Where cidade = (Select cidade
From fornecedor
Where id = ‘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 id, nome from fornecedor T1


Where EXISTS (select 1
from fornecimento T2
where T2.id_forn = T1.id);

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

Forma negativa:

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.id = T2.id_forn)

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 T1
where NOT EXISTS (select 1
FROM fornecimento T2
where T1.id = T2.id_forn)

Select nome from fornecedor


where id 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 id
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 Id,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 Id, status,
Case
WHEN status=10 THEN ‘ÓTIMO’
WHEN status=20 THEN ‘BOM’
WHEN status=30 THEN ‘REGULAR’
ELSE ‘RUIM’
End
From Fornecedor;

Prof. Luiz Vivacqua