7. SubConsultas

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.

Siguiente capítulo: Consultas
y Referencias Cruzadas

banner

  1. Introducción
  2. Consultas
    de Selección
  3. Criterios
    de Selección
  4. Agrupamiento
    de Registros y Funciones Agregadas
  5. Consultas
    de Actualización
  6. Tipos
    de Datos
  7. SubConsultas
  8. Consultas
    y Referencias Cruzadas
  9. Consultas
    de Unión Interna
  10. Consultas
    de Unión Externas
  11. Estructuras
    de las Tablas
  12. Consultas
    con Parámetros
  13. Acceso
    a las Bases de Datos Externas
  14. Omitir los permisos de ejecución
  15. La
    Cláusula Procedure
  16. Anexos