Saltar la navegación

10.- Subconsultas.

Caso práctico

Dos ejecutivas analizando un informe que una de ellas sostiene.
Stockbyte (Uso educativo nc)


— ¿Es posible consultar dentro de otra consulta? — pregunta Carlos.

Ha estado pensando que a veces va a necesitar filtrar los datos en función de un resultado que a priori desconoce. Ana se pone manos a la obra porque ve que ha llegado el momento de explicarle a Carlos las subconsultas.

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); 

Autoevaluación

Relaciona cada instrucción con su función:
Ejercicio de relacionar
Instrucción. Relación. Función.
ANY 1. Compara con cualquier fila de la consulta.
ALL 2. Comprueba si el valor se encuentra en el resultado de la subconsulta.
IN 3. Compara con todas las filas de la consulta.
NOT IN 4. Comprueba si un valor no se encuentra en una subconsulta.

Habilitar JavaScript

Para saber más

¿Quieres más ejemplos con los que practicar?

Ejercicios SQL.