Você está na página 1de 5

SQL

Sub-Consultas

SQL

- L. M. del Val Cura

Sub-Consultas
Sub-consulta: Expresso SQL ( Select From Where ) aninhada em outra consulta. Esta expresso em geral define um conjunto ou tabela utilizada na clausula WHERE no contexto de outra consulta.
Tipos de Consultas sobre esses conjuntos Pertencia ao conjunto definido pela sub-consulta ( IN, NOT IN ) Comparao com elementos da sub-consulta ( ALL, ANY ) Existncia e unicidade da sub-consulta( EXISTS, UNIQUE )
SQL - L. M. del Val Cura 2

Pertencia sub-consulta
Operador IN: Permite testar a pertencia de um valor ao conjunto definido por uma sub-consulta.
Ex: Nome dos empregados que trabalham em algum departamento localizado no 2do Andar
SELECT Nome FROM Empregado AS E WHERE E.CodDpto IN (SELECT Codigo FROM Departamento WHERE Local = 2doAndar)

esta consulta equivalente a:


SELECT Nome FROM Empregado AS E, Departamento AS D WHERE ( E.CodDpto = D.Codigo) AND (Local =2doAndar)
SQL - L. M. del Val Cura 3

Pertencia sub-consulta(2)
O operador IN pode ser utilizado com negao (NOT IN) permitindo consultas que no poderiam ser definidas com consultas simples. Ex: Nome dos Departamentos onde no trabalha nenhum empregado com salrio menor que R$ 1000.00
SELECT Nome FROM Departamento WHERE Codigo NOT IN (SELECT CodDpto FROM Empregado WHERE Salario > 1000.00)

SQL

- L. M. del Val Cura

Comparao com elementos da subconsulta


possvel comparar um determinado valor com um ou vrios elementos do conjunto formado por uma sub-consulta. Operador ALL: Permite testar que uma relao se satisfaz com todos os elementos do conjunto da sub-consulta. Pode ser utilizado com todos os operadores relacionais (>ALL, >=ALL, <ALL, <=ALL, =ALL, <>ALL )

Ex:

Nome e salario dos empregados de sexo feminino com salario maior a todos os empregados do departamento de cdigo 45
SELECT Nome, Salario FROM Empregado WHERE Sexo = F AND Salario > ALL(SELECT Salario FROM Empregado WHERE CodDpto =

45)

!!! Equivalncia entre NOT IN e


SQL

<> ALL
- L. M. del Val Cura 5

Comparao com elementos da subconsulta (2)


Operador ANY(SOME): Permite testar que uma relao se satisfaz com ao menos um elemento do conjunto da sub-consulta. Pode ser utilizado com todos os operadores relacionais (>ANY, >=ANY, <ANY, <=ANY, =ANY, <>ANY ) Ex: Nome, Salrio e sexo dos Empregados com salrio maior que algum dos chefes de departamento. SELECT Nome, Salario, Sexo FROM Empregado WHERE Salario > ANY(SELECT Salario FROM Empregado, Departamento WHERE (RG = RGChefe) !!! Equivalncia entre IN e =ANY

SQL

- L. M. del Val Cura

Existncia de elementos na subconsulta


O operador EXISTS permite testar a condio de conjunto no vazio para o conjunto definido pela sub-consulta. Ex: Nome e sexo de empregados com salario maior que R$ 5000.00 que participam em ao menos um projeto
SELECT Nome, Sexo FROM Empregado AS E WHERE (Salario > 5000) AND EXISTS (SELECT * FROM TrabalhaEnProjeto AS T WHERE (T.RG = E.RG )

!!Note-se a possibilidade de utilizar uma varivel de tupla (E) da consulta principal dentro da consulta aninhada!!
SQL - L. M. del Val Cura 7

Unicidade do conjunto da subconsulta


O operador UNIQUE permite testar a condio de conjunto de um nico elemento para o conjunto definido pela sub-consulta. Ex: RG e Nome dos empregados de sexo feminino que tem um nico dependente
SELECT RG, Nome FROM Empregado AS E WHERE (Sexo = `F) AND UNIQUE(SELECT * FROM Dependentes WHERE (RGEmpr = E.RG

SQL

- L. M. del Val Cura

Subconjunto do conjunto de uma sub-consulta


Em ocasies queremos testar se o conjunto A definido por uma subconsulta C1 subconjunto do conjunto B definido por uma outra subconsulta C2 SQL originalmente possua um operador: B CONTENTS A Eliminado com o padro SQL2 pelo custo de implementao.

Ex: RG e sexo dos empregados que trabalham em todos os projetos controlados pelo Departamento de Cdigo 5.
SELECT RG, Sexo FROM Empregado AS E WHERE ( (SELECT Num FROM TrabalhaEmProjeto WHERE RG = E.RG) CONTENTS (SELECT Num FROM Projetos WHERE CodDpto = 5) )
SQL - L. M. del Val Cura 9

Subconjunto do conjunto de uma sub-consulta(2)

Como definir este tipo de consulta com os recursos existntes?


A B equivalente a que o conjunto (A - B) seja vazio !!!! isto : pode ser escrito como NOT EXIST ( A EXCEPT B)

Ex: RG e sexo dos empregados que trabalham em todos os projetos controlados pelo Departamento de Cdigo 5.
SELECT RG, Sexo FROM Empregado AS E WHERE NOT EXISTS( (SELECT Num FROM Projetos WHERE CodDpto = 5) EXCEPT (SELECT Num FROM TrabalhaEmProjeto WHERE RG = E.RG) )
SQL - L. M. del Val Cura 10