Banco de Dados
Aula 07 – Subconsultas (subquery)
Prof. Ícaro Lins Iglesias
IF Farroupilha – Câmpus São Borja
Subconsultas
• Uma subconsulta é uma consulta aninhada. Sendo assim, é
realizada uma pesquisa com base no resultado da outra.
Então, para ser uma subconsulta teremos que ter pelo menos
dois select’s encadeados. Um que a partir de comparações
trará os resultados e o outro que os usará como parâmetro
para confrontar os dados e ver quem será exibido ao final da
execução.
• As subconsultas, chamadas também de subquery ou
subselect, podem ser aplicadas para visualizar, adicionar,
atualizar e excluir registros nas tabelas.
• As subconsultas podem ser escalares (retornar apenas uma
linha) ou tabulares (linhas e colunas)
• É possível obter apenas uma coluna por subconsulta
• Uma subconsulta pode conter outras subconsultas aninhadas
Subconsultas: [NOT] IN,
Operadores Relacionais
• Neste caso, uma subconsulta terá como resultado
uma lista de zero ou mais valores. Seu resultado
será utilizado pela consulta mais externa.
• SINTAXE
WHERE <expressão> [<operador_relacional>]
[[NOT] IN](subconsulta)
Onde:
• expressão: valor a ser comparado
• operador_relacional: =, <>, >=, <=, !=
• subconsulta: consulta que resulta uma coluna para
comparação com a expressão
Exemplo IN (tabulares)
Exemplo: Apresente o código, nome e endereço dos clientes que
fizeram pedidos no 2º. Semestre de 2012.
SELECT IDCLIENTE, NOME, ENDERECO
FROM CLIENTE
WHERE IDCLIENTE IN(SELECT IDCLIENTE FROM PEDIDO WHERE
DATA_PEDIDO BETWEEN '2012-06-01' AND '2012-12-31');
• SINTAXE
WHERE
<expressão>[NOT]EXISTS](subconsulta)
Onde:
• expressão: valor a ser comparado
• subconsulta: consulta que resulta uma coluna
para comparação com a expressão
Exemplo [NOT] EXISTS
Exemplo: Apresente o código e nome dos vendedores que fizeram
pedidos em mar/2013.
SELECT IDVENDEDOR, NOME
FROM VENDEDOR AS V WHERE EXISTS(
SELECT * FROM PEDIDO AS P
WHERE P.IDVENDEDOR = V.IDVENDEDOR
AND DATA_PEDIDO BETWEEN '2013-03-01' AND '2013-03-31');
UPDATE VENDEDOR_TOP
SET BONUS = 200
WHERE IDVENDEDOR_TOP IN (
SELECT V.IDVENDEDOR
FROM VENDEDOR AS V INNER JOIN PEDIDO AS P
ON V.IDVENDEDOR = P.IDVENDEDOR
AND P.DATA_PEDIDO BETWEEN ‘2015-01-01’ AND ‘2015-12-31’
GROUP BY V.IDVENDEDOR
HAVING COUNT(*) >= 5);
Exemplo: UPDATE c/ SELECT
Resultado obtido após os comando de atualização:
Exclusão de registros com
SELECT
• Por fim, também é possível excluir os registros de uma
tabela baseando-se no resultado de uma sobconsulta
• Para isso, precisamos combinar os comandos DELETE e
SELECT.
SINTAXE
DELETE FROM <nome da tabela>
WHERE <condição> (
SELECT <nome(s) da coluna(s)>
FROM <nome da tabela>
WHERE <condição>);
Exemplo: DELETE c/ SELECT
Excluir os itens de pedidos realizados pelo vendedor 1 com prazo
de entrega igual a 7 dias.
DELETE FROM ITEMPEDIDO
WHERE IDPEDIDO IN (
SELECT IDPEDIDO
FROM PEDIDO AS P
WHERE P.prazo_entrega = 7
AND P.IDVENDEDOR = 1);