Você está na página 1de 21

Subconsultas em SQL

Subconsulta
• Estrutura geral
SELECT .... FROM ....
WHERE [at] OPERADOR
( SELECT ... FROM ... [WHERE ... ])
• Declaração SELECT localizada dentro de
outra declaração SELECT
Subconsulta
• Recurso anteriormente utilizado(PLEW)
1. Inexistência anterior de junção externa
2. Desempenho ruim das ligações internas
Subconsulta
• Preterida devido:
1. Adição de junção externa no SQL-99
2. Melhora do processamento de junção
interna
3. Pouca legibilidade no código com
subconsulta ( leitura/ manutenção)
Sintaxes
SELECT * FROM TABELA1[, TABELA2]
WHERE
• [  [NOT]  EXISTS ( subconsulta) ]
• [ [NOT]  UNIQUE ( subconsulta)]
• [ atributo > | < | >= |<=  ALL ( subconsulta)]
• [ atributo > | < | >= |<=  ANY ( subconsulta)]
• [ atributo [,atributo2]  [NOT]  IN  ( subconsulta ) ]
Subconsulta
SELECT descricao , preco FROM comida
WHERE preco <
( SELECT AVG(preco) FROM comida)
Processamento de Subconsulta
SELECT descricao , preco FROM comida
WHERE preco < ( SELECT AVG(preco) FROM comida)

• ( SELECT AVG(preco) FROM comida)

(200)
2. SELECT descricao , preco FROM comida
WHERE preco < (200)
Subconsultas
que retornam de lista de valores
• Dois casos possíveis:
1. Um valor único
2. Lista de valores

O resultado da subconsulta deve estar dentro


da declaração da consulta externa.
Subconsultas: retorno de lista
• WHERE + emprego de IN / NOT IN
Tab. Func Tab. Est
Num_func Nome_func Num_Est Nome_Est
2 Maria 3 Tarso
4 Joao 6 Antonio
6 Antonio 9 Nair
8 Alex 12 Graça
10 Roberto 15 Quenia
12 Graça 18 Ane
14 Leila Null
16 Clea
18 Ane
20 Cintia
Null
Subconsulta: retorno de lista
• Ocorrências de Func onde num_func
liga-se com valor da coluna num_est ( Est)
SELECT num_func, nome_func FROM func
WHERE num_func IN ( select num_est FROM est)

SELECT num_func, nome_func FROM func


WHERE num_func IN ( 3, 6, 9 , 12, 15, 18, null)

6 Antonio
Equivale a uma junção interna !
12 Graça
18 Ane
Subconsulta: retorno de lista
• Ocorrências de Func onde num_func
NÃO se ligam com nenhum valor da coluna num_est ( Est)
SELECT num_func, nome_func FROM func
WHERE num_func NOT IN
( select num_est FROM est )

SELECT num_func, nome_func FROM func


WHERE num_func IN ( 3, 6, 9 , 12, 15, 18)
Subconsultas com retorno de
valor único
Uma forma de assegurar o retorno de valor único é o
emprego de funções de agregação.
Operadores possíveis:
• =  < <= > >=
• IN | NOT IN
• BETWEEN
Subconsulta correlativas
• Qualquer consulta que contém uma
referência para tabela da consulta externa.
• Não pode ser avaliada antes da consulta
externa.
• PLEW cita como modalidade mais antiga.
Subconsulta com Exists
• WHERE + exists ( correlativa)
• Reserva um espaço separado para cada linha da
tabela na consulta externa.
select num_matricula, nome from aluno
Sem atributo
where exists
( select distinct num_matricula from nota_aluno_disciplina)
Subconsulta para ligação externa
• Empregar NOT EXISTS
SELECT a.num_func, a.nome_func, b. num_est, b. nome_est
FROM func a, est b
WHERE a.num_func = b. num_est
UNION ALL
SELECT a.num_func, a.nome_func, null, null
FROM func a
WHERE NOT EXISTS( select b.num_est FROM est
WHERE a.num_func = b. num_est)
Operadores para subconsultas
• > >= < <= < >
• EXISTS
• IN/ NOT IN
• > >= < <= <>ALL
• > >= < <= <> ANY
• <>ALL equivale a NOT INT
• IN equivale a =ANY
Exercício
Compare a) e b) e justifique a diferença.
a) select num_matricula, nome from aluno
where exists
( select distinct num_matricula from nota_aluno_disciplina)

b) select num_matricula, nome from aluno


where num_matricula in
( select distinct num_matricula from nota_aluno_disciplina)
Operadores de Conjuntos
• Equivalência com conjuntos matemáticos
• UNION/ UNION ALL
• INTERSECT CORRESPONDING BY
• EXCEPT
Subconsultas com operadores de
conjuntos
• Tratamento de consultas como conjuntos
consulta 1
UNION [ALL] | INTERSECT | EXCEPT | MINUS
consulta 2
 
* As consultas devem ter a mesma quantidade e
mesmo tipo de campos como retorno para efetuar
esses comandos.
Exercício
• Testes de operadores com sub-consultas

• 1) Selecionar dados de produto se houver qualquer


ocorrência de custo superior a 100. ( exists)
• 2) Selecionar se o salário de um funcionário ( que vc
escolhe ) é único. ( unique)
• 3) Listar dados para todos os salários de uma cidade.
( ALL).
• 4) Selecionar todos os dados dos produtos com  o custo
maior que 10. ( ALL)
• 5) Selecionar o qualquer produto custo com custo maior
que 10. ( ANY)

Você também pode gostar