Ir al contenido principal

Subquerys Parte 2

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