Sub-consultas SQL
Uma sub-consulta é uma instrução SELECT aninhada dentro de outra instrução SELECT, INSERT, DELETE ou UPDATE. Veja abaixo alguns exemplos de sintaxe:
- Comparação [ANY|SOME|ALL] (instrução sql)
- Expressão [NOT] IN (instrução sql)
- Expressão [NOT] EXISTS (instrução sql)
Os predicados ANY e SOME, sinônimos, são utilizados para recuperar registro na consulta principal que satisfaçam a comparação com qualquer registro da sub-consulta.
Tabela A
X | Y |
1 | 5 |
2 | 9 |
3 | 10 |
4 | 6 |
Tabela B
Exemplo:
Listagem 11: Exemplo de subconsulta
Resultado:
X | Y |
3 | 10 |
Os registros da tabela A que forem maior do que qualquer registro do resultado da sub-consulta serão selecionados. Repare que nenhum registro da tabela A é maior do que 11, no entanto, o terceiro registro é maior do que 9.
Vamos a outro exemplo:
Listagem 12: Exemplo de subconsulta com o operador ANY
Resultado:
X | Y |
1 | 5 |
2 | 9 |
3 | 10 |
4 | 6 |
Todos os registros foram selecionados porque o valor de y no resultado da sub-consulta assume 3, que é menor do que todos os valores de y da tabela A. Se utilizarmos o ANY com sinal de igualdade teremos o mesmo resultado da cláusula IN. Exemplo:
Listagem 13: Exemplo com o operador ANY e sinal de igualdade
Resultado:
X | Y |
2 | 9 |
O predicado ANY também pode ser utilizado em conjunto com os comandos UPDATE e DELETE. Veja o exemplo:
Listagaem 14: Update usando o operador ANY
Listagem 15: Delete usando o operador ANY
O predicado ALL é utilizado para recuperar os registros da consulta principal que satisfaçam a comparação com todos os registros recuperados na sub-consulta. Observe os exemplos:
Listagem 16: Exemplo de select com operador ANY
Resultado:
X | Y |
Listagem 17: Outro exemplo de select com operador ANY
X | Y |
3 | 10 |
O uso de != ALL equivale a NOT IN.
Listagem 18: Subconsulta com operador ALL
Resultado:
X | Y |
1 | 5 |
3 | 10 |
4 | 6 |
O predicado IN é utilizado para recuperar apenas os registros na consulta principal que contém equivalência na sub-consulta. É o mesmo que =ANY.
Listagem 19: Consulta com operador IN
Resultado:
X | Y |
2 | 9 |
No código a seguir retornamos os empregados que venderam um montante maior que R$ 50.000,00.
Listagem 20: Select com operador IN utilizando HAVING
De maneira contrária, NOT IN pode ser utilizado para recuperar apenas os registros na consulta principal para os quais não exista equivalência na sub-consulta.
Listagem 21: Select com operador NOT IN
Resultado:
X | Y |
1 | 5 |
3 | 10 |
4 | 6 |
O predicado EXISTS determina se a sub-consulta retorna algum registro. Esta cláusula produz resultados semelhantes ao uso de IN. Veja exemplo:
Listagem 22: Consulta com operador EXISTS
Neste comando são retornados o nome e o departamento dos funcionários cuja soma de vendas ultrapassaram R$ 50.000,00.
O predicado NOT EXISTS também pode ser utilizado produzindo o efeito contrário:
Listagem 23: Consulta com operador NOT EXISTS
Conclusão
Referências
- Slides do professor Daniel Wildt da Universidade Federal do Rio Grande do Sul
- BATTISTI,
- Julio. SQL SERVER 2005 ADMINISTRAÇÃO E DESENVOLVIMENTO
Fonte(linhadecodigo)