Anda di halaman 1dari 21

PRACTICA 08

USO DE SUBCONSULTAS PARA


RESOLVER CONSULTAS
OBJETIVOS
Al finalizar esta leccin, usted debera ser capaz de hacer lo siguiente:
Definir las subconsultas
Describir los tipos de problemas que pueden resolver las subconsultas
Haga una lista de los tipos de subconsultas
Escriba una consulta de una y mltiples registros

ra

ue

En esta leccin, usted aprender acerca de las caractersticas ms avanzadas de la


instruccin SELECT. Usted puede escribir subconsultas en la clusula WHERE de otra
sentencia SQL para obtener los valores basados en un valor condicional desconocido.
Esta leccin tambin cubre subconsultas de un registro o subconsultas de varios
registros.
LECCIN DEL ORDEN DEL DA

Subconsulta: Tipos, la sintaxis, y las directrices


Subconsultas de una registros

Funcin de grupo en una sobconsulta

La clusula HAVING con subconsultas


Subconsultas de mltiples registros

Utilizar el operador ANY o ALL.


Utilizar el operador EXISTS
Los valores nulos en una subconsulta

aq

hm

USANDO UNA SUBCONSULTA PARA RESOLVER UN PROBLEMA

Suponga que desea escribir una consulta para saber quin gana un salario mayor que el
salario de Abel.
Para resolver este problema, usted necesita dos consultas: una para saber cunto gana a
Abel, y una segunda consulta para saber quin gana ms de esa cantidad.

ra

Usted puede resolver este problema mediante la combinacin de las dos consultas, la
colocacin de una consulta dentro de la otra consulta.
La consulta interna (o una subconsulta) devuelve un valor que es utilizado por la consulta
externa (o de la consulta principal). Usando una subconsulta es equivalente a realizar dos
consultas secuenciales y utilizar el resultado de la consulta por primera vez como el valor
de bsqueda en la segunda consulta.

SINTAXIS DE SUBCONSULTAS

La subconsulta (consulta interna) se ejecuta antes de la consulta principal (consulta


externa).
El resultado de la subconsulta es utilizada por la consulta principal.

aq

ue

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

Una subconsulta es una instruccin SELECT que se incrusta en la clusula FROM de otra
sentencia SELECT.
Usted puede construir las declaraciones de gran alcance de los simples mediante el uso
de subconsultas. Pueden ser muy tiles cuando se necesita para seleccionar registros de
una tabla con una condicin que depende de los datos en la propia tabla.
Puede colocar la subconsulta en una serie de clusulas SQL, incluyendo las siguientes:
Clusula WHERE
Clusula HAVING
clusula FROM

hm

En la siguiente sintaxis:
Operador incluye una condicin de comparacin como>, = o IN

Nota: Las condiciones de comparacin se dividen en dos clases: una hilera de operadores
(>, =,> =, <, <>, <=) y de varias registros operadores (IN, ANY, ALL, EXISTS).
La subconsulta se refiere a menudo como una instruccin anidada SELECT, subSELECT, o sentencia SELECT interior.

La subconsulta se suele ejecutar en primer lugar, y su produccin se utiliza para


completar la condicin de consulta para el principal (o exterior) de la consulta.

aq

ue

ra

USANDO UNA SUBCONSULTA

hm

En la diapositiva, la consulta interna que determina el salario de los empleados de Abel.


La consulta externa toma el resultado de la consulta interna y utiliza este resultado para
mostrar todos los empleados que ganan ms que los empleados de Abel.

DIRECTRICES PARA EL USO DE SUBCONSULTAS

Encierre las subconsultas entre parntesis


Coloque las subconsultas en el lado derecho de la condicin de comparacin para
facilitar la lectura. (Sin embargo, la subconsulta puede aparecer en cualquier lado del
operador de comparacin.)
Utilice operadores de un registro con subconsultas de una solo registro y operadores
de mltiples registros con subconsultas de varias registros
Una subconsulta debe ser encerrada entre parntesis.

Coloque la subconsulta en el lado derecho de la condicin de comparacin para


facilitar la lectura. Sin embargo, la subconsulta puede aparecer en cualquier lado del
operador de comparacin.
Dos clases de condiciones de comparacin se utilizan en las subconsultas:
operadores de un registro y operadores de mltiples registros.

ra

TIPOS DE SUBCONSULTAS
Subconsulta de un registro

Subconsulta de mltiples registros

Subconsultas de un solo registro: Consultas que devuelven un solo registro de la


sentencia SELECT interna

aq

ue

Subconsultas de mltiples registros: Consultas que devuelven ms de una registro de


la sentencia SELECT interna

hm

Nota: Tambin hay varias columnas subconsultas, que son las consultas que devuelven
ms de una columna de la sentencia SELECT interna. Estos se tratan en la Base de
Datos Oracle 11g: SQL Fundamentals II Curso.

SUBCONSULTAS DE UNA SOLO REGISTRO

Devuelve un solo registro


Operadores de comparacin de un solo registro

operador
=
>
>=
<
<=
<>

Significado
Igual a
Mayor que
Mayor que o igual a
Menor que
Menor o igual a
No igual a

Una subconsulta de un solo registro es el que devuelve un registro de la sentencia


SELECT interna. Este tipo de subconsulta utiliza un operador de un solo registro. La
diapositiva muestra una lista de los operadores de un registro.
Ejemplo:

aq

ue

SELECT last_name, job_id


FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141);

ra

Muestra los empleados cuyo trabajo de identificacin es la misma que la de empleado


141:

hm

EJECUCIN DE SUBCONSULTAS DE UN SOLO REGISTRO

SELECT last_name, job_id, salary


FROM employees
SA_REP
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Taylor' and first_name = 'Jonathon')
8600
AND salary >
(SELECT salary
FROM employees
WHERE last_name = 'Taylor' and first_name = 'Jonathon');

ra
ue

Una instruccin SELECT puede ser considerado como un bloque de consulta. El ejemplo
de la diapositiva muestra a los empleados que hacen el mismo trabajo como Jonathon
Taylor, pero ganan ms sueldo que l.

aq

El ejemplo consta de tres bloques de consulta: la consulta externa y dos consultas


internas. Los bloques de consulta interna se ejecutan en primer lugar, la produccin de
resultados de la consulta SA_REP y 8600, respectivamente. El bloque de consulta
externa se procesa y utiliza los valores que fueron devueltos por las consultas internas
para completar las condiciones de bsqueda.
Ambas consultas internas devolver los valores individuales (SA_REP y 8600,
respectivamente), por lo que esta sentencia SQL se denomina subconsulta de un solo
registro.

hm

Nota: Las consultas externas e internas pueden obtener datos de diferentes tablas.

USO DE LAS FUNCIONES DE GRUPO EN UNA SUBCONSULTA

ra

Puede mostrar datos de una consulta principal mediante el uso de una funcin de grupo
en una subconsulta para devolver un solo registro. La subconsulta entre parntesis y se
coloca despus de la condicin de comparacin.

ue

El ejemplo de la diapositiva muestra el nombre del ltimo empleado, ID de trabajo y el


salario de todos los empleados cuyo salario es igual al salario mnimo. La funcin de
grupo MIN devuelve un solo valor (2100) a la consulta externa.
CLUSULA HAVING CON SUBCONSULTAS

aq

El servidor de Oracle ejecuta las subconsultas en primer lugar.


El servidor de Oracle devuelve los resultados en la clusula HAVING de la consulta
principal.

hm

ra
ue

Usted puede utilizar subconsultas no slo en la clusula WHERE, sino tambin en la


clusula HAVING. El servidor de Oracle ejecuta la subconsulta y los resultados se
devuelven en la clusula HAVING de la consulta principal.

aq

La sentencia SQL de la diapositiva muestra todos los departamentos que tienen un salario
mnimo mayor que el del departamento 50.
Ejemplo:

Encuentra el trabajo con el menor salario promedio.

hm

SELECT job_id, AVG(salary)


FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);

QU HAY DE MALO CON ESTA DECLARACIN?

ue

ra

SELECT employee_id, last_name


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

Un error comn con subconsultas se produce cuando ms de un registro es devuelto para


una subconsulta de un solo registro

aq

En la instruccin SQL en la diapositiva, la subconsulta contiene una clusula GROUP BY,


lo que implica que la subconsulta devolver varios registros, una para cada grupo que
encuentre. En este caso, los resultados de la subconsulta son 6900, 2500, 7000, 17000,
6000, 10000, 8300, 2100, 6100, 6500, 4200 y 4400.

hm

La consulta externa tiene los resultados y los utiliza en su clusula WHERE. La clusula
WHERE contiene un igual (=) operador, un operador de comparacin de un solo registro
que espera slo un valor. El operador = no puede aceptar ms de un valor de la
subconsulta y, por tanto, genera el error.
Para corregir este error, cambie el operador = a IN.
SELECT employee_id, last_name
FROM employees
WHERE salary IN
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

ra
ue

NO HAY REGISTROS DEVUELTAS POR LA CONSULTA INTERNA

aq

SELECT last_name, job_id


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

hm

Subconsulta no devuelve ningn registro porque no hay ningn empleado llamado "Haas".

Otro problema comn con subconsultas se produce cuando no se devuelven registros por
la consulta interna.

En la instruccin SQL en la diapositiva, la subconsulta contiene una clusula WHERE. Es


de suponer que la intencin es encontrar el empleado cuyo nombre es Haas. La
afirmacin es correcta, sino que selecciona ningn registro cuando se ejecuta porque no
hay ningn empleado llamado Haas. Por lo tanto, la subconsulta no devuelve ningn
registro.

SUBCONSULTAS DE MLTIPLES REGISTROS

Vuelva a ms de una registro


Utilice los registros de varios operadores de comparacin

operador
IN
ANY

Significado
Igual a cualquier miembro de la lista.
Debe ir precedido de =! =,>, <, <=,> =. Compara un valor con cada valor
en una lista o devuelto por una consulta. Se evala a FALSE si la
consulta no devuelve registros.
Debe ir precedido de =, ! =,>, <, <=,> =. Compara un valor con cada valor
en una lista o devuelto por una consulta. TRUE si la consulta no
devuelve registros.

aq

ALL

ue

ra

La consulta externa toma los resultados de la subconsulta (null) y utiliza estos resultados
en su clusula WHERE. La consulta externa se encuentra ningn empleado con un ID de
trabajo igual a nulo, por lo que no devuelve ninguna registro. Si existe un trabajo con un
valor nulo, el registro no se devuelve porque la comparacin de dos valores nulos se
obtiene un valor nulo, por lo tanto, la condicin en que no es cierto.

Subconsultas que devuelven ms de un registro se llama subconsultas de varios


registros. Se utiliza un operador de varios registros, en lugar de un operador de un solo
registro, con una subconsulta de varios registros. El operador de varios registros espera
uno o ms valores:

hm

SELECT last_name, salary, department_id


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

ra
ue

Ejemplo:

aq

Buscar los empleados que ganan el mismo salario que el salario mnimo para cada
departamento.
La consulta interna se ejecuta en primer lugar, produciendo un resultado de la consulta. El
bloque de consulta principal se procesa y utiliza los valores que fueron devueltos por la
consulta interna para completar su condicin de bsqueda. De hecho, la consulta principal
aparece con el servidor Oracle como sigue:

hm

SELECT last_name, salary, department_id


FROM employees
WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300,
8600, 17000);

ra
ue

hm

aq

USO DEL OPERADOR ANY EN SUBCONSULTAS DE VARIOS REGISTROS

ra
ue

El operador ANY (y su sinnimo, el operador SOME) compara un valor con cada valor
devuelto por una subconsulta. El ejemplo de la diapositiva muestra a los empleados que
no son de TI y programadores cuyo salario es menor que la de cualquier programador de
TI. El salario mximo que un programador gana es de $ 9.000.
< ANY significa menos que el mximo.
> ANY significa ms que el mnimo.
= ANY es equivalente a IN.

aq

hm

USO DEL OPERADOR ALL EN SUBCONSULTAS DE VARIOS REGISTROS

ra
ue
`

El operador ALL compara un valor con cada valor devuelto por una subconsulta. El
ejemplo de la diapositiva muestra los empleados cuyo salario es menor que el salario de
todos los empleados con un ID de trabajo de IT_PROG y cuyo trabajo no se IT_PROG.

aq

> ALL significa ms que el mximo y < ALL significa menos que el mnimo.
El operador NOT puede ser utilizado con operadores IN, ANY o ALL
USANDO EL OPERADOR EXISTS

hm

SELECT * FROM departments


WHERE NOT EXISTS
(SELECT * FROM employees
WHERE employees.department_id=departments.department_id);

ra
ue

El operador EXISTS se usa en las consultas donde el resultado de la consulta depende


de si o no ciertos registros existen en una tabla. Devuelve TRUE si la subconsulta
devuelve al menos un registro

aq

El ejemplo de la diapositiva muestra los departamentos que no tienen empleados. Para


cada registro de la tabla DEPARTMENTS, la condicin se comprueba si existe un registro
en la tabla de EMPLOYEES que tiene el ID de un mismo departamento. En caso de que
no existe tal lnea, se cumple la condicin del registro en cuestin y que est
seleccionado. Si existe un registro correspondiente en la tabla EMPLOYEES, el registro
no est seleccionado.

VALORES NULOS EN UNA SUBCONSULTA

hm

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

La sentencia de SQL en la diapositiva intenta mostrar todos los empleados que no


cuentan con los subalternos. Lgicamente, esta sentencia SQL debera haber devuelto 12
registros. Sin embargo, la sentencia de SQL no devuelve ningn registro. Uno de los
valores devueltos por la consulta interna es un valor nulo y, por tanto, toda la consulta no
devuelve ningn registro.

ra

La razn es que todas las condiciones que comparan un resultado de valor nulo en un
valor nulo. As que cuando los valores nulos son propensos a formar parte del conjunto de
resultados de una subconsulta, no utilice el operador NOT IN. El operador NOT IN es
equivalente a <> ALL.

Tenga en cuenta que el valor nulo como parte del conjunto de resultados de una
subconsulta no es un problema si se utiliza el operador IN. El operador IN es equivalente
a = ANY. Por ejemplo, para mostrar a los empleados que tienen subordinados, utilice la
siguiente instruccin:

hm

aq

ue

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

Por otra parte, una clusula WHERE puede ser incluido en la subconsulta para mostrar
todos los empleados que no tienen los subalternos:

aq

ue

ra

SELECT last_name FROM employees


WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL);

EXAMEN

Usando una subconsulta es equivalente a realizar dos consultas secuenciales y utilizar el


resultado de la consulta por primera vez como los valores de bsqueda en la segunda
consulta.

hm

1. Verdadero
2. Falso

Respuesta: 1
RESUMEN

En esta leccin, usted debe haber aprendido a:

Identificar cundo una subconsulta puede ayudar a resolver un problema


Escribir subconsultas cuando una consulta se basa en valores desconocidos
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

En esta leccin, usted debe haber aprendido a utilizar subconsultas. Una subconsulta es
una instruccin SELECT que est incrustado en la clusula de otra sentencia SQL. Las
subconsultas son tiles cuando una consulta se basa en un criterio de bsqueda con
valores intermedios desconocidos.
Subconsultas tienen las siguientes caractersticas:

Puede pasar una registro de datos a un pliego que contiene un operador de un solo
registro, como =, <>,>,> =, <, o <=
Pueden pasar varias registros de datos a una declaracin principal que contiene un
operador de varias registros, como IN
Estn procesados por primera vez por el servidor de Oracle, despus de que la
clusula WHERE o HAVING utiliza los resultados
Puede contener funciones de grupo

ue

PRCTICA 7: INFORMACIN GENERAL

ra

Esta prctica cubre los siguientes temas:

Creacin de subconsultas a los valores de la consulta sobre la base de criterios


desconocidos
Uso de Subconsultas para averiguar los valores que existen en un conjunto de datos y
no en otro

aq

En esta prctica, escribir consultas complejas utilizando instrucciones SELECT anidadas.


Para preguntas de prctica, es posible que desee crear la consulta interna en primer
lugar. Asegrese de que funciona y produce los datos que usted anticipa que antes de
codificar la consulta externa.

hm

1. El departamento de recursos humanos necesita una consulta que pide al usuario el


nombre de un ltimo empleado. La consulta a continuacin, muestra el apellido y
fecha de contratacin de cualquier empleado en el mismo departamento que el
empleado cuyo nombre la oferta (excepto que el empleado). Por ejemplo, si el usuario
introduce Zlotkey, buscar todos los empleados que trabajan con Zlotkey (excluyendo
Zlotkey).

ue

ra

2. Crear un informe que muestra el nmero de empleado, el apellido y el salario de todos


los empleados que ganan ms que el salario promedio. Clasificar los resultados en
orden ascendente de salario.

hm

aq

3. Escriba una consulta que muestra el nmero de empleado y apellido de todos los
empleados que trabajan en un departamento con cualquier empleado cuyo apellido
contiene la letra "u". Guarde su instruccin SQL como lab_07_03.sql. Ejecutar la
consulta.

4. El departamento de recursos humanos necesita un informe que muestra el apellido,


nmero de departamento, y el ID de trabajo de todos los empleados cuyo
departamento de ID de ubicacin es de 1700.

Modificar la consulta para que el usuario ha de introducir un ID de la ubicacin.


Guardar sta en un archivo denominado lab_07_04.sql.

ra

5. Crear un informe de recursos humanos que muestra el apellido y el salario de cada


empleado que informe al rey.

ue

6. Crear un informe de recursos humanos que muestra el nmero de departamento, el


apellido y el ID de trabajo para cada empleado en el departamento Ejecutivo. Si usted
tiene el tiempo, complete el siguiente ejercicio:

hm

aq

7. Modificar la consulta en lab_07_03.sql para mostrar el nmero de empleado, el


apellido y el salario de todos los empleados que ganan ms que el salario medio, y
que trabajan en un departamento con cualquier empleado cuyo apellido contiene una
"u". Vuelva a guardar lab_07_03. SQL como lab_07_07.sql. Ejecute la instruccin en
lab_07_07.sql.

Anda mungkin juga menyukai