Copyright © 2007, Oracle. All rights reserved.
Subconsultas
Copyright © 2007, Oracle. All rights reserved.7 - 2
Objetivos
Después de completar esta lección, usted debería ser capaz
de hacer lo siguiente:
• Definir subconsultas.
• Describir los tipos de problemas que las subconsultas
pueden resolver.
• Enumerar los tipos de subconsultas.
• Escribir subconsultas de una sola fila o de múltiples files.
Copyright © 2007, Oracle. All rights reserved.7 - 3
Agenda
• Subconsultas: Tipos, la sintaxis, y las directrices.
• Subconsulta de una fila:
– Funciones de grupo en una subconsulta.
– Cláusula HAVING con subconsultas.
• Subconsulta de varias de filas.
– Uso de los operadores ALL, ANY o IN.
• Valor Null en una subconsulta.
Copyright © 2007, Oracle. All rights reserved.7 - 4
Uso de subconsultas para resolver un problema
¿Quién cobra más que Abel?
¿Qué empleados tiene el salario más alto que el
salario de Abel?
Consulta principal:
Cuál es el salario de Abel?
Subconsulta:
Copyright © 2007, Oracle. All rights reserved.7 - 5
Sintaxis de subconsulta
• La subconsulta (consulta interna) se ejecuta antes de la
consulta principal (consulta externa).
• El resultado de la subconsulta es utilizado por la consulta
principal.
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
Copyright © 2007, Oracle. All rights reserved.7 - 6
SELECT last_name, salary
FROM employees
WHERE salary >
(SELECT salary
FROM employees
WHERE last_name = 'Abel');
Uso de una subconsulta
11000
Copyright © 2007, Oracle. All rights reserved.7 - 7
Instrucciones para el uso de subconsultas
• Las subconsultas deben ir entre paréntesis.
• Las subconsultas aparecen a la derecha del operador por
legibilidad (Sin embargo, la subconsula puede aparecer en
cualquier lado del operador).
• Utilice operadores de una fila para subconsulta de una fila y
operadores de múltiples filas para subconsultas que
devuelven más de una fila.
Copyright © 2007, Oracle. All rights reserved.7 - 8
Tipos de subconsultas
• Subconsultas de fila
• Subconsultas de un grupo de filas
Main query
Subquerydevuelve
ST_CLERK
ST_CLERK
SA_MAN
Main query
Subquerydevuelve
Copyright © 2007, Oracle. All rights reserved.7 - 9
Agenda
• Subconsultas: Tipos, la sintaxis, y las directrices.
• Subconsulta de una fila:
– Funciones de grupo en una subconsulta.
– Cláusula HAVING con subconsultas.
• Subconsulta de varias de filas.
– Uso de los operadores ALL, ANY o IN.
• Valor Null en una subconsulta.
Copyright © 2007, Oracle. All rights reserved.7 - 10
Subconsulta de una sola fila
• Devuelve sólo una fila.
• Utilice operadores de una sola fila
Mayor o igual que>=
Menor que<
Menor o igual que<=
Igual a=
Diferente a<>
Mayor que>
SignificadoOperador
Copyright © 2007, Oracle. All rights reserved.7 - 11
SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Taylor’)
AND salary >
(SELECT salary
FROM employees
WHERE last_name = ‘Taylor’);
Ejecución de subconsultas de una sola fila
SA_REP
8600
Copyright © 2007, Oracle. All rights reserved.7 - 12
SELECT last_name, job_id, salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);
Utilizar funciones de una subconsulta
2500
Copyright © 2007, Oracle. All rights reserved.7 - 13
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
La cláusula HAVING con subconsultas
• El servidor Oracle ejecuta la subconsulta primera.
• El servidor Oracle devuelve los resultados en la cláusula HAVING de la consulta principal.
2500
…
Copyright © 2007, Oracle. All rights reserved.7 - 14
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
¿Qué está mal en esta sentencia?
Single-row operator
with multiple-row
subquery
Copyright © 2007, Oracle. All rights reserved.7 - 15
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');
No devuelve filas para la consulta interna
La subconsulta no devuelve filas porque no hay
ningún empleado llamado “Haas”.
Copyright © 2007, Oracle. All rights reserved.7 - 16
Agenda
• Subconsultas: Tipos, la sintaxis, y las directrices.
• Subconsulta de una fila:
– Funciones de grupo en una subconsulta.
– Cláusula HAVING con subconsultas.
• Subconsulta de varias de filas.
– Uso de los operadores ALL, ANY o IN.
• Valor Null en una subconsulta.
Copyright © 2007, Oracle. All rights reserved.7 - 17
Subconsultas de varias filas
• Devuelve más de una fila.
• Utiliza operadores de multiples filas
Debe ir precedido de =, !=, >, <, <=, >=.
Compara un valor a cada valor en una lista o
devuelto por una consulta. Devuelve TRUE si la
consulta no devuelve ninguna fila.
ALL
Igual a algún elemento de la listaIN
Debe ir precedido de =, !=, >, <, <=, >=.
Compara un valor a cada valor en una lista o
devuelto por una consulta. Se evalúa como
FALSE si la consulta no devuelve ninguna fila.
ANY
SignificadoOperador
Copyright © 2007, Oracle. All rights reserved.7 - 18
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Uso del operador ANY
en subconsultas de más de una fila
9000, 6000, 4200
…
Copyright © 2007, Oracle. All rights reserved.7 - 19
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';
Uso del operador ALL
en subconsultas de más de una fila
9000, 6000, 4200
Copyright © 2007, Oracle. All rights reserved.7 - 20
Agenda
• Subconsultas: Tipos, la sintaxis, y las directrices.
• Subconsulta de una fila:
– Funciones de grupo en una subconsulta.
– Cláusula HAVING con subconsultas.
• Subconsulta de varias de filas.
– Uso de los operadores ALL, ANY o IN.
• Valor Null en una subconsulta.
Copyright © 2007, Oracle. All rights reserved.7 - 21
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);
Valores null en una subconsulta
Copyright © 2007, Oracle. All rights reserved.7 - 22
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL);
Valores null en una subconsulta
Copyright © 2007, Oracle. All rights reserved.7 - 23
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
Resumen
En esta lección, usted debe haber aprendido a:
• Identificar cuando una subconsulta puede ayudar a resolver
un problema.
• Escribir subconsultas cuando una consulta está basada en
valores desconocidos.
Copyright © 2007, Oracle. All rights reserved.7 - 24
Práctica 7: Información general
Esta práctica abarca los siguientes temas:
• Crear subconsultas para consultar valores.
• Usar subconsultas para encontrar valores que existen en un
conjunto de datos y no en otro.