jueves, 21 de febrero de 2008

Subconsultas

Definición de subconsultas.

Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT. Normalmente se utilizan para filtrar una clausula WHERE o HAVING con el conjunto de resultados de la subconsulta, aunque también pueden utilizarse en la lista de selección.

Por ejemplo podriamos consultar el alquirer último de un cliente.


SELECT CO_CLIENTE, NOMBRE, MARCA, MODDELO
FROM ALQUILERES
WHERE CO_CLIENTE = 1
AND FECHA_ALQUILER = (SELECT MAX(FECHA_ALQUILER)
FROM ALQUILERES
WHERE CO_CLIENTE = 1)


En este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la máxima fecha de alquier, y posteriormente se obtienen los datos de la consulta principal.

Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre paréntesis.

La subconsulta se puede encontrar en la lista de selección, en la cláusula WHERE o en la cláusula HAVING de la consulta principal.

Tiene las siguientes reestricciones:

  • No puede contener la cláusula ORDER BY
  • No puede ser la UNION de varias sentencias SELECT
  • Si la subconsulta aparece en la lista de selección,o esta asociada a un operador igual "=" solo puede devolver un único registro.

Referencias externas

A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una columna de la fila actual en la consulta principal, ese nombre de columna se denomina referencia externa.

Una referencia externa es un campo que aparece en la subconsulta pero se refiere a la una de las tablas designadas en la consulta principal.

Cuando se ejecuta una consulta que contiene una subconsulta con referencias externas, la subconsulta se ejecuta por cada fila de la consulta principal.

En este ejemplo la subconsulta aparece en la lista de selección, ejecutandose una vez por cada fila que devuelve la consulta principal.


SELECT CO_EMPLEADO,
NOMBRE,
(SELECT MIN(FECHA_NOMINA)
FROM NOMINAS
WHERE CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO)
PRIMERA_NOMINA
FROM EMPLEADOS;

Anidar subconsultas

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.


SELECT CO_EMPLEADO,
EMPLEADOS
FROM EMPLEADOS
WHERE CO_EMPLEADO IN (SELECT CO_EMPLEADO
FROM NOMINAS
WHERE ESTADO IN ( SELECT ESTADO
FROM ESTADOS_NOMINAS
WHERE EMITIDO = 'S'
AND PAGADO = 'N')
)

Los resultados que se obtienen con subconsultas normalmente pueden conseguirse a través de consultas combinadas ( JOIN ).


SELECT CO_EMPLEADO,
NOMBRE
FROM EMPLEADOS
WHERE ESTADO IN (SELECT ESTADO
FROM ESTADOS
WHERE ACTIVO = 'S')

Podrá escribirse como :


SELECT CO_EMPLEADO,
NOMBRE
FROM EMPLEADOS, ESTADOS
WHERE EMPLEADOS.ESTADO = ESTADOS.ESTADO
AND ESTADOS.ACTIVO = 'S'

Normalmente es más rápido utilizar un JOIN en lugar de una subconsulta, aunque esto depende sobre todo del diseño de la base de datos y del volumen de datos que tenga.

Utilizacion de subconsultas con UPDATE

Podemos utilizar subconsultas también en consultas de actualización conjuntamente con UPDATE. Normalmente se utilizan para "copiar" el valor de otra tabla.


UPDATE EMPLEADOS
SET SALARIO_BRUTO = (SELECT SUM(SALIRO_BRUTO)
FROM NOMINAS
WHERE NOMINAS.CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO)
WHERE SALARIO_BRUTO IS NULL


La función EXISTS

EXISTS es una función SQL que devuelve veradero cuando una subconsulta retorna al menos una fila.


SELECT CO_CLIENTE,
NOMBRE
FROM CLIENTES
WHERE EXISTS ( SELECT *
FROM MOROSOS
WHERE CO_CLIENTE = CLIENTES.CO_CLIENTE
AND PAGADO = 'N')

La función EXISTS puede ser utilizada en cualquier sentencia SQL váida, SELECT, UPDATE, INSERT o DELETE.

1 comentario:

Anónimo dijo...

Gracias, me aclaro muchas dudas