Você está na página 1de 30

01107335077856

FORID:11

ISO-8859-1

Buscar

www.desarrollow
Login | Registro
DesarrolloWeb.com > Manuales > Tutorial de SQL

Secciones Manuales Programas FAQs Directorio Vdeos En directo

Monotemticos Desde 0 Diseo web HTML CSS Javascript Ajax ASP PHP

Blogging Actualidad De inters Agenda

Usuarios Perfiles Registro Boletn

Subconsultas en SQL

Por Claudio

23 de enero de 2006 Valoracin:

0 votos

8 Comentarios Lenguaje SQL

Defenimos lo que significa subconsulta y mostramos las diferentes subconsultas que se pueden hacer.
Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, SELECT...INTO, 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) IN (instruccin sql) [NOT] EXISTS (instruccin sql)

expresin [NOT]

En donde:

comparacin expresin instruccin SQL

Es una expresin y un operador de comparacin que compara la expresin con el resultado de la subconsulta. Es una expresin por la que se busca el conjunto resultante de la subconsulta. Es una instruccin SELECT, que sigue el mismo formato y reglas que cualquier otra instruccin SELECT. Debe ir entre parntesis.

Se puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clusula WHERE o HAVING. En una subconsulta, se utiliza una instruccin SELECT para proporcionar un conjunto de uno o ms valores especificados para evaluar en la expresin de la clusula WHERE o HAVING.

Se puede utilizar el predicado ANY o SOME, los cuales son sinnimos, para recuperar registros de la consulta principal, que satisfagan la comparacin 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 comparacin 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 ms 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 ningn 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 algn registro. 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 )

Esta consulta es equivalente a esta otra:

SELECT Clientes.Compaa, Clientes.Telfono FROM Clientes WHERE IdClientes IN ( SELECT Pedidos.IdCliente FROM Pedidos )

Se puede utilizar tambin alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la clusula 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 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

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 DISTINCT NombreProducto, Precio_Unidad FROM Productos WHERE PrecioUnidad = ( SELECT PrecioUnidad FROM Productos WHERE NombreProducto = 'Almbar anisado' )

(Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almbar anisado.)

SELECT DISTINCT NombreContacto, NombreCompania, CargoContacto, Telefono FROM Clientes WHERE IdCliente IN ( SELECT DISTINCT IdCliente FROM Pedidos WHERE FechaPedido <#07/01/1993# )

(Obtiene una lista de las compaas 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.IdEmpleado = E.IdEmpleado )

(Selecciona el nombre de todos los empleados que han reservado al menos un pedido.)

SELECT DISTINCT Pedidos.Id_Producto, Pedidos.Cantidad, ( SELECT Productos.Nombre FROM Productos WHERE Productos.IdProducto = Pedidos.IdProducto ) AS ElProducto FROM Pedidos WHERE Pedidos.Cantidad = 150 ORDER BY Pedidos.Id_Producto

(Recupera el Cdigo del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre del producto de la tabla de productos.)

SELECT NumVuelo, Plazas FROM

Vuelos WHERE Origen = 'Madrid' AND Exists ( SELECT T1.NumVuelo FROM Vuelos AS T1 WHERE T1.PlazasLibres > 0 AND T1.NumVuelo=Vuelos.NumVuelo)

(Recupera nmeros de vuelo y capacidades de aquellos vuelos con destino Madrid y plazas libres

Supongamos ahora que tenemos una tabla con los identificadores de todos nuestros productos y el stock de cada uno de ellos. En otra tabla se encuentran todos los pedidos que tenemos pendientes de servir. Se trata de averiguar que productos no se podemos servir por falta de stock.

SELECT PedidosPendientes.Nombre FROM PedidosPendientes GROUP BY PedidosPendientes.Nombre HAVING SUM(PedidosPendientes.Cantidad < ( SELECT Productos.Stock FROM Productos WHERE Productos.IdProducto = PedidosPendientes.IdProducto ) )

Supongamos que en nuestra tabla de empleados deseamos buscar todas las mujeres cuya edad sea mayor a la de cualquier hombre:

SELECT Empleados.Nombre FROM Empleados

WHERE Sexo = 'M' AND Edad > ANY (SELECT Empleados.Edad FROM Empleados WHERE Sexo ='H')

lo que sera lo mismo:

SELECT Empleados.Nombre FROM Empleados WHERE Sexo = 'M' AND Edad > (SELECT Max( Empleados.Edad )FROM Empleados WHERE Sexo ='H')

La siguiente tabla muestra algn ejemplo del operador ANY y ALL

Valor 1 Operador Valor 2 Resultado 3 3 3 3 3 > ANY = ANY = ANY > ALL < ALL (2,5,7) (2,5,7) Cierto Falso

(2,3,5,7) Cierto (2,5,7) (5,6,7) Falso Falso

El operacion =ANY es equivalente al operador IN, ambos devuelven el mismo resultado.

Autor
Claudio
Subir

Manual

Tutorial de SQL

Criterios de seleccin en SQL II Consultas SQL de Unin Internas

Comentarios
Enviar un comentario al artculo

Manuel Cameselle

20/2/2006 0 votos Si no me equivoco el primer ejemplo tiene dos errores:

Antes de 'ANY' falta '>' En vez de '= 0.25' es '>= 0.25' (este error tambin aparece en el segundo ejemplo).

Marcar como spam

israel
25/11/2006 0 votos 3 <ALL (5.6.7) = falso (!!!perdoooon)

pues en que mundo vivimos

echenle ganas no

Marcar como spam

Anyelo
06/11/2008 0 votos Excelente esta el post, espero que algun dia realices un curso completo de esta poderosa herramienta gracias man. Marcar como spam

Jorling Mejia
28/5/2010 0 votos necesito ayuda tengo un problema con las subconsultas quisiera que me digan donde esta mi herror o cual es la forma correcta de hacerlo yo lo tengo asi:

SELECT dbo.RemisionOro.CodigoCliente, dbo.Cliente.NombreCliente, SUM(dbo.DetalleRemOro.TotalKilos) AS Kilos

FROM dbo.Cliente INNER JOIN

dbo.RemisionOro ON dbo.Cliente.CodigoCliente = dbo.RemisionOro.CodigoCliente INNER JOIN dbo.DetalleRemOro ON dbo.RemisionOro.NumRemisionOro = dbo.DetalleRemOro.NumRemisionOro

GROUP BY dbo.RemisionOro.CodigoCliente, dbo.Cliente.NombreCliente

HAVING SUM (dbo.DetalleRemOro.TotalKilos > ( select(dbo.RemisionOro.CodigoCliente

FROM dbo.RemisionOro INNER JOIN dbo.DetalleRemOro ON dbo.RemisionOro.NumRemisionOro = dbo.DetalleRemOro.NumRemisionOro INNER JOIN dbo.Cliente ON dbo.RemisionOro.CodigoCliente = dbo.Cliente.CodigoCliente WHERE (dbo.RemisionOro.CodigoCliente = '001'))) Marcar como spam

Vanessa Cruz
15/11/2010 0 votos Posible Error Cuando explican EXIST dan este ejemplo

SELECT Clientes.Compaa, Clientes.Telfono FROM Clientes WHERE EXISTS ( SELECT FROM Pedidos WHERE Pedidos.IdPedido = Clientes.IdCliente )

Hay un error al final porque deberia de ser Pedidos.IdCliente = Clientes.IdCliente, si no hay error entonces no entiendo el ejemplo =( Marcar como spam

Kalimdor
24/6/2011

0 votos La importancia de los ejemplos. Hola. El curso es muy bueno, sin embargo, es una lstima que, al llegar a los ejemplos, no concuerden con la explicacin y, en vez de aclarar la definicin (que es el objetivo de los ejemplos) conviertan todo en una nube de confusin. Gracias a los usuarios que estn ms claros en el tema, se logran ver algunos errores pero, y los que estn aprendiendo y que para eso estn leyendo este curso?... terminan enredndose ms! Sera bueno que tomen en cuenta estos comentarios porque, tambin, se ve que se comenta y se comenta, pero no arreglan los errores o, ni siquiera, son revisados los comentarios. Por favor, no daen con los pies lo que estn haciendo con las manos. Saludos. Marcar como spam

chris
10/4/2013 0 votos Herror sin ache Jorling Mejia tu error esta en la h Marcar como spam

reila
08/12/2013 0 votos gracias Muy util!!! Gracias. Marcar como spam

Enviar un comentario al artculo

Compartir

0 inCompartir

Usuarios: Login | Registro

Principales

Manuales FAQs En directo Vdeos

Monotemticos

Desde cero HTML, CSS Javascript, Ajax Diseo, ASP

Blogging

Actualidad De inters Agenda

Powered by:


Desarrolloweb.com

Copyright Publicidad Acerca de Datos legales Contacta

Subconsultas para SQL Server


(cmo aprovechar la funcionalidad de una subconsulta)
Fecha: 04/Oct/2005 (04/10/2005) Autor: Arbis Percy Reyes Paredes Email: bigpercynet@hotmail.com

http://percyreyes.blogspot.com - http://netarticles-percyreyes.blogspot.com

para empezar...
Este artculo sobre subconsultas para Microsoft SQL Server, pretende cubrir los puntos importantes evitando todo tipo de tecnicismos que muchas veces nos confunden a la hora de tratar este tema. Pues por ejemplo, podemos encontrarnos con mucha informacin terica que ciertamente terminan sumergindonos en un lo de conceptos. Aqu veremos desde cmo aprovechar la funcionalidad de una subconsulta hasta manejar el rendimiento de este, evaluando cuando hacer uso de ella y cuando no. Debo decirle que haremos us, en la mayora de ejmplos, de la base de datos Northwind y Pubs, espero se acuerde de ellos.

Como sabis, ell lenguaje SQL est compuesto por comandos (CREATE, DROP, ALTER, SELECT, INSERT, UPDATE, DELETE), clusulas(FROM, WHERE, GROUP BY, HAVING, ORDER BY), operadores lgicos (AND, OR, NOT) y de comparacin (<, >, =, LIKE, IN...), y funciones de agregado(AVG, COUNT, MAX, MIN, SUM), las cuales se combinan en las instrucciones para crear, actualizar y manipular las base de datos. Cuando se comprende el significado de estos comandos las consultas (tanto consultas internas o subconsultas, y externas) pueden verse bastante sencillas y realizar muchas operaciones contra la base datos con mucha facillidad. Para continuar, dejo por hecho que usted tiene conocimientos bsicos de SQL Server, entre ellas, los tipos de consultas.

entrndole a las subconsultas...

Volviendo al tema de la subconsultas, es propicio mencionar que una subconsulta es una instruccin SELECT anidada dentro de otra instruccin SELECT: SELECT INTO, INSERT INTO, DELETE, o UPDATE o dentro de otra subconsulta.Los formatos para las instrucciones de subconsultas son las siguientes:

WHERE expression [NOT] IN (subconsulta) WHERE expression operador_comparacion [ANY | ALL] (subconsulta) WHERE [NOT] EXISTS (subconsulta )

Una subconsulta puede devolver:

1. Una sola columna o un solo valor en cualquier lugar en donde pueda utilizarse una expresin de un slo valor y puede compararse usando los siguientes operadores: =,<,>,<=,>= ,<>,!> y !<. 2. Una sola columna o muchos valores que se pueden utilizar con el operador de comparacin de listas IN en la clusula WHERE. 3. Muchas filas que pueden utilizarse para comprobar la existencia, usando la palabra EXISTS en la clusula WHERE.

Se puede usar el predicado ANY o SOME, para recuperar registros de la consulta principal, que satisfagan la comparacin con cualquier otro registro recuperado en la subconsulta. Ejemplo:

En ejemplo anterior se usa el operador de comparacin >, es as que, >ALL significa mayor que cualquier valor; es decir, mayor que el valor mximo. Por ejemplo, >ALL (1, 2, 3,....7) significa mayor que 7. De manera similar, >ANY significa mayor que, como mnimo, un valor, es decir, mayor que el mnimo. En consecuencia, >ANY (1, 2, 3, ... 7) significa mayor que 1. Aqu otro ejemplo:

NOTA: los dos ejemplos anteriores fueron obtenidos directamente de la Documentacin de Microsoft SQL Server.

En el proceso de trabajo con subconsultas, necesariamente manejaremos dos tipos de consultas: consultas internas y consultas externas. Las consultas internas no es ms que las subconsultas propiamente dichas y la consultas externa es aquella que hace uso de los resultados devueltos por la consulta interna o subconsulta. En todo este rollo, tambin se harn uso del predicado IN. La consulta externa usa el predicado IN para operar con los valores devueltos por la subconsulta. Ejemplo:

Por otra parte, cuando se presenta una subconsulta con la palabra clave EXISTS, funciona como una prueba de existencia. La clusula WHERE de la consulta externa comprueba la existencia de las filas devueltas por la subconsulta. La subconsulta en realidad no produce ningn dato, devuelve el valor TRUE o FALSE.

Subconsultas en las instrucciones UPDATE, DELETE e INSERT

Es posible anidar las subconsultas en este tipo de instrucciones. Pero dejndo de lado la teora, creo que para entender mejor esta parte haremos uso de unos ejemplos...

INSERT

UPDATE

DELETE

rendimiento y resultados...
En muchos casos puede usarse una operacin de combinacin en lugar de una consulta, no obstante algunas instancias pueden procesarse solo con una subconsulta. En algunos casos una operacin de combinacin puede producir un mejor rendimiento que una subconsulta, pero por lo general se observa muy poca diferencia en el rendimiento. Sin embargo, el uso de grandes anidamientos de subconsultas puede afectar seriamente el rendimiento. Creo que ya nos metimos en un lo entre cuestiones de rendimiento y calidad de resultados. De manera general la utilizacin de combinaciones producir los mejores resultados. Vemos un ejemplo...

Haciendo uso de una subconsulta podramos realizar la siguiente consulta:

Formulando la anterior subconsulta como una combinacin...

La subconsulta siempre est encerrada entre parntesis y a menos que se vaya a ejecutar una subconsulta correlacionada termina antes de que se procese la consulta externa. Una subconsulta puede contener otra subconsulta, y esta subconsulta puede, a su vez, contener otra subconsulta, ... y as sucesivamente. Los recursos del sistema(como la memoria disponible) limitan el nmero de subconsultas que pueden procesarce. Se puede anidar subconsultas hasta 32 niveles, pero esto como le mencion, depende de los recursos disponibles del sistema. He aqu otro "botn" como ejemplo.

Formulando la anterior subconsulta como una combinacin...

Todo esto fue por esta vez, espero haber contribuido a aclarar este tema.

Subconsultas
Subconsultas

Definicin de subconsultas.

Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT. Normalmente se utilizan para filtrar una clausula WHERE o HAVING con el conjunto de resultados de la subconsulta, aunque tambin pueden utilizarse en la lista de seleccin.

Por ejemplo podriamos consultar el alquirer ltimo de un cliente.

SELECT CO_CLIENTE, NOMBRE, MARCA, MODDELO FROM ALQUILERES WHERE CO_CLIENTE = 1 AND FECHA_ALQUILER = (SELECT MAX(FECHA_ALQUILER) FROM ALQUILERES WHERE CO_CLIENTE = 1)

En este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la mxima fecha de alquier, y posteriormente se obtienen los datos de la consulta principal.

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 reestricciones:

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.

Cuando se ejecuta una consulta que contiene una subconsulta con referencias externas, la subconsulta se ejecuta por cada fila de la consulta principal.

En este ejemplo la subconsulta aparece en la lista de seleccin, ejecutandose 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') )

Los resultados que se obtienen con subconsultas normalmente pueden conseguirse a travs de consultas combinadas ( JOIN ).

SELECT

CO_EMPLEADO, NOMBRE

FROM EMPLEADOS WHERE ESTADO IN (SELECT ESTADO FROM ESTADOS WHERE ACTIVO = 'S')

Podr escribirse como :

SELECT

CO_EMPLEADO, NOMBRE

FROM EMPLEADOS, ESTADOS WHERE EMPLEADOS.ESTADO = ESTADOS.ESTADO AND ESTADOS.ACTIVO = 'S'

Normalmente es ms rpido utilizar un JOIN en lugar de una subconsulta, aunque esto depende sobre todo del diseo de la base de datos y del volumen de datos que tenga.

Utilizacion 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(SALIRO_BRUTO) FROM NOMINAS WHERE NOMINAS.CO_EMPLEADO = EMPLEADOS.CO_EMPLEADO) WHERE SALARIO_BRUTO IS NULL

La funcin EXISTS

EXISTS es una funcin SQL que devuelve veradero cuando una subconsulta retorna al menos una fila.

SELECT

CO_CLIENTE, NOMBRE

FROM CLIENTES WHERE EXISTS ( SELECT * FROM MOROSOS WHERE CO_CLIENTE = CLIENTES.CO_CLIENTE AND PAGADO = 'N')

La funcin EXISTS puede ser utilizada en cualquier sentencia SQL vida, SELECT, UPDATE, INSERT o DELETE.

Subconsultas
BASES DE DATOS-SQL-SENTENCIAS SQL-SUBCONSULTAS

Una subconsulta es una instruccin SELECT anidada dentro de una instruccin SELECT, SELECT...INTO, 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.

Se puede utilizar una subconsulta en lugar de una expresin en la lista de campos de una instruccin SELECT o en una clusula WHERE o HAVING. En una subconsulta, se utiliza una instruccin SELECT para proporcionar un conjunto de uno o ms valores especificados para evaluar en la expresin de la clusula WHERE o HAVING.

Se puede utilizar el predicado ANY o SOME, los cuales son sinnimos, para recuperar registros de la consulta principal, que satisfagan la comparacin 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 comparacin 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 ms 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 ningn 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 algn registro. 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 )

Esta consulta es equivalente a esta otra:

SELECT Clientes.Compaa, Clientes.Telfono FROM Clientes WHERE IdClientes IN ( SELECT Pedidos.IdCliente FROM Pedidos )

Se puede utilizar tambin alias del nombre de la tabla en una subconsulta para referirse a tablas listadas en la clusula 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 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

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 DISTINCT NombreProducto, Precio_Unidad FROM Productos WHERE PrecioUnidad = ( SELECT PrecioUnidad FROM Productos WHERE

NombreProducto = 'Almbar anisado' ) (Obtiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almbar anisado.) SELECT DISTINCT NombreContacto, NombreCompania, CargoContacto, Telefono FROM Clientes WHERE IdCliente IN ( SELECT DISTINCT IdCliente FROM Pedidos WHERE FechaPedido <#07/01/1993# ) (Obtiene una lista de las compaas 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.IdEmpleado = E.IdEmpleado ) (Selecciona el nombre de todos los empleados que han reservado al menos un pedido.) SELECT DISTINCT Pedidos.Id_Producto, Pedidos.Cantidad, ( SELECT Productos.Nombre FROM Productos WHERE Productos.IdProducto = Pedidos.IdProducto

) AS ElProducto FROM Pedidos WHERE Pedidos.Cantidad = 150 ORDER BY Pedidos.Id_Producto (Recupera el Cdigo del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre del producto de la tabla de productos.) SELECT NumVuelo, Plazas FROM Vuelos WHERE Origen = 'Madrid' AND Exists ( SELECT T1.NumVuelo FROM Vuelos AS T1 WHERE T1.PlazasLibres > 0 AND T1.NumVuelo=Vuelos.NumVuelo) (Recupera nmeros de vuelo y capacidades de aquellos vuelos con destino Madrid y plazas libres

Supongamos ahora que tenemos una tabla con los identificadores de todos nuestros productos y el stock de cada uno de ellos. En otra tabla se encuentran todos los pedidos que tenemos pendientes de servir. Se trata de averiguar que productos no se podemos servir por falta de stock.

SELECT PedidosPendientes.Nombre FROM PedidosPendientes GROUP BY PedidosPendientes.Nombre HAVING SUM(PedidosPendientes.Cantidad < ( SELECT Productos.Stock FROM Productos WHERE

Productos.IdProducto = PedidosPendientes.IdProducto ) )

Supongamos que en nuestra tabla de empleados deseamos buscar todas las mujeres cuya edad sea mayor a la de cualquier hombre:

SELECT Empleados.Nombre FROM Empleados WHERE Sexo = 'M' AND Edad > ANY (SELECT Empleados.Edad FROM Empleados WHERE Sexo ='H')

lo que sera lo mismo:

SELECT Empleados.Nombre FROM Empleados WHERE Sexo = 'M' AND Edad > (SELECT Max( Empleados.Edad )FROM Empleados WHERE Sexo ='H')

La siguiente tabla muestra algn ejemplo del operador ANY y ALL

Valor 1 3 3 3 3 3

Operador > ANY = ANY = ANY > ALL < ALL

Valor 2 (2,5,7) (2,5,7) (2,3,5,7) (2,5,7) (5,6,7)

Resultado Cierto Falso Cierto Falso Falso

El operacion =ANY es equivalente al operador IN, ambos devuelven el mismo resultado.

Para concluir este apartado comentar que: la clusula EXISTS se puede emplear para generar la interseccin entre dos consultas y, por tanto, la clusula NOT EXISTS para generar la diferencia entre consultas.

Você também pode gostar