Blogger templates

Comunidade java aberto - Participe da nossa comunidade no facebook (clique aqui)

Visitas

sexta-feira, 26 de outubro de 2012

Sub-Consultas SQL (Sub-Select)

,

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
XY
15
29
310
46

Tabela B

X Y 10 4 20 3 30 11 40 9

Exemplo:

Listagem 11: Exemplo de subconsulta
1
2
SELECT * FROM A
WHERE Y > ANY (SELECT Y FROM B WHERE X>20)

Resultado:
XY
310

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
1
SELECT * FROM A WHERE Y > ANY (SELECT Y FROM B WHERE X < 40)
Resultado:
XY
15
29
310
46

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
1
SELECT * FROM A WHERE Y = ANY (SELECT Y FROM B)
Resultado:
XY
29

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
1
2
3
UPDATE A
SET X = X * 10
WHERE Y > ANY (SELECT Y FROM B WHERE X < 40)

Listagem 15: Delete usando o operador ANY
1
2
DELETE FROM A
WHERE Y > ANY (SELECT Y FROM B WHERE X < 40)


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
1
SELECT * FROM A WHERE Y > ALL (SELECT Y FROM B)

Resultado:
XY


Listagem 17: Outro exemplo de select com operador ANY
1
SELECT * FROM A WHERE Y > ALL (SELECT Y FROM B WHERE X > 30)
Resultado:
XY
310


O uso de != ALL equivale a NOT IN.


Listagem 18: Subconsulta com operador ALL
1
SELECT * FROM A WHERE Y != ALL (SELECT Y FROM B)
Resultado:
XY
15
310
46


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
1
SELECT * FROM A WHERE Y IN(SELECT Y FROM B)
Resultado:
XY
29


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
1
2
3
4
SELECT * FROM EMPREGADO WHERE CODIGO IN
(SELECT CODEMPREGADO FROM VENDAS
GROUPY BY CODEMPREGADO
HAVING MAX(VALORTOTAL) > 50000)

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
1
SELECT * FROM A WHERE Y NOT IN(SELECT Y FROM B)

Resultado:
XY
15
310
46


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
1
2
3
4
5
SELECT * FROM EMPREGADO WHERE EXISTS
(SELECT * FROM PEDIDOS
 WHERE EMPREGADO.CODIGO = PEDIDOS.CODEMPREGADO
 GROUP BY PEDIDOS.CODEMPREGADO
 HAVING MAX(PEDIDOS.VALOR_TOTAL) > 50000)

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
1
2
3
SELECT * FROM EMPREGADO WHERE NOT EXISTS
(SELECT * FROM PEDIDOS
WHERE EMPREGADO.CODIGO = PEDIDOS.EMPREGADO)

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)

0 comentários to “Sub-Consultas SQL (Sub-Select)”

Postar um comentário

Insira seu comentário

 

Java Aberto Copyright © 2011 -- Template created by O Pregador -- Powered by Blogger