Está en la página 1de 14

SUBCONSULTAS

Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta. Puede utilizar tres formas de sintaxis para crear una subconsulta: comparacin [ANY | ALL | SOME] (instruccin SQL) expresin [NOT] IN (instruccin SQL) [NOT] EXISTS (instruccin SQL) En donde: Comparacin: Es una expresin y un operador de comparacin que compara la expresin con el resultado de la subconsulta. Expresin: Es una expresin por la que se busca el conjunto resultante de la subconsulta. instruccin SQL: Es una instruccin SELECT, que sigue el mismo formato y reglas que cualquier otra instruccin SELECT. Debe ir entre parntesis

Este ejemplo devuelve todos los productos cuyo precio unitario es mayor que el de cualquier producto vendido con un descuento igual o mayor al 25 por ciento:

EJEMPLOS

SELECT * FROM Productos WHERE PrecioUnidad ANY ( SELECT PrecioUnidad FROM DetallePedido WHERE Descuento> = 0 .25 )

El predicado IN se emplea para recuperar nicamente aquellos registros de la consulta principal para los que algunos registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los productos vendidos con un descuento igual o mayor al 25 por ciento: SELECT * FROM Productos WHERE IDProducto IN ( SELECT IDProducto FROM DetallePedido WHERE Descuento >= 0.25 )

PREDICADO IN

PREDICADOEXISTS
El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso para determinar si la subconsulta devuelve algn registro. EXISTS es una funcin SQL que devuelve verdadero cuando una subconsulta retorna al menos una fila. Supongamos que deseamos recuperar todos aquellos clientes que hayan realizado al menos un pedido: SELECT Clientes.Compaa, Clientes.Telfono FROM Clientes WHERE EXISTS ( SELECT FROM Pedidos WHERE Pedidos.IdPedido = Clientes.IdCliente SELECT CO_CLIENTE, NOMBRE FROM CLIENTES WHERE EXISTS ( SELECT * FROM MOROSOS WHERE CO_CLIENTE = CLIENTES.CO_CLIENTE AND PAGADO = 'N')

Esta consulta es equivalente a la anterior primera consulta SELECT Clientes.Compaa, Clientes.Telfono FROM Clientes WHERE IdClientes IN ( SELECT Pedidos.IdCliente FROM Pedidos )

EJEMPLO UTILIZANDO ALIAS El siguiente ejemplo devuelve los nombres de los empleados cuyo salario es igual o mayor que el salario medio de todos los empleados con el mismo ttulo. A la tabla Empleados se le ha dado el alias T1: SELECT Apellido, Nombre, Titulo, Salario FROM Empleados AS T1 WHERE Salario >= ( SELECT Avg(Salario) FROM Empleados WHERE T1.Titulo = Empleados.Titulo ) ORDER BY Titulo

SELECT Apellidos, Nombre, Cargo, Salario FROM Empleados WHERE Cargo LIKE 'Agente Ven*'AND Salario ALL ( SELECT Salario FROM Empleados WHERE Cargo LIKE '*Jefe* OR Cargo LIKE '*Director*' ) La anterior consulta Obtiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el de todos los jefes y directores.

SELECT DISTINCT NombreProducto, Precio_Unidad FROM Productos WHERE PrecioUnidad = ( SELECT PrecioUnidad FROM Productos WHERE NombreProducto = 'Almbar anisado
)

SELECT DISTINCT NombreContacto, NombreCompania, CargoContacto, Telefono FROM Clientes WHERE IdCliente IN ( SELECT DISTINCT IdCliente FROM Pedidos WHERE FechaPedido =07/01/2010 )

Selecciona el nombre de todos los empleados que han reservado al menos un pedido.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS ( SELECT * FROM Pedidos AS O WHERE O.IdEmpleado = E.IdEmpleado ) Seleccione las mujeres que tienen la edad de cualquier edad de un hombre SELECT Empleados.Nombre FROM Empleados WHERE Sexo = 'M' AND Edad > ANY (SELECT Empleados.Edad FROM Empleados WHERE Sexo ='H')

consultar el alquiler ltimo de un cliente. SELECT CO_CLIENTE, NOMBRE, MARCA, MODELO FROM ALQUILERES WHERE CO_CLIENTE = 1 AND FECHA_ALQUILER = (SELECT MAX(FECHA_ALQUILER) FROM ALQUILERES WHERE CO_CLIENTE = 1) Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre parntesis. La subconsulta se puede encontrar en la lista de seleccin, en la clusula WHERE o en la clusula HAVING de la consulta principal. Tiene las siguientes restricciones: No puede contener la clusula ORDER BY No puede ser la UNION de varias sentencias SELECT Si la subconsulta aparece en la lista de seleccin, 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. En este ejemplo la subconsulta aparece en la lista de seleccin, ejecutndose 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 clusula 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')

UTILIZACIN DE SUBCONSULTAS CON UPDATE


Podemos utilizar subconsultas tambin en consultas de actualizacin conjuntamente con UPDATE. Normalmente se utilizan para "copiar" el valor de otra tabla. UPDATE EMPLEADOS SET SALARIO_BRUTO = (SELECT SUM(SALARIO_BRUTO) FROM NOMINAS WHERE NOMINAS.CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO) WHERE SALARIO_BRUTO IS NULL

SUBCONSULTA CON INSERT

También podría gustarte