Uso de un subquery para propósitos de comparación
Que empleado tiene un salario menor al promedio de salario? Esto puede
ser resuelto mediante un subquery.
-- ESTE PROCEDIMIENTO SERIA SIN EL USO DE UN SUBQUERY
SELECT ROUND(AVG(salary)) FROM employees; -- EL PROMEDIO ES 6462
SELECT employee_id, first_name, last_name, salary FROM employees WHERE
salary < 6462;
-- MEDIENTE EL USO DE UN SUBQUERY
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary < (SELECT
ROUND(AVG(salary)) FROM employees);
En este ejemplo utilizamos un subquery de tipo escalar que devuelve un
solo valor y lo utilizamos en la clausula WHERE como devuelve un solo valor
hacemos una comparación contra otro valor si el subquery devolviera una lista
de valor la consulta marcaría error.
Un subquery también puede devolver un lista de valores que sea
utilizada por otra consulta. Ahora buscaremos todos los departamentos que al menos
tiene asignado un empleado.
-- ESTE PROCEDIMIENTO SERIA SIN EL USO DE UN SUBQUERY
SELECT DISTINCT department_id FROM employees;
SELECT department_id, department_name
FROM departments
WHERE department_id IN
(100,30,20,70,90,110,50,40,80,10,60);
-- MEDIENTE EL USO DE UN SUBQUERY
SELECT department_id, department_name
FROM departments
WHERE department_id IN (SELECT
DISTINCT department_id FROM employees);
El subquery devuelve una lista de resultados la cual es compara con un
operador IN en la consulta padre. Para así obtener el resultado.
Si un subquery va a devolver más de una fila, entonces el operador de comparación
debe ser capaz de aceptar múltiples valores. Estos operadores son: IN, NOT IN,
ANY y ALL. Si el operador de comparación es =, > o < entonces el query
padre fallará.
Uso de NOT IN está plagado de problemas debido a la forma en que SQL
maneja NULL. Como regla general, no use NOT IN a menos que esté seguro de que
el conjunto de resultados no incluirá un valor NULL.
Comentarios
Publicar un comentario