Existen subconsultas que deben obligatoriamente devolver un único valor, son las que aparecen en la lista de selección de la consulta externa o las que aparecen en WHERE o HAVING combinadas con un operador de comparación sin modificar.
Los operadores de comparación sin modificar son los operadores de comparación que vimos con la cláusula WHERE.
Sintaxis:
<expresion> {=|<>|!=|>|>=|!>|<|<=|!<} <subconsulta>
En este caso la segunda expresión será una subconsulta, con una sola columna en la lista de selección y deberá devolver una única fila como mucho.
Ese valor único será el que se compare con el resultado de la primera expresión.
Si la subconsulta no devuelve ninguna fila, la comparación opera como si la segunda expresión fuese nula.
Si la subconsulta devuelve más de una fila o más de una columna, da error.
Ejemplo:
SELECT nombre FROM empleados WHERE cuota <= (SELECT SUM(importe) FROM pedidos WHERE rep = numemp);
La subconsulta devuelve una sola columna y como mucho una fila ya que es una consulta de resumen sin cláusula GROUP BY.
Para practicar puedes realizar este Ejercicio Subconsultas de resultado único.
Otro tipo de subconsultas son las que devuelven una lista de valores en forma de una columna y cero, una o varias filas.
Estas consultas aparecen en las cláusulas WHERE o HAVING combinadas con el operador IN o con comparaciones modificadas.
<expresion> IN subconsulta
IN examina si el valor de expresion es uno de los valores incluidos en la lista de valores generados por la subconsulta.
La subconsulta tiene que generar valores de un tipo compatible con la expresión.
Ejemplo:
SELECT * FROM empleados WHERE oficina IN (SELECT oficina FROM oficinas WHERE region = 'Este');
Por cada empleado se calcula la lista de las oficinas del Este (nº de oficina) y se evalúa si la oficina del empleado está en esta lista. Obtenemos pues los empleados de oficinas del Este.
numemp | nombre | edad | oficina | titulo | contrato | jefe | cuota | ventas |
---|---|---|---|---|---|---|---|---|
101 | Antonio Viguer | 45 | 12 | representante | 1986-10-20 | 104 | 30000,00 | 30500,00 |
103 | Juan Rovira | 29 | 23 | representante | 1987-03-01 | 104 | 27500,00 | 28600,00 |
104 | José González | 33 | 23 | dir ventas | 1987-05-19 | 106 | 20000,00 | 14300,00 |
105 | Vicente Pantalla | 37 | 13 | representante | 1988-02-12 | 104 | 35000,00 | 36800,00 |
106 | Luis Antonio | 52 | 11 | dir general | 1988-06-14 | NULL | 27500,00 | 29900,00 |
Si la subconsulta no devuelve ninguna fila:
SELECT * FROM empleados WHERE oficina IN (SELECT oficina FROM oficinas WHERE region = 'Otro');
La lista generada está vacía por lo que la condición IN devuelve FALSE y en este caso no sale ningún empleado.
Muchas veces la misma pregunta se puede resolver mediante una composición de tablas.
SELECT empleados.* FROM Empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina WHERE region = 'Este';
Esta sentencia es equivalente. En el resultado no queremos ver ninguna columna de la tabla oficinas, el JOIN lo tenemos sólo para la pregunta, en este caso pues se puede sustituir por una subconsulta.
Síguenos en: Facebook Sobre aulaClic Política de Cookies
© aulaClic S.L. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.