Você está na página 1de 18

BANCO DE DADOS II

Subconsultas SQL

“Se você tem uma maçã e eu tenho outra; e nós trocamos as maçãs,
Profº: Joseph Donald então cada um terá sua maçã. Mas se você tem uma ideia e eu tenho
outra, e nós as trocamos; então cada um terá duas ideias.”
Contatos:
joseph.vieira@facape.br
George Bernard Shaw
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL

• Existem consultas cuja implementação envolve o uso de


informações retornadas por outras consultas.

• Em alguns casos, essa demanda por ser resolvida por consultas


aninhadas, ou subconsultas.

• Subconsultas são blocos SELECT-FROM-WHERE especificados


dentro de uma cláusula WHERE, de forma adequada.
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL

• Desta forma, subconsulta é um comando SELECT dentro da


cláusula WHERE de outro comando SQL mais externo.

• O comando SQL externo pode ser um SELECT, UPDATE ou DELETE.

• Uma subconsulta faz parte de uma condição de seleção.

• Determina a condição de seleção da cláusula WHERE do comando


mais externo.
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL

SELECT ...
FROM ...
WHERE ... ... (SELECT...
FROM ...
WHERE...)
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL

Recupere os nomes de todos os funcionários que possuem dois


ou mais dependentes.

SELECT nome FROM funcionario WHERE (


SELECT COUNT(*) FROM DEPENDENTE WHERE id_func = id_func_fk
) >= 2;
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL

SELECT nome
FROM FUNCIONARIO
WHERE ( SELECT COUNT (*)
FROM DEPENDENTE
WHERE id_func = id_func_fk) >= 2;

A consulta retorna uma única tupla com


um valor inteiro (referente à contagem).
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL
FUNCIONARIO DEPENDENTE
id_dep nome func_id
id_func nome ...
1 Amanda 1163
1163 Claudia ...
2 Fabio 1164
1164 Jorge ... 3 Alan 1165
1165 Moacir ... 4 Henrique 1163
1167 Caio ... 5 Pedro 1164
6 Claudia 1163

COUNT para 1163 COUNT para 1164 COUNT para 1165 COUNT para 1167

3 2 1 0

>= 2 Verdadeiro >= 2 Verdadeiro >= 2 Falso >= 2 Falso


Banco de Dados II
Subconsultas SQL usando ANY Profº: Joseph Donald

O operador ANY retorna VERDADEIRO se algum dos valores da subconsulta atender à


condição.

O comando a seguir retorna a lista com o nome e salário de todos os salários maiores que o
menor salário dos funcionários do departamento 5.

SELECT nome, salario


FROM funcionario WHERE salario > ANY( SELECT salario
FROM funcionario
WHERE id_depart = 5);
Banco de Dados II
Subconsultas SQL usando ALL Profº: Joseph Donald

O operador ALL retorna VERDADEIRO se todos os valores da subconsulta


atenderem à condição.

A query a seguir retorna o maior salário em toda a tabela dentre todos encontrados no
departamento 2;

SELECT nome
FROM FUNCIONARIO
WHERE salario >= ALL ( SELECT salario
FROM FUNCIONARIO
WHERE id_depart = 2 ) ;
Banco de Dados II
Profº: Joseph Donald
Subconsultas SQL usando IN
O operador IN permite que você especifique vários valores em uma cláusula
WHERE.
O operador IN é uma abreviação para várias condições OR.

Encontre os nomes de cada funcionário que possui um dependente com o


mesmo nome que ele e do mesmo sexo que o dele.

SELECT nome
FROM FUNCIONARIO AS F
WHERE F.id_func IN ( SELECT id_func_fk
FROM DEPENDENTE AS D
WHERE F.nome = D.nome
AND F.sexo = D.sexo );
Banco de Dados II
Subconsultas SQL Profº: Joseph Donald
DEPENDENTE
FUNCIONARIO id nome sexo id_func_fk
id nome sexo 1 1163
Amanda F
1163 Claudia F 2 1164
Fabio M
1164 Jorge M 3 1165
Alan M
1165 Moacir M 4 1163
Henrique M
1167 Caio M 5 1164
Pedro M
6 Claudia F 1163
SELECT nome
FROM FUNCIONARIO AS F
WHERE F.id_func IN ( SELECT id_func_fk
FROM DEPENDENTE AS D
WHERE F.nome = D.nome
AND F.sexo = D.sexo );
Banco de Dados II
Subconsultas SQL usando EXISTS Profº: Joseph Donald

• O operador EXISTS é usado para testar a existência de qualquer registro em uma subconsulta.
• Ele retorna VERDADEIRO se a subconsulta retornar um ou mais registros.

A query a seguir encontra os nomes de cada funcionário que possui um dependente com o mesmo
nome que ele e do mesmo sexo que o dele.

SELECT nome
FROM FUNCIONARIO AS F
WHERE EXISTS ( SELECT *
FROM DEPENDENTE AS D
WHERE F.id_func = D.id_func_fk
AND F.nome = D.nome
AND F.sexo = D.sexo);
Banco de Dados II
Subconsultas SQL Profº: Joseph Donald
DEPENDENTE
FUNCIONARIO id nome sexo id_func_fk
1 Amanda F 1163
id nome sexo ...
2 Fabio M 1164
1163 Claudia F ...
3 Alan M 1165
1164 Jorge M ...
4 Henrique M 1163
1165 Moacir M ...
5 Pedro M 1164
1167 Caio M ...
6 Claudia F 1163

EXISTS para 1163 EXISTS para 1164 EXISTS para 1165 EXISTS para 1167

1163 Claudia F ... ∅ ∅ ∅


Verdadeiro Falso Falso Falso
Banco de Dados II
Subconsultas SQL usando NOT EXISTS Profº: Joseph Donald

• NOT EXISTS funciona de forma contrária a EXISTS. A cláusula WHERE em NOT


EXISTS será atendida se nenhuma linha for retornada pela subconsulta.

A query a seguir recupera os nomes dos empregados que não possuem


dependentes.

SELECT nome
FROM FUNCIONARIO F
WHERE NOT EXISTS ( SELECT *
FROM DEPENDENTE
WHERE f.id_func = id_func_fk );
Banco de Dados II
Subconsultas SQL Profº: Joseph Donald

FUNCIONARIO DEPENDENTE
id nome sexo id_func_fk
id nome sexo ...
1 Amanda F 1163
1163 Claudia F ...
2 Fabio M 1164
1164 Jorge M ...
1165 Moacir M ... 3 Alan M 1165
1167 Caio M ... 4 Henrique M 1163
5 Pedro M 1164
NOT EXISTS para 1163 = FALSO 6 Claudia F 1163
1163 Amanda F ...
1163 Henrique M ... NOT EXISTS para 1165 = FALSO
1163 Claudia F ... 1165 Alan M ...

NOT EXISTS para 1164 = FALSO NOT EXISTS para 1167 = VERDADEIRO
1164 Fabio M ...
1164 Pedro M ... ∅
Banco de Dados II
Subconsultas SQL Profº: Joseph Donald

• Subconsultas para UPDATE

UPDATE FUNCIONARIO as F
SET salario = salario * 1.1
WHERE ( SELECT COUNT(*)
FROM DEPENDENTE as D
WHERE id_func = id_func_fk ) >= 2;
Banco de Dados II
Subconsultas SQL Profº: Joseph Donald

• Subconsultas para DELETE

DELETE FROM FUNCIONARIO as F


WHERE f.id_depart_fk IN ( SELECT D.id_depart
FROM DEPARTAMENTO as D
WHERE d.gerente = 1163 ) ;
Exercício Banco de Dados II
Profº: Joseph Donald

Utilizando o banco BD_FACAPE_STORE:

1. Apresente nome e limite de crédito do(s) cliente(s) com maior limite


de crédito.
2. Apresente nome e limite de crédito dos clientes com menor limite de
crédito.
3. Exiba o código e o nome dos clientes que possuem limite de crédito
maior que o valor médio de limite.
4. Mostre o nome dos clientes e todos os dados dos pedidos que
realizaram, cujo valor do pedido esteja abaixo da média dos valores do
pedido.

Você também pode gostar