SQL em Oracle > DML > Subconsultas > Subconsultas simples e correlacionadas
Subconsultas simples e correlacionadas tl_logo2.jpg

Uma subconsulta é uma instrução SELECT que está encadeada dentro de outra instrução SELECT. A consulta interior é designada por selecção interna e é executada em primeiro lugar, sendo o seu resultado utilizado para completar a consulta principal ou externa. A utilização de subconsultas permite construir comandos potentes a partir de comandos mais simples.

Na construção de subconsultas devem ser seguidas as seguintes linhas de orientação:

Existem dois tipos de subconsultas:


Subconsulta simples

Suponha que pretende encontrar o(s) empregado(s) que ganha(m) o salário mais baixo na empresa, desconhecendo a quantia em causa. O problema pode resolver-se em dois passos:

Para o primeiro passo usamos a consulta abaixo:


select min(sal) 
from emp;
MIN(SAL)               
---------------------- 
800                    

1 rows selected

Para o segundo passo usamos a consulta abaixo:

select ename, job, sal 
from emp 
where sal = 800;
ENAME      JOB       SAL                    
---------- --------- ---------------------- 
SMITH      CLERK     800                    

1 rows selected

Os dois queries podem ser juntos num só, usando uma subconsulta:

select ename, job, sal 
from emp
where sal = (select min(sal)
             from emp);
ENAME      JOB       SAL                    
---------- --------- ---------------------- 
SMITH      CLERK     800                    

1 rows selected

A consulta interior é executada em primeiro lugar produzindo um resultado (800). O bloco externo é depois executado, utilizando o valor devolvido pela consulta interna para completar a sua condição de pesquisa.

O exemplo abaixo procura todos os empregados que executam a mesma função que BLAKE:

select ename,job
from emp
where job = (select job
             from emp
             where ename = 'BLAKE');
EENAME      JOB       
---------- --------- 
JONES      MANAGER   
BLAKE      MANAGER   
CLARK      MANAGER   

3 rows selected

bthome.gifTopo


Subconsultas correlacionadas

Uma subconsulta correlacionada é executada de forma diferente da subconsulta simples. Nestas consultas o subquery precisa de um dado que vem do query principal, pelo que o SELECT interno é executado tantas vezes quantas as linhas que são processadas no query principal.

A lista abaixo contem os passos necessários para executar uma consulta correlacionada:

A consulta abaixo pretende encontrar os empregados que ganham um salário superior ao salário médio do respectivo departamento:

select e1.empno, e1.ename, e1.sal, e1.deptno
from emp e1
where e1.sal > (select avg(e2.sal)
                from emp e2
                where e2.deptno = e1.deptno);
EMPNO                  ENAME      SAL                    DEPTNO                 
---------------------- ---------- ---------------------- ---------------------- 
7499                   ALLEN      1600                   30                     
7566                   JONES      2975                   20                     
7698                   BLAKE      2850                   30                     
7788                   SCOTT      3000                   20                     
7839                   KING       5000                   10                     
7902                   FORD       3000                   20                     

6 rows selected

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-08-14