Você está na página 1de 21

Laboratório de

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');

1) Resultado query mais interna: uma


coluna, muitas linhas (tabular)

2) Resultado query externa


Exemplo NOT IN (tabulares)
Exemplo: Apresente o código e nome dos vendedores que NÃO
realizaram pedidos no 1º. Semestre de 2014.
SELECT IDVENDEDOR, NOME
FROM VENDEDOR WHERE IDVENDEDOR NOT IN
(SELECT DISTINCT(IDVENDEDOR)FROM PEDIDO WHERE
DATA_PEDIDO BETWEEN '2014-01-01' AND '2014-06-30');

1) Resultado query mais interna: uma


coluna, muitas linhas (tabular)

2) Resultado query externa


Exemplo Operadores
Relacionais (escalares)
Exemplo: Apresente o código, descrição e valor unitário dos
Processadores Intel com preço abaixo da média do seu grupo.
SELECT IDPRODUTO, DESCRICAO, VLR_UNITARIO
FROM PRODUTO WHERE DESCRICAO LIKE 'PROC%INTEL%' AND
VLR_UNITARIO < (SELECT AVG(VLR_UNITARIO)FROM PRODUTO
WHERE DESCRICAO LIKE 'PROC%INTEL%');

1) Resultado query mais interna:


única linha (escalar)

2) Resultado query externa


Exemplo Operadores
Relacionais (escalares)
Exemplo: Apresente o funcionário mais bem pago do sistema.

SELECT NOME, SALARIO


FROM VENDEDOR
WHERE SALARIO =
(SELECT MAX(SALARIO)
FROM VENDEDOR);

1) Resultado query mais interna:


única linha (escalar)

2) Resultado query externa


Subconsultas: [NOT]
EXISTS
• O operador EXISTS é utilizado para verificar se o
resultado de uma subconsulta possui algum registro, ou
seja, ele retorna verdadeiro (true) se a subconsulta
encontrar algum registro que a satisfaça.

• 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');

1) Resultado query mais interna:


lista com valores duplicados

2) Resultado query externa:


resultado sem duplicidades
Solução com outros operadores
Outras consultas que retornariam o mesmo resultado:

SELECT IDVENDEDOR, NOME


FROM VENDEDOR AS V WHERE IDVENDEDOR IN
(SELECT IDVENDEDOR FROM PEDIDO AS P
WHERE DATA_PEDIDO
BETWEEN '2013-03-01' AND '2013-03-31');

SELECT DISTINCT V.IDVENDEDOR, V.NOME


FROM VENDEDOR AS V INNER JOIN PEDIDO AS P
ON (P.IDVENDEDOR = V.IDVENDEDOR)
AND DATA_PEDIDO
BETWEEN '2013-03-01' AND '2013-03-31';
Adição de registros com
SELECT
• A linguagem SQL permite que sejam adicionados
registros mediante o resultado obtido de uma consulta
mais interna (subconsulta).
• Para isso, precisamos combinar os comandos INSERT e
SELECT.
SINTAXE
INSERT INTO <nome da tabela>[(nome
da(s) coluna(s))]
SELECT <nome(s) da coluna(s)>
FROM <nome da tabela>
WHERE <condição>;
Exemplo: INSERT c/ SELECT
Criando uma nova tabela para armazenar os vendedores que
efetuaram 5 ou mais pedidos no ano de 2015.
CREATE TABLE VENDEDOR_TOP(
IDVENDEDOR_TOP SMALLINT NOT NULL,
NOME VARCHAR(45) NOT NULL,
PEDIDOS SMALLINT NULL,
ANO_REFERENCIA CHAR(4) DEFAULT ‘2015’ NULL,
PRIMARY KEY (IDVENDEDOR_TOP));

INSERT INTO VENDEDOR_TOP (IDVENDEDOR_TOP, NOME,


PEDIDOS)
SELECT V.IDVENDEDOR, V.NOME, COUNT(*)
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: INSERT c/ SELECT
Resultado obtido após os comando de adição:

Coluna ANO_REFERENCIA mesmo não sendo informada na


cláusula INSERT acabou sendo preenchida com seu valor
DEFAULT (2015).
Atualização de registros com
SELECT
• Assim como na adição, é possível atualizar os registros
de uma tabela baseando-se no resultado de uma
sobconsulta
• Para isso, precisamos combinar os comandos UPDATE e
SELECT.
SINTAXE
UPDATE <nome da tabela>
SET <nome da(s) coluna(s) = valor(es)>
WHERE <condição> (
SELECT <nome(s) da coluna(s)>
FROM <nome da tabela>
WHERE <condição>);
Exemplo: UPDATE c/ SELECT
Acrescentar um bônus de R$ 200,00 para os vendendores que
efetuaram 5 ou mais pedidos em 2015.

ALTER TABLE VENDEDOR_TOP ADD BONUS DECIMAL(7,2) NULL;

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);

Lista dos pedidos que


atendem a condição
(subconsulta). Resultado nulo obtido após a execução do
comando DELETE c/ SELECT.
Exercício 1: BD de estudo

SQL DDL e DML da BD no Datafilelabs!


Lista exercícios 1
• Considerando a BD de estudo, apresente consultas SQL
capazes de atender consultas como (obrigatório o uso de
subquerys):
1. Os vôos cujas escalas são todas em aviões diferentes
2. O salário do piloto mais bem pago da companhia TAM
3. Nome dos pilotos que ganham menos que a média salarial
da sua categoria
4. As companhias que não voam de aeronave MD11
5. As companhias que só voam de Boeing 727
6. Nome dos pilotos que voam de MD11 ou de Boeing 727
7. Nome dos pilotos que voam de Fokker 100 e não voam de
Boeing 727
8. Nome dos pilotos que trabalham para companhias que
empregam pelo menos dois pilotos
Lista exercícios 2
• Baseado na BD dbvendas:
1. Crie uma nova tabela chamada ITENS_VENDIDOS, contendo
o 1) id do produto, 2) uma coluna para armazenar seu
quantitaivo vendido e 3) outra coluna para classificar estes
quantitativos : A-alto, R-regular, B-baixo(char(1), valor default
“R” ).
2. Insira nesta tabela a soma dos itens de pedidos realizados
durante o ano de 2013 (jan a dez).
3. Nesta nova tabela criada, atualize a coluna de
classificação, respeitando os seguintes critérios com relação
ao somatório dos produtos inseridos: Baixo ( <=50), Regular
(>50<100), Alto (>100).
4. Ainda nesta tabela, exclua os produtos que possuem em seu
estoque (tabela de PRODUTOS original) um quantitativo
superior a 20 unidades.

Você também pode gostar