Estás en Inicio / Editorial / Bases de Datos
10.08.2003
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.
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

Califica esta nota:
Claudio Casares
Redactor del tutorial de SQL
Si eres nuevo en Maestros del Web y te agradan nuestras publicaciones, te invitamos a suscribirte a nuestro Feed.
Sindícanos en: Google Reader, Bloglines, My Yahoo o My MSN | ¿Qué es el Feed?
3 comentarios en total.
esta chido el tutorial, me ha servido de mucho
Tengo un problema con las subconsultas en MySQL y espero que me puedan ayudar.
Estoy realizando un ejemplo muy sencillo y redundante para asegurarme de que estoy haciendo lo correcto.
Esta sentencia SQL: “SELECT cod_tramite FROM tramites WHERE cod_tramite IN ( SELECT cod_tramite FROM tramites )” me arroja el siguiente error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘SELECT cod_tramite FROM tramites ) LIMIT 0, 30′ at line 1.
Sin embargo si utilizo esta sentencia: “SELECT cod_tramite FROM tramites WHERE cod_tramite IN ( 1,2,3 )” funciona bien.
Alguna sugerencia?
y si le borras las comillas
Maestros del Web es el punto de encuentro para los entusiastas de la red.
Creative Commons by-nc-sa 3.0 | Política de Privacidad | CMS: Wordpress