academy.oracle.
com
Programación de Bases de Datos con SQL
10-3: Subconsultas de Varias Filas
Actividades de Práctica
Objetivos
Utilizar correctamente los operadores de comparación IN, ANY y ALL en subconsultas
de varias filas
Describir qué sucede si una subconsulta de varias filas devuelve un valor nulo
Crear y ejecutar una subconsulta de varias filas en la cláusula WHERE o en la
cláusula HAVING
Comprender cuándo se deben utilizar subconsultas de varias filas y cuándo es seguro
utilizar una subconsulta de una sola fila
Distinguir entre subconsultas pareadas y no pareadas
Crear una consulta con los operadores EXISTS y NOT EXISTS para probar filas
devueltas de la subconsulta
Inténtelo/Resuélvalo
1. ¿Qué devolverá una consulta si tiene una subconsulta que devuelve un valor nulo?
R:No devuelve nada
2. Escriba una consulta que devuelva canciones de jazz y pop. Escriba una subconsulta de
varias filas y utilice las tablas d_songs y d_types. Incluya el ID, el título y la duración, así
como el nombre del artista.
SELECT id, title, duration, artist
FROM d_songs
WHERE type_code IN ( SELECT code FROM d_types WHERE description IN ('Pop',
'Jazz'));
3. Busque los apellidos de todos los empleados cuyos salarios son iguales al salario mínimo
de cualquier departamento.
SELECT last_name
FROM employees
WHERE salary in ( SELECT MIN(salary) FROM employees GROUP BY department_id);
4. ¿Qué empleado de Global Fast Foods gana el salario más bajo?
Indicación: Puede utilizar una subconsulta de una sola fila o de varias filas.
SELECT last_name
FROM f_staffs
WHERE (salary,0) = ( SELECT MIN(salary,0) FROM f_staffs);
5. Coloque los operadores de comparación de varias filas en la cláusula WHERE de
la consulta externa de cada uno de los siguientes ejercicios:
a. ¿Qué CD de nuestra colección d_cds se han producido antes que “Carpe Diem”?
WHERE year<(SELECT year ...
b. ¿Qué empleados tienen sueldos inferiores a cualquiera de los programadores
del departamento de TI?
WHERE salary<(SELECT salary ...
c. ¿Qué títulos de CD se han producido en el mismo año que “Party Music for
All Occasions” o “Carpe Diem”?
WHERE year IN (SELECT year ...
d. ¿Qué título de canción tiene una duración mayor que cualquier título con el tipo de
código 77?
WHERE duration>ALL (SELECT duration ...
6. Si cada cláusula WHERE es de la consulta externa, ¿cuáles de las siguientes
son verdaderas?
V a. WHERE size > ANY -- Si la consulta interna devuelve tamaños de 8 a 12,
se podría devolver el valor 9 en la consulta externa.
F b. WHERE score <= ALL -- Si la consulta interna devuelve las puntuaciones 89, 98,
65 y 72, se podría devolver 82 en la consulta externa.
V c. WHERE score <= ALL -- Si la consulta interna devuelve las puntuaciones 89, 98,
65 y 72, se podría devolver 82 en la consulta externa.
V d. WHERE color NOT IN -- Si la consulta interna devuelve rojo, verde, azul y negro,
la consulta externa podría devolver blanco.
F e. WHERE game_date = ANY -- Si la consulta interna devuelve 05-Jun-1997,
10-Dec-2002 y 02-Jan-2004, la consulta externa podría devolver 10-Sep-2002.
7. El objetivo de la siguiente consulta es mostrar el salario mínimo de cada departamento
cuyo salario mínimo es inferior al salario más bajo de los empleados del departamento 50.
Sin embargo, la subconsulta no se ejecuta porque tiene cinco errores. Búsquelos,
corríjalos y ejecute la consulta.
SELECT department_id
FROM employees
WHERE MIN(salary)
HAVING MIN(salary) >
GROUP BY department_id
SELECT MIN(salary)
WHERE department_id < 50;
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) < (SELECT MIN(salary) FROM employees WHERE department_id = 50);
Los errores estaban que se saltaban de linea después de usar el having, ademas de que el
where esta mal implementado y el group by va después del from y el segundo select es en la
misma linea del código del having
8. ¿Qué sentencias son verdaderas sobre la subconsulta siguiente?
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
F a. La consulta interna se podría eliminar simplemente cambiando la cláusula
WHERE a WHERE MIN(salary).
V b. La consulta desea los nombres de los empleados que obtienen el mismo
salario que el salario más bajo de cualquier departamento.
V c. La consulta selecciona primero el ID y el apellido del empleado y después lo
compara con los salarios de cada departamento.
F d. Esta consulta no se ejecutará.
9. Escriba una subconsulta pareada que muestre last_name, first_name, department_id y
manager_id de todos los empleados que tienen el mismo department_ id y
manager_id que el empleado 141. Excluya al empleado 141 del juego de resultados.
10. Escriba una subconsulta no pareada que muestre last_name, first_name, department_id y
manager_id de todos los empleados que tienen el mismo department_ id y manager_id
que el empleado 141.
*Profe no entendí la parte de pareada en estos últimos ejercicios
2