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.
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
- Introducción
- Consultas
de Selección - Criterios
de Selección - Agrupamiento
de Registros y Funciones Agregadas - Consultas
de Actualización - Tipos
de Datos - SubConsultas
- Consultas
y Referencias Cruzadas - Consultas
de Unión Interna - Consultas
de Unión Externas - Estructuras
de las Tablas - Consultas
con Parámetros - Acceso
a las Bases de Datos Externas - Omitir los permisos de ejecución
- La
Cláusula Procedure - Anexos
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
por que en la primera estas anidando pero, realmente no estas arrojando ningun resultado
hola necesito me ayuden en esto:
estoy trab. con access y tengo el resultado de 2 consultas:
TablaConsulta 1 TablaConsulta 2
Id Val Id Val
1 56 1 5
3 45 2 4
4 12 4 12
resulta que necesito unir las tablas pero los Id guales restarlos de manera que TablaConsulta 1.Id – TablaConsulta 2.Id Where TablaConsulta 1.Id = TablaConsulta 2.Id
ya lo he logrado en access pero en vez tratar con el nombre de la consulta, necesito tratar con la consulta como tal porque la voy a ejecutar desde C++, suponiendo que no exista en mi BD dichas consultas ya ejecutadas…..
Cualquier aporte sera util sin dudas…
Muchas gracias.
disculpen:
las tablas se distorcionaron a su manera, serian:
TablaConsulta 1
Id Val
1 56
3 45
4 12
TablaConsulta 2
Id Val
1 5
2 4
4 12
y el resto ya saben , Gracias
lo necesito por favor
Hi! Ebanij vrot! oryddhoxmy t5va5ic6fg! ; Doent Fax Loan No Payday 2
que es un subquery
Muy Interesante Este Tema, aunque quizas tendriamos que explicarlo de una forma mas grafica,Saludos!!
Bueno buenas noches porimero que nada mi pregunta va por este lado, al momento de hacer una consulta que quiero que me arroje 2 resultados iguales, por ejemplo nomre y nombre pero uno de ellos debe de llevar un formacion diferente, me podrian ayudar diciendome que camino debo seguir
hola
me parece muy interesante los datos dados
kisiera saber si me podrias dar ejercicios de sql pero desde donde toque analisarlos uno mismo….por fa te lo recomiendo…
gracias.