Escolar Documentos
Profissional Documentos
Cultura Documentos
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
SELECT ...
FROM ...
WHERE ... ... (SELECT...
FROM ...
WHERE...)
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;
COUNT para 1163 COUNT para 1164 COUNT para 1165 COUNT para 1167
3 2 1 0
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.
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.
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
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
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