Unidad 6. Las subconsultas (II)


6.2. Subconsultas de resultado único

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.

6.3. Subconsultas de lista de valores

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.

6.4. El operador IN con subconsulta

<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.

Febrero-2010
Pág. 6.2

Atrás  Inicio  Adelante






.