A veces tendrás que utilizar en una consulta los resultados de otra que llamaremos subconsulta o consulta subordinada. La sintaxis es:
SELECT listaExpr
FROM tabla
WHERE expresión_o_columna OPERADOR
( SELECT expresion_o_columna
FROM tabla);
La subconsulta, también llamada subselect, puede ir dentro de las cláusulas WHERE
, HAVING
o FROM
.
Dependiendo de los operadores utilizados las subconsultas pueden devolver 1 o varias filas:
- El OPERADOR puede ser
>
, <
, >=
, <=
, !=
, =
o IN
. Las subconsultas que se utilizan con estos operadores devuelven un único valor. Si la subconsulta devolviera más de un valor devolvería un error.
Como puedes ver en la sintaxis, las subconsultas deben ir entre paréntesis y a la derecha del operador.
Pongamos un ejemplo:
SELECT Nombre, salario
FROM EMPLEADOS
WHERE salario <
(SELECT salario FROM EMPLEADOS
WHERE Nombre= 'Ana');
Obtendríamos el nombre de los empleados y el sueldo de aquellos que cobran menos que Ana. Si hubiese más de un empleado que se llamase Ana esta consulta daría error ya que la subconsulta devolvería más de una fila.
El tipo de dato que devuelve la subconsulta y la columna con la que se compara ha de ser el mismo.
¿Qué hacemos si queremos comparar un valor con varios, es decir, si queremos que la subconsulta devuelva más de un valor y comparar el campo que tenemos con dichos valores? Imagina que queremos ver si el sueldo de un empleado que es administrativo es mayor o igual que el sueldo medio de otros puestos en la empresa. Para saberlo deberíamos calcular el sueldo medio de las demás ocupaciones que tiene la empresa y éstos compararlos con la de nuestro empleado. Como ves, el resultado de la subconsulta es más de una fila. ¿Qué hacemos?
- Cuando el resultado de la subconsulta es más de una fila, SQL utiliza palabras reservadas entre el operador y la consulta. Estas son:
ANY
. Compara con cualquier fila de la consulta. La instrucción es válida si hay un registro en la subconsulta que permite que la comparación sea cierta.
ALL
. Compara con todas las filas de la consulta. La instrucción resultará cierta si es cierta la comparación con todas las filas devuelas por la subconsulta.
IN
. No utiliza comparador, lo que hace es comprobar si el valor se encuentra en el resultado de la subconsulta.
NOT IN
. Comprueba si un valor no se encuentra en una subconsulta.
En la siguiente consulta obtenemos el empleado que menos cobra:
SELECT nombre, salario
FROM EMPLEADOS
WHERE salario <= ALL (SELECT salario FROM EMPLEADOS);
Esa misma consulta se podría haber realizado utilizando la función de agregado o colectiva MIN de la siguiente forma:
SELECT nombre, salario
FROM EMPLEADOS
WHERE salario = (SELECT MIN(salario) FROM EMPLEADOS);