Está en la 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

Son los nombres de las tablas desde las que se combinan los registros.

campo1,
campo2

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.

comp

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

También podría gustarte