Consultas SQL sobre multiples tablas

11. September 2010 01:21 by Oscar.SS in Desarrollo Empresarial  //  Tags:   //   Comments (6)

Continuando con el artículo anterior, veremos en este las consultas SELECT combinado columnas de distintas tablas. Este tipo de consultas nos permiten explotar nuestro almacén de negocio de forma más efectiva al relacionar datos de distintas tablas. 

 

--------------------------------------------------------------------------------------------------------------------
--CONSULTAS DE VARIAS TABLAS (Producto cartesiano de filas)--
--------------------------------------------------------------------------------------------------------------------

-- Si no se hacen coincidir los valores de las columnas relacionadas se obtiene gran duplicidad de filas. Tantas como
-- el producto cartesiano de las filas de las tablas a las que se hace referencia. Ejemplo:

select from dbo.Products, dbo.Orders

--------------------------------------------------------------------------------------------------------------------
--UTILIZAR ALIAS EN UNA TABLA--
--------------------------------------------------------------------------------------------------------------------

-- Cuando se relacionan varias tablas es normal que una misma columna forme parte de varias tablas. Para evitar 
-- errores de nombres duplicados podemos hacer dos cosas. Una es utilizar la sintaxis de nombre completo:
-- NombreTabla.NombreColumna.

select from dbo.Products, dbo.Categories
where dbo.Products.CategoryID dbo.Categories.CategoryID

-- La otra forma es dar un alias a cada tabla. Ejemplo:

select from dbo.Products P, dbo.Categories C
where P.CategoryID C.CategoryID

--------------------------------------------------------------------------------------------------------------------
--INSTRUCCIÓN JOIN ON(Coincidencia INTERNAS de columnas)--
--------------------------------------------------------------------------------------------------------------------

--NOTA: La instrucción INNER JOIN  es exactamente lo mismo que JOIN, dado que es el valor predeterminado.

--TEORÍA--

-- La instrucción JOIN nos permite combinar varias tablas haciendo coincidir los valores de las columas que nos 
-- interesen. Es decir, si tenemos dos tablas A y B que contienen una (o varias) columnas con el mismo nombre,
-- podemos relacionar ambas tablas por la columna del mismo nombre.

-- Por cada registro de la columna en la tabla A que también esté en la columna de la tabla B, obtendremos un
-- una relación. Lo que quiere decir que se produce un producto cartesiano de cada valor de la columna de la tabla A,
-- por todos los valores coincidentes de la columna en la tabla B.


--VOLVIENDO A LA BASE DE DATOS NORTHWIND--

-- 1. Por ejemplo, la tabla empleados nos facilita bastante información de los mismos. La más significativa es el
-- número de empleado, el nombre y la ciudad donde vive. Sin embargo, no nos dice nada de las ventas efectuadas por
-- cada empleado.

-- Si miramos la tabla de ventas veremos que además del número de ventas, tenemos información del empleado que
-- realizo estas ventas. Por lo tanto, por medio de la columna EmployeeID presente en las dos tablas podemos
-- relacionar los empleados con el número de venta. Ejemplo:

select OrderID, LastName, FirstName, City
from dbo.Orders O join dbo.Employees E
on  O.EmployeeID E.EmployeeID
order by OrderID

-- De este modo podemos concluir que la columna que pertenece a una tabla A y otra B sirve de nexo para relacionar
-- los datos de otras columnas de la tabla A que no estan incluidos en la tabla B y viceversa.

--2. Otro caso es la tabla de productos que nos da mucha información sobre los mismos pero apenas nos dice nada de 
-- la categoría a la que pertenece cada producto. Mostremos una tabla productos personal que muestre la información
-- más interesante de los productos, más el nombre de la categoría y una descripción de esta.

select ProductID, ProductName, C.CategoryID, CategoryName, Description, UnitPrice, UnitsInStock
from dbo.Products P join dbo.Categories C
on P.CategoryID C.CategoryID

--3. COMBINACIÓN DE TRES TABLAS. Si nos fijamos en las tablas de empleados y de clientes nos damos cuenta que no hay
-- forma de relacionar que empleado atendió (o vendió) a que cliente. Podemos hacerlo a través de la tabla de ventas
-- que tiene los números de empleados y de clientes. 

select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, CompanyName, ContactName
from dbo.Orders O 
join dbo.Employees E on O.EmployeeID E.EmployeeID 
join dbo.Customers C on O.CustomerID C.CustomerID
order by EmployeeID

--4. Puede darse el caso en que solo interese esta información para los clientes de España.

select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, CompanyName, ContactName
from dbo.Orders O 
join dbo.Employees E on O.EmployeeID E.EmployeeID 
join dbo.Customers C on O.CustomerID C.CustomerID
where C.Country 'Spain'
order by EmployeeID

--5. La instrucción JOIN también podemos utilizarla para sustituir a las subconsultas. La forma de hacerlo es dando
-- dos alias diferentes a una misma tabla. Ejemplo:
--    (Mostrar los empleados que son mayores que el empleado 5 (1955-03-04) ).

-- Técnica de subconsultas.
select EmployeeID, LastName, FirstName, BirthDate from dbo.Employees
where BirthDate > (select BirthDate from dbo.Employees
                    
where EmployeeID 5)

-- Instrucción JOIN.
select E1.EmployeeID, E1.LastName, E1.FirstName, E1.BirthDate from dbo.Employees E1 join dbo.Employees E2
on E1.BirthDate > E2.BirthDate
where E2.EmployeeID 5

--------------------------------------------------------------------------------------------------------------------
--INSTRUCCIÓN OUTER JOIN (Coincidencias EXTERNAS de columnas)--
--------------------------------------------------------------------------------------------------------------------

-- Puede darse el caso que nos interese mostrar todos los valores de una columna (todas las filas) aunque no tengan 
-- correspondencia en la otra tabla. Así podemos tener 3 casos:

--1.Mostrar todos los valores de la tabla IZQ (LEFT), con NULL para la tabla DCH cuando no hay correspondencia
select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStock
from dbo.Products P left outer join dbo.Categories C
on P.CategoryID C.CategoryID

--2.Mostrar todos los valores de la tabla DCH (RIGHT), con NULL para la tabla IZQ cuando no hay correspondencia.
select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStock
from dbo.Products P right outer join dbo.Categories C
on P.CategoryID C.CategoryID

--3.Mostrar todos los valores de ambas tablas (FULL) con NULL cuando no hay correspondencia.
select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStock
from dbo.Products P full outer join dbo.Categories C
on P.CategoryID C.CategoryID

--NOTA: La sentencia OUTER es opcional. Al incluir las sentencias LEFT, RIGHT Y FULL el sistema sabe que es una
--        consulta de combinación externa. Ejemplo anterior:

select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStock
from dbo.Products P full join dbo.Categories C
on P.CategoryID C.CategoryID

--------------------------------------------------------------------------------------------------------------------
-- INSTRUCCIÓN UNION (Unión de filas en distintas tablas)--
--------------------------------------------------------------------------------------------------------------------

--1. Unir (UNION) todas (ALL) las filas de dos columnas de tablas diferentes.
select City from dbo.Employees
union all
select 
City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas.

--2. Unir (UNION) las filas de dos columnas de tablas diferentes sin repetir ningún valor.
select City from dbo.Employees
union
select 
City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas pero con valores únicos.

--NOTA: Se debe cumplir que las columnas en ambas instruciones SELECT coincidan en el tipo de datos.

-------------------------------------------------------------------------------------------------------------------- 
-- INSTRUCCIÓNES EXCEPT Y INTERSECT (Diferencia e Intersección de conjuntos)--
--------------------------------------------------------------------------------------------------------------------

-- EXCEPT -- Devuelve los valores de la primera consulta que no se encuentran en la segunda.
select City from dbo.Employees
except
select 
City from dbo.Customers

-- INTERSECT -- Devueleve una intersección de todos los valores, es decir, solo los que se encuentran ambas columnas.
select City from dbo.Employees
intersect
select 
City from dbo.Customers
--------------------------------------------------------------------------------------------------------------------

 

Descarga: Consultas multi Tablas.rar (2,45 kb)

Comments (6) -

Claudio Girón
Claudio Girón
6/18/2013 11:31:18 PM #

Gran aporte me sirvió bastante. Muchisimas gracias

Oscar.SS
Oscar.SS
6/19/2013 9:35:39 AM #

Gracias a tí Claudio por comentar Smile

Anónimo
Anónimo
6/19/2013 7:42:13 PM #

Excelente artículo, gracias

Tavo2.0_xk
Tavo2.0_xk
6/23/2013 6:47:48 AM #

Muchas gracias :3 me ha servido bastante, todo muy claro, simplemente excelente el tuto Smile

Elsa Herrera
Elsa Herrera
10/9/2013 5:39:35 PM #

Muy clara exposición.   He usado su articulo para que sea 'recreado' en sesión de practicas de consultas por parte de mis estudiantes

Oscar.SS
Oscar.SS
10/10/2013 10:32:09 AM #

Hola Elsa,

Me alegra mucho saber que el artículo te parezca interesante.

Muchas suerte con tus estudiantes Wink

Recent Comments

Comment RSS

Month List