Você está na página 1de 9

Consultas avanzadas (multitabla)

Consultas de Combinacin entre tablas. Las vinculaciones entre tablas se realizan mediante la clusula INNER que combina registros de dos tablas siempre que haya concordancia de valores en un campo comn. Su sintaxis es: SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2 En donde: tb1, tb2 campo1, campo2 comp Son los nombres de las tablas desde las que se combinan los registros. Son los nombres de los campos que se combinan. Si no son numricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre. Es cualquier operador de comparacin relacional: =, <,<>, <=, =>, >.

Se puede utilizar una operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones equivalentes son las ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn a ambas tablas. Se puede utilizar INNER JOIN con las tablas Departamentos y Empleados para seleccionar todos los empleados de cada departamento. Por el contrario, para seleccionar todos los departamentos (incluso si alguno de ellos no tiene ningn empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no est asignado a ningn departamento), en este caso RIGHT JOIN. El ejemplo siguiente muestra cmo podra combinar las tablas Categoras y Productos basndose en el campo IDCategoria: SELECT NombreCategoria, NombreProducto FROM Categorias INNER JOIN Productos ON Categorias.IDCategoria = Productos.IDCategoria En el ejemplo anterior, IDCategoria es el campo combinado, pero no est incluido en la salida de la consulta ya que no est incluido en la instruccin SELECT. Para incluir el campo combinado, incluir el nombre del campo en la instruccin SELECT, en este caso, Categorias.IDCategoria. Tambin se pueden enlazar varias clusulas ON en una instruccin JOIN, utilizando la sintaxis siguiente: SELECT campos FROM tabla1 INNER JOIN tabla2 ON (tb1.campo1 comp tb2.campo1 AND ON tb1.campo2 comp tb2.campo2) OR ON (tb1.campo3 comp tb2.campo3) Tambin puede anidar instrucciones JOIN utilizando la siguiente sintaxis:

SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3 [INNER JOIN [( ]tablax [INNER JOIN ...)] ON tb3.campo3 comp tbx.campox)] ON tb2.campo2 comp tb3.campo3) ON tb1.campo1 comp tb2.campo2 Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN. Ejemplo:
SELECT Sum(d.PrecioUnidad * d.Cantidad) AS Ventas, (e.Nombre + ' ' + e.Apellidos) AS Nombres FROM Empleados as E INNER JOIN( Pedidos as P INNER JOIN [Detalles de pedidos] as D ON P.IdPedido = d.IdPedido) ON E.IdEmpleado = P.IdEmpleado GROUP BY e.Nombre + ' ' + e.Apellidos

(Crea dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra entre las tablas Pedidos y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos de ventas y la tabla Detalles de pedidos no contiene datos de los empleados. La consulta produce una lista de empleados y sus ventas totales.) Si empleamos la clusula INNER en la consulta se seleccionarn slo aquellos registros de la tabla de la que hayamos escrito a la izquierda de INNER JOIN que contengan al menos un registro de la tabla que hayamos escrito a la derecha. Para solucionar esto tenemos dos clusulas que sustituyen a la palabra clave INNER, estas clusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda aunque no tengan ningn registro en la tabla de la izquierda. RIGHT realiza la misma operacin pero al contrario, toma todos los registros de la tabla de la derecha aunque no tenga ningn registro en la tabla de la izquierda. La sintaxis expuesta anteriormente pertenece a ACCESS, en donde todas las sentencias con la sintaxis funcionan correctamente. Los manuales de SQL-SERVER dicen que esta sintaxis es incorrecta y que hay que aadir la palabra reservada OUTER: LEFT OUTER JOIN y RIGHT OUTER JOIN. En la prctica funciona correctamente de una u otra forma.

SELECT pedidos.*, [Detalles de pedidos].* FROM pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.IdPedido = [Detalles de pedidos].Idpedido WHERE Pedidos.IdPedido = 10248

Consultas de Autocombinacin
La autocombinacin se utiliza para unir una tabla consigo misma, comparando valores de dos columnas con el mismo tipo de datos. La sintaxis en la siguiente: SELECT alias1.columna, alias2.columna, ... FROM tabla1 as alias1, tabla2 as alias2 WHERE alias1.columna = alias2.columna AND otras condiciones

Otra forma de obtener los resultados anteriores es de la siguiente forma:


SELECT pedidos.*, [Detalles de pedidos].* FROM pedidos,[Detalles de pedidos] WHERE Pedidos.IdPedido = [Detalles de pedidos].Idpedido and Pedidos.IdPedido = 10248

Como se puede observar los cambios realizados han sido los siguientes: 1. Todas las tablas que intervienen en la consulta se especifican en la clusula FROM. 2. Las condiciones que vinculan a las tablas se especifican en la clusula WHERE y se vinculan mediante el operador lgico AND.

En SQL-SERVER se puede utilizar una sintaxis parecida, sino los caracteres =* para el LEFT JOIN y *= para el RIGHT JOIN.

Por ejemplo, para visualizar el nmero, nombre y puesto de cada empleado, junto con el nmero, nombre y puesto del supervisor de cada uno de ellos se utilizara la siguiente sentencia:
SELECT t.IdEmpleado,t.Nombre,t.Apellidos,t.Cargo,t.Jefe,s.Nombre,s.Cargo FROM empleados AS t, empleados AS s WHERE t.jefe = s.IdEmpleado

Consultas de Combinaciones no Comunes


La mayora de las combinaciones estn basadas en la igualdad de valores de las columnas que son el criterio de la combinacin. Las no comunes se basan en otros operadores de combinacin, tales como NOT, BETWEEN, <>, etc. Por ejemplo, para listar el grado salarial, nombre, salario y puesto de cada empleado ordenando el resultado por grado y salario habra que ejecutar la siguiente sentencia: SELECT grados.grado,empleados.nombre, empleados.salario, empleados.puesto FROM empleados, grados WHERE empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior ORDER BY grados.grado, empleados.salario Para listar el salario medio dentro de cada grado salarial habra que lanzar esta otra sentencia: SELECT grados.grado, AVG(empleados.salario) FROM empleados, grados WHERE empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior GROUP BY grados.grado

CROSS JOIN (SQL-SERVER)


Se utiliza en SQL-SERVER para realizar consultas de unin. Supongamos que tenemos una tabla con todos los autores y otra con todos los libros. Si deseramos obtener un listado combinar ambas tablas de tal forma que cada autor apareciera junto a cada ttulo, utilizaramos la siguiente sintaxis: SELECT Autores.Nombre, Libros.Titulo FROM Autores CROSS JOIN Libros

Ejemplos de consultas avanzadas


1. Elaborar una consulta que me permita visualizar el nombre del producto, con su precio respectivo agregando el nombre de la categora a la que pertenece.
select p.IdProducto, p.NombreProducto,p.PrecioUnidad,c.IdCategora,c.NombreCategora from Productos as P , Categoras as c where P.IdCategora = c.IdCategora

Utilizando inner join:


select p.IdProducto, p.NombreProducto,p.PrecioUnidad,c.IdCategora,c.NombreCategora from Productos as P inner join Categoras as c on P.IdCategora = c.IdCategora

2. Obtener el nombre de los proveedores y los productos que estos suministran ordenados por el nombre del proveedor
USE Nwind GO SELECT PV.NombreCompaa , P.NombreProducto FROM Proveedores AS PV INNER JOIN Productos AS P ON PV.IdProveedor = P.IdProveedor ORDER BY 1

3. Obtener el idProducto, NombreProducto y el nombre categora. Utilice una combinacin de las tablas productos y categoras
USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategora FROM Productos AS P INNER JOIN Categoras AS C ON P.IdCategora=C.IdCategora

4. El ejemplo siguiente retorna el IdPedido, FechaPedido y todas las columnas de la tabla cliente. Esta consulta nos responde a la pregunta Mustrame todos los nmeros de pedidos, fecha y todos los datos del cliente que hizo el pedido.
USE Nwind GO SELECT P.IdPedido, P.FechaPedido, C.* FROM Pedidos AS P INNER JOIN Clientes AS C ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente

5. Obtener el idproducto, NombreProducto, el NombreCategoria y el nombre compaa donde IdProveedor es igual a 1. Utilice una combinacin de las tablas Productos, Categoras y Proveedores. (Combinacin de tres tablas)
USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategora, PV.NombreCompaa FROM Productos AS P INNER JOIN Categoras AS C ON P.IdCategora=C.IdCategora INNER JOIN Proveedores AS PV ON P.IdProveedor= PV.IdProveedor WHERE P.IdProveedor= 1

6. El siguiente ejemplo retorna las columnas IdCliente, NombreCompaa, de la tabla Clientes utilizando una combinacin Externa izquierda (LEFT OUTER JOIN) con la tabla pedidos. De esta tabla obtiene las columnas IdPedido y FechaPedido.
USE Nwind GO SELECT C.IdCliente, C.NombreCompaa, P.IdPedido, P.FechaPedido FROM Clientes AS C LEFT OUTER JOIN Pedidos AS P ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente

Al efectuar la consulta se obtiene 832 filas observe en el grafico los valores null para las dos primeras filas, esto significa que nos retorna clientes que no tienen pedidos realizados. En lugar de LEFT OUTER JOIN utilice INNER JOIN esta consulta retorna 830 filas afectadas la diferencia es de 2 que es el nmero de clientes que no tienen pedidos. 7. El siguiente ejemplo retorna las columnas IdPedido de la tabla pedidos y nombre compaa de la tabla compaa de envos utilizando una combinacin externa derecha RIGHT OUTER JOIN
USE Nwind GO INSERT [Compaas de Envos] VALUES (4, 'Aero Condor', '(503) 555-8831') INSERT [Compaas de Envos] VALUES (5, 'American Express', '(503) 555-9761') INSERT [Compaas de Envos] VALUES (6, 'Amazonas S.A.', '(503) 555-2231') USE Nwind GO SELECT P.IdPedido, CE.NombreCompaa FROM Pedidos AS P RIGHT OUTER JOIN [Compaas de Envos] AS CE ON P.FormaEnvo = CE.IdcompaaEnvos ORDER BY 2 GO

8. EL EJEMPLO siguiente retorna las columnas NombreCompaa , ciudad y Pas de los Clientes que residen en el mismo pas de la empresa Antonio Moreno Taquera.
USE Nwind GO SELECT NombreCompaa,Ciudad,Pas FROM Clientes WHERE Pas IN (SELECT Pas FROM Clientes WHERE NombreCompaa="Antonio Moreno Taquera")

9. El siguiente ejemplo es similar al anterior retorna los clientes que residen en un paios diferente al de Antonio Moreno Taquera. Se utiliza la palabra clave Not IN
USE Nwind GO SELECT NombreCompaa,Ciudad,Pas FROM Clientes WHERE Pas NOT IN (SELECT Pas FROM Clientes WHERE NombreCompaa="Antonio Moreno Taquera")

Ejercicios Propuestos
1. Elaborar una consulta que me muestre el valor mximo y el valor mnimo de los productos abastecidos por el proveedor Pavlova, Ltd. 2. Utilizando count ,Elaborar una consulta que muestre cuantos pedidos realiz HILARINAbastos 3. Utilizando count , Elaborar una consulta que muestre cuantos clientes residen en Alemania 4. Utilizando group by, elaborar una consulta que muestre cuantos productos existen por categora. 5. Obtener todos los pedidos agrupados por el nombre de compaa. 6. Obtener el nombre de los productos, de aquellos cuyo precio unitario sea igual al del producto con el nombre Licor Cloudberry. 7. Obtener el nombre completo de los empleados que hayan efectuado pedidos entre las fechas 12/06/2010 al 12/12/2010 8. Obtener el nombre de los productos adquiridos por el cliente con el cdigo de Wolza. 9. Obtener el nombre de los productos y las unidades vendidas de los productos que pertenecen al cdigo de categora 4 10. Elaborar una consulta que permita mostrar los pedidos con el nombre del cliente y el nombre del empleado que participaron en dicha transaccin.

Resolucin de ejercicios
1. Elaborar una consulta que me muestre el valor mximo y el valor mnimo de los productos abastecidos por el proveedor Pavlova, Ltd.
USE Nwind GO SELECT MAX (PrecioUnidad) AS " Precio Maximo", MIN(PrecioUnidad) AS " Precio minimo" FROM Productos WHERE IdProveedor= (SELECT IdProveedor FROM Proveedores WHERE NombreCompaa="Pavlova, Ltd.")

2. Elaborar una consulta que muestre cuantos pedidos realiz HILARIN-Abastos


USE Nwind GO SELECT COUNT(*) AS "Nro. Pedidos del cliente FROM Pedidos WHERE IdCliente= (SELECT IdCliente FROM CLientes WHERE NombreCompaa="HILARIN-Abastos ")

HILARIN-Abastos"

3. Elaborar una consulta que muestre cuantos clientes residen en Alemania


USE Nwind GO SELECT COUNT(*) AS " Nro. Clientes de Alemania" FROM Clientes WHERE Pas ="Alemania"

4. Utilizando group by, elaborar una consulta que muestre cuantos productos existen por categora.
USE Nwind GO SELECT C.NombreCategora, COUNT(P.IdProducto) AS 'Cantidad por categora' FROM Categoras AS C INNER JOIN Productos AS P ON (C.IdCategora = P.IdCategora) GROUP BY P.IdCategora, C.NombreCategora

5. Obtener todos los pedidos agrupados por el nombre de compaa.


USE Nwind GO SELECT C.NombreCompaa, P.IDPedido FROM [Compaas de envos] AS C INNER JOIN Pedidos AS P ON C.IdCompaaEnvos = P.FormaEnvo GROUP BY C.NombreCompaa, P.IDPedido ORDER BY 1

6. Obtener el nombre de los productos, de aquellos cuyo precio unitario sea igual al del producto con el nombre Licor Cloudberry.
USE Nwind GO SELECT NombreProducto FROM Productos WHERE PrecioUnidad = (SELECT PrecioUnidad FROM Productos WHERE NombreProducto = 'Licor cloudberry')

7. Obtener el nombre completo de los empleados que hayan efectuado pedidos entre las fechas 12/06/2010 al 12/12/2010
select E.Nombre,E.Apellidos,P.IdPedido,P.FechaPedido from Empleados as e inner join Pedidos as p on p.IdEmpleado = p.IdEmpleado where p.FechaPedido between '12-06-2010' and '12-12-2010'

8. Obtener el nombre de los productos adquiridos por el cliente con el cdigo de Wolza.
USE Nwind GO SELECT NombreProducto FROM Productos WHERE IdProducto IN (SELECT IdProducto FROM [Detalles de Pedidos] WHERE IDPedido IN (SELECT IdPedido FROM Pedidos WHERE IDCliente IN (SELECT IdCliente FROM ClienteS WHERE IDCliente = 'WOLZA')))

9. Obtener el nombre de los productos y las unidades vendidas de los productos que pertenecen al cdigo de categora 4
SELECT P.NombreProducto, SUM(DP.Cantidad) AS 'Cantidad Pedida' FROM [Detalles de pedidos] DP INNER JOIN Productos P ON DP.IdProducto = P.IdProducto AND P.IdCategora = 4, Categoras GROUP BY P.NombreProducto

10. Elaborar una consulta que permita mostrar los pedidos con el nombre del cliente y el nombre del empleado que participaron en dicha transaccin.
select p.*,C.NombreCompaa, E.Nombre+ ' '+E.Apellidos from Clientes C inner join Pedidos P inner join Empleados E on P.IdEmpleado = E.IdEmpleado on C.IdCliente = P.IdCliente

Você também pode gostar