Você está na página 1de 21

Subconsultas em SQL

Subconsulta
Estrutura geral SELECT .... FROM .... WHERE [at] OPERADOR ( SELECT ... FROM ... [WHERE ... ]) Declarao SELECT localizada dentro de outra declarao SELECT

Subconsulta
Recurso anteriormente utilizado(PLEW) 1. Inexistncia anterior de juno externa 2. Desempenho ruim das ligaes internas

Subconsulta
Preterida devido: 1. Adio de juno externa no SQL-99 2. Melhora do processamento de juno interna 3. Pouca legibilidade no cdigo com subconsulta ( leitura/ manuteno)

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 possveis: 1. Um valor nico 2. Lista de valores O resultado da subconsulta deve estar dentro da declarao da consulta externa.

Subconsultas: retorno de lista


WHERE + emprego de IN / NOT IN
Tab. Func
Num_func 2 4 6 8 10 12 14 16 18 20 Nome_func Maria Joao Antonio Alex Roberto Graa Leila Clea Ane Cintia Null

Tab. Est
Num_Est 3 6 9 12 15 18 Nome_Est Tarso Antonio Nair Graa Quenia Ane Null

Subconsulta: retorno de lista


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

Antonio

12 18

Graa Ane

Equivale a uma juno interna !

Subconsulta: retorno de lista


Ocorrncias de Func onde num_func NO 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 funes de agregao. Operadores possveis:

= < <= > >= IN | NOT IN BETWEEN

Subconsulta correlativas
Qualquer consulta que contm uma referncia para tabela da consulta externa. No pode ser avaliada antes da consulta externa. PLEW cita como modalidade mais antiga.

Subconsulta com Exists


WHERE + exists ( correlativa) Reserva um espao 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 ligao 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

Exerccio
Compare a) e b) e justifique a diferena. 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
Equivalncia com conjuntos matemticos 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.

Exerccio
Testes de operadores com sub-consultas

1) Selecionar dados de produto se houver qualquer ocorrncia de custo superior a 100. ( exists) 2) Selecionar se o salrio de um funcionrio ( que vc escolhe ) nico. ( unique) 3) Listar dados para todos os salrios 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