Upload
internet
View
168
Download
35
Embed Size (px)
Citation preview
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
Null
Cintia20
Ane18
Clea16
Leila14
Graça12
Roberto10
Alex8
Antonio6
Joao4
Maria2
Nome_funcNum_func
Null
Ane18
Quenia15
Graça12
Nair9
Antonio6
Tarso3
Nome_EstNum_Est
Tab. Func Tab. Est
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)
Ane18
Graça12
Antonio6Equivale a uma junção interna !
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
where exists
( select distinct num_matricula from nota_aluno_disciplina)
Sem atributo
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)