Você está na página 1de 19

6

Usando Subconsultas
para Solucionar Consultas

Copyright © 2004, Oracle. Todos os direitos reservados.


Objetivos

Ao concluir esta lição, você será capaz de:


• Definir subconsultas
• Descrever os tipos de problemas que as
subconsultas podem solucionar
• Listar os tipos de subconsultas
• Criar subconsultas de uma única linha e de
várias linhas

6-2 Copyright © 2004, Oracle. Todos os direitos reservados.


Usando uma Subconsulta
para Solucionar um Problema

Quem tem um salário maior que o salário de Abel?

Consulta principal:

Quais funcionários têm um salário maior


que o salário de Abel?

Subconsulta:

Qual é o salário de Abel?

6-3 Copyright © 2004, Oracle. Todos os direitos reservados.


Sintaxe da Subconsulta

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

• A subconsulta (consulta interna) é executada uma


vez antes da consulta principal (consulta externa).
• O resultado da subconsulta é usado pela consulta
principal.

6-4 Copyright © 2004, Oracle. Todos os direitos reservados.


Usando uma Subconsulta

SELECT last_name
FROM employees 11000
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');

6-5 Copyright © 2004, Oracle. Todos os direitos reservados.


Diretrizes de Uso de Subconsultas

• Delimite subconsultas por parênteses.


• Posicione subconsultas à direita da condição de
comparação.
• A cláusula ORDER BY não será necessária na
subconsulta, a menos que uma análise Top-N seja
executada.
• Use operadores de uma única linha com
subconsultas de uma única linha e operadores de
várias linhas com
subconsultas de várias linhas.

6-6 Copyright © 2004, Oracle. Todos os direitos reservados.


Tipos de Subconsultas

• Subconsulta de uma única linha


Consulta principal
retorna
Subconsulta ST_CLERK

• Subconsulta de várias linhas


Consulta principal
retorna ST_CLERK
Subconsulta
SA_MAN

6-7 Copyright © 2004, Oracle. Todos os direitos reservados.


Subconsultas de uma Única Linha

• Retornam somente uma linha


• Usam operadores de comparação de uma única linha
Operador Significado
= Igual a
> Maior que
>= Maior que ou igual a
< Menor que
<= Menor que ou igual a
<> Diferente de

6-8 Copyright © 2004, Oracle. Todos os direitos reservados.


Executando Subconsultas de uma Única Linha

SELECT last_name, job_id, salary


FROM employees
WHERE job_id = ST_CLERK
(SELECT job_id
FROM employees
WHERE employee_id = 141)
AND salary > 2600
(SELECT salary
FROM employees
WHERE employee_id = 143);

6-9 Copyright © 2004, Oracle. Todos os direitos reservados.


Usando Functions de
Grupo em uma Subconsulta

SELECT last_name, job_id, salary


FROM employees 2500
WHERE salary =
(SELECT MIN(salary)
FROM employees);

6-10 Copyright © 2004, Oracle. Todos os direitos reservados.


A Cláusula HAVING com Subconsultas

• O servidor Oracle executa primeiro as subconsultas.


• Ele retorna os resultados para a cláusula HAVING da
consulta principal.
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id 2500
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);

6-11 Copyright © 2004, Oracle. Todos os direitos reservados.


O Que Está Errado Nesta Instrução?

SELECT employee_id, last_name


FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

ERROR at line 4:
ORA-01427: single-row subquery returns more than
one row

Operador de uma única linha com


uma subconsulta de várias linhas

6-12 Copyright © 2004, Oracle. Todos os direitos reservados.


Esta Instrução Retornará Linhas?

SELECT last_name, job_id


FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');

no rows selected

A subconsulta não retorna nenhum valor.

6-13 Copyright © 2004, Oracle. Todos os direitos reservados.


Subconsultas de Várias Linhas

• Retornam mais de uma linha


• Usam operadores de comparação de várias linhas
Operador Significado
IN Igual a qualquer membro da lista
ANY Compara o valor com cada valor retornado
pela subconsulta
ALL Compara o valor com todos os valores
retornados pela subconsulta

6-14 Copyright © 2004, Oracle. Todos os direitos reservados.


Usando o Operador ANY
em Subconsultas de Várias Linhas
SELECT employee_id, last_name, job_id, salary
FROM employees 9000, 6000, 4200
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

6-15 Copyright © 2004, Oracle. Todos os direitos reservados.


Usando o Operador ALL
em Subconsultas de Várias Linhas
SELECT employee_id, last_name, job_id, salary
FROM employees 9000, 6000, 4200
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

6-16 Copyright © 2004, Oracle. Todos os direitos reservados.


Valores Nulos em uma Subconsulta

SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);

no rows selected

6-17 Copyright © 2004, Oracle. Todos os direitos reservados.


Sumário

Nesta lição, você aprendeu a:


• Identificar quando uma subconsulta pode ajudar a
solucionar um problema
• Criar subconsultas quando uma consulta se basear
em valores desconhecidos
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

6-19 Copyright © 2004, Oracle. Todos os direitos reservados.


Exercício 6: Visão Geral

Este exercício aborda os seguintes tópicos:


• Criação de subconsultas para consultar valores
baseados em critérios desconhecidos
• Utilização de subconsultas para descobrir os valores
existentes em um conjunto de dados, e não em outro

6-20 Copyright © 2004, Oracle. Todos os direitos reservados.

Você também pode gostar