Una
subconsulta es una instrucción SELECT anidada dentro de una
instrucción SELECT, SELECT...INTO, INSERT...INTO, DELETE, o
UPDATE o dentro de otra subconsulta.
Puede utilizar tres formas de sintaxis para crear una subconsulta:
comparación
[ANY | ALL | SOME] (instrucción sql)
expresión [NOT] IN (instrucción sql)
[NOT] EXISTS (instrucción sql)
En donde:
comparación
Es una
expresión y un operador de comparación que compara
la expresión con el resultado de la subconsulta.
expresión
Es una
expresión por la que se busca el conjunto resultante de la
subconsulta.
instrucción
sql
Es una
instrucción SELECT, que sigue el mismo formato y reglas que
cualquier otra instrucción SELECT. Debe ir entre paréntesis.
Se puede
utilizar una subconsulta en lugar de una expresión en la
lista de campos de una instrucción SELECT o en una cláusula
WHERE o HAVING. En una subconsulta, se utiliza una instrucción
SELECT para proporcionar un conjunto de uno o más valores
especificados para evaluar en la expresión de la cláusula
WHERE o HAVING.
Se puede
utilizar el predicado ANY o SOME, los cuales son sinónimos,
para recuperar registros de la consulta principal, que satisfagan
la comparación con cualquier otro registro recuperado en
la subconsulta. El ejemplo siguiente 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.:
SELECT
* FROM Productos WHERE PrecioUnidad > ANY
(SELECT PrecioUnidad FROM DetallePedido WHERE Descuento >= 0
.25);
El predicado
ALL se utiliza para recuperar únicamente aquellos registros
de la consulta principal que satisfacen la comparación con
todos los registros recuperados en la subconsulta. Si se cambia
ANY por ALL en el ejemplo anterior, la consulta devolverá
únicamente aquellos productos cuyo precio unitario sea mayor
que el de todos los productos vendidos con un descuento igual o
mayor al 25 por ciento. Esto es mucho más restrictivo.
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);
Inversamente
se puede utilizar NOT IN para recuperar únicamente aquellos
registros de la consulta principal para los que no hay ningún
registro de la subconsulta que contenga un valor igual.
El predicado
EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones
de verdad/falso para determinar si la subconsulta devuelve algún
registro.
Se puede
utilizar también alias del nombre de la tabla en una subconsulta
para referirse a tablas listadas en la cláusula FROM fuera
de la subconsulta. El ejemplo siguiente devuelve los nombres de
los empleados cuyo salario es igual o mayor que el salario medio
de todos los empleados con el mismo título. 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;
En el
ejemplo anterior , la palabra reservada AS es opcional.
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*"));
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 DISTINCTROW NombreProducto, Precio_Unidad FROM Productos
WHERE (Precio_Unidad = (SELECT Precio_Unidad FROM Productos WHERE
Nombre_Producto = "Almíbar anisado");
Obtiene una lista con el nombre y el precio unitario de todos los
productos con el mismo precio que el almíbar anisado.
SELECT DISTINCTROW Nombre_Contacto, Nombre_Compañia, Cargo_Contacto,
Telefono FROM Clientes WHERE (ID_Cliente IN (SELECT DISTINCTROW
ID_Cliente FROM Pedidos WHERE Fecha_Pedido >= #04/1/93# <#07/1/93#);
Obtiene una lista de las compañías y los contactos
de todos los clientes que han realizado un pedido en el segundo
trimestre de 1993.
SELECT Nombre, Apellidos FROM Empleados AS E WHERE EXISTS
(SELECT * FROM Pedidos AS O WHERE O.ID_Empleado = E.ID_Empleado);
Selecciona el nombre de todos los empleados que han reservado al
menos un pedido.
SELECT DISTINCTROW Pedidos.Id_Producto, Pedidos.Cantidad,
(SELECT DISTINCTROW Productos.Nombre FROM Productos WHERE
Productos.Id_Producto = Pedidos.Id_Producto) AS ElProducto FROM
Pedidos WHERE Pedidos.Cantidad > 150 ORDER BY Pedidos.Id_Producto,
Recupera el Código del Producto y la Cantidad pedida de la
tabla pedidos, extrayendo el nombre del producto de la tabla de
productos.
|