Subconsultas simples e correlacionadas |
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:
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 |
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 |
Realizado por Turtle Learning ®. Última alteração em 2011-08-14