Tema 5. Las subconsultas (I) |
|
|
Una subconsulta es una sentencia
SELECT que aparece dentro de otra sentencia SELECT
que llamaremos consulta principal.
Se puede encontrar en la lista
de selección, en la cláusula
WHERE o en la cláusula HAVING
de la consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia
SELECT normal exceptuando que aparece encerrada
entre paréntesis, no puede contener la cláusula
ORDER BY, ni puede ser la UNION
de varias sentencias SELECT, además
tiene algunas restricciones en cuanto a número de columnas según
el lugar donde aparece en la consulta principal. Estas restricciones las
iremos describiendo en cada caso.
Cuando se ejecuta una consulta que contiene una subconsulta,
la subconsulta se ejecuta por cada fila de la
consulta principal.
Se aconseja no utilizar campos calculados en las subconsultas,
ralentizan la consulta.
Las consultas que utilizan subconsultas suelen ser más
fáciles de interpretar por el usuario.
|
|
A menudo, es necesario, dentro del cuerpo de una subconsulta,
hacer referencia al valor de una columna en la fila actual de la consulta
principal, ese nombre de columna se denomina referencia externa.
Una referencia externa es un nombre
de columna que estando en la subconsulta, no se refiere a ninguna columna
de las tablas designadas en la FROM
de la subconsulta sino a una columna de las tablas
designadas en la FROM de la consulta principal. Como la subconsulta
se ejecuta por cada fila de la consulta principal, el valor de la referencia
externa irá cambiando.
Ejemplo:
SELECT numemp, nombre, (SELECT MIN(fechapedido)
FROM pedidos WHERE rep = numemp)
FROM empleados;
|
|
En este ejemplo la consulta principal es SELECT...
FROM empleados.
La subconsulta es ( SELECT MIN(fechapedido) FROM
pedidos WHERE rep = numemp ).
En esta subconsulta tenemos una referencia externa ( numemp ) es
un campo de la tabla empleados (origen de la consulta principal).
¿Qué pasa cuando se ejecuta la consulta
principal?
- se coge el primer empleado y se calcula la subconsulta sustituyendo
numemp por el valor que tiene en el primer empleado. La subconsulta obtiene
la fecha más antigua en los pedidos del rep = 101,
- se coge el segundo empleado y se calcula la subconsulta con numemp =
102 (numemp del segundo empleado)... y así sucesivamente hasta
llegar al último empleado.
Al final obtenemos una lista con el número, nombre y fecha del
primer pedido de cada empleado.
Si quitamos la cláusula
WHERE de la subconsulta obtenemos la fecha del primer pedido
de todos los pedidos no del empleado correspondiente.
|
|
Las subconsultas pueden anidarse
de forma que una subconsulta aparezca en la cláusula
WHERE (por ejemplo) de otra subconsulta
que a su vez forma parte de otra consulta principal. En la práctica,
una consulta consume mucho más tiempo y memoria cuando se incrementa
el número de niveles de anidamiento. La consulta resulta también
más difícil de leer , comprender y mantener cuando contiene
más de uno o dos niveles de subconsultas.
Ejemplo:
|
|
SELECT numemp, nombre
FROM empleados
WHERE numemp = (SELECT rep FROM pedidos WHERE clie = (SELECT numclie FROM
clientes WHERE nombre = 'Julia Antequera'))
|
En este ejemplo, por cada linea de pedido se calcula la subconsulta de
clientes, y esto se repite por cada empleado, en el caso de tener 10 filas
de empleados y 200 filas de pedidos (tablas realmente pequeñas),
la subconsulta más interna se ejecutaría 2000 veces (10 x
200).
|
|
Subconsulta
en la lista de selección
|
|
Cuando la subconsulta aparece en
la lista de selección de la consulta principal, en este
caso la subconsulta, no puede devolver varias
filas ni varias columnas, de lo contrario se da un mensaje
de error.
Muchos SQLs no permiten que una subconsulta aparezca en la lista de selección
de la consulta principal pero eso no es ningún problema ya que
normalmente se puede obtener lo mismo utilizando como origen de datos
las dos tablas. El ejemplo anterior se puede obtener de la siguiente forma:
|
|
SELECT numemp, nombre, MIN(fechapedido)
FROM empleados LEFT JOIN pedidos ON empleados.numemp = pedidos.rep
GROUP BY numemp, nombre
|
|
En la cláusula FROM se puede encontrar una sentencia
SELECT encerrada entre paréntesis pero más
que subconsulta sería una consulta ya que no se ejecuta
para cada fila de la tabla origen sino que se ejecuta una sola vez al
principio, su resultado se combina con las filas de la otra tabla para
formar las filas origen de la SELECT primera y no admite referencias externas.
En la cláusula FROM vimos que se podía
poner un nombre de tabla o un nombre de consulta, pues en vez de poner
un nombre de consulta se puede poner directamente la sentencia SELECT
correspondiente a esa consulta encerrada entre paréntesis.
|
|
Subconsulta
en las cláusulas WHERE y HAVING
|
|
Se suele utilizar subconsultas en las cláusulas WHERE o HAVING
cuando los datos que queremos visualizar están en una tabla pero
para seleccionar las filas de esa tabla necesitamos un dato que está
en otra tabla.
|
|
Ejemplo:
SELECT numemp, nombre
FROM empleados
WHERE contrato = (SELECT MIN(fechapedido) FROM pedidos)
En este ejemplo listamos el número y nombre de los empleados cuya
fecha de contrato sea igual a la primera fecha de todos los pedidos de
la empresa.
|
|
En una cláusula WHERE
/ HAVING tenemos siempre una condición
y la subconsulta actúa de operando dentro de esa condición.
En el ejemplo anterior se compara contrato con el resultado de la subconsulta.
Hasta ahora las condiciones estudiadas tenían como operandos valores
simples (el valor contenido en una columna de una fila de la tabla, el
resultado de una operación aritmética...) ahora la subconsulta
puede devolver una columna entera por lo que es necesario definir otro
tipo de condiciones especiales para
cuando se utilizan con subconsultas.
Estas nuevas condiciones se describen en la página siguiente...
|
|
Aviso legal: este curso es gratuito
siempre que se visualice desde la página web de aulaClic. No está
permitido descargar el curso ni utilizarlo en academias o centros de enseñanza
privados sin estar conectado a Internet.
|
© aulaClic. Todos los derechos reservados.
Free Computer tutorials .
Prohibida la reproducción por cualquier medio.
Junio-2001.aulaClic.com
|
|
|