sábado, 30 de enero de 2016

Uso de JOIN en SQL Server

Buenas tardes queridos lectores, el día de hoy veremos el uso de JOIN en SQL, hay diferentes usos sentencias JOIN INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN. Vamos a tratar de ver ejemplos de todos los JOINS. Empecemos pues con el post, espero sea de su agrado y les sirva.

En determinada ocasion se tendrá que unir más tablas para poder combinar los valores y poder mostrarlos juntos en una consulta, aquí se tendrá que usar la combinación de tablas por medio de la clausula JOIN. Hay que diferenciar que existen dos tipos de combinaciones, las internas y externas.

Las internas devuelven todas las filas que cumplen la combinación de la primera entrada con la segunda. En el caso de no encontrarse coincidencia de valores no emite mensaje de error, simplemente no muestra ningún registro.

Las externas son combinaciones donde las filas resultantes no son directamente de la tabla origen podría ser de la derecha, izquierda o completa.

Les dejo una imagen que ilustra mejor el uso de los JOINS



Pero como siempre, pasemos a los ejemplos

INNER JOIN


Ejemplo 1:
Script que permita mostrar la combinación de la tabla PASAJERO y PAGO, es decir, los pagos realizados por los pasajeros

Primero veamos cómo están compuestas las tablas


SELECT *
       FROM PASAJERO PAS
       INNER JOIN PAGO PAG
       ON PAS.IDPASAJERO = PAG.IDPASAJERO
GO

En el script se hace referencia  a la primera tabla con la clausula FROM y a la segunda tabla con INNER JOIN, a cada una de las tablas se le asigna un alias. Seguidamente se le debe especificar cual es la columna de unión entre las dos tablas, en la imagen se aprecia claramente que la columna de unión entre las tablas es IDPASAJERO, se especifica por medio del ON PAIS.IDPASAJERO=PAG.IDPASAJERO.

El resultado de la consulta es la multiplicación entre las filas de la tabla PASAJERO por las filas de la tabla PAGO, dando como resultado 130 filas repartidas entre los 10 pasajeros registrados y 13 filas de la tabla PAGO, pero como notará en la imagen resultante solo aparecen 13 filas por la definición de la columna de unión IDPASAJERO. El resultad de esa consulta es el siguiente:


Como ven, en la consulta se muetran todos los campos, tanto de la tabla pasajero como de la tabla PAGO, pero con el alias de las tablas y con la unión, podremos especificar que columnas de que tabla queremos mostrar, para ello mostraremos el siguiente caso:

SELECT PAS.IDPASAJERO, PAS.NOMBRES, PAI.PAIS, PAS.TELEFONO
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI
       ON PAS.IDPAIS = PAI.IDPAIS
GO

En la siguiente imagen se muestra el resultado de la consulta


Como verán queridos lectores ya no es necesario especificar el IDPAIS desde la tabla PASAJERO ya que por medio del INNER JOIN tenemos acceso a la columna PAIS de la tabla del mismo nombre.

Ejemplo 3:
Script que permita mostrar los pasajeros con las siguientes columnas IDPASAJERO, NOMBRES, PAIS, FECHA DE PAGO, MONTO CANCELADO


SELECT PAS.IDPASAJERO, PAS.NOMBRES, PAI.PAIS, PAG.FECHA, PAG.MONTO
       FROM PASAJERO PAS
       INNER JOIN PAGO PAG ON PAG.IDPASAJERO = PAS.IDPASAJERO
       INNER JOIN PAIS PAI ON PAI.IDPAIS = PAS.IDPAIS
GO


El script anterior maneja tres tablas ya que el ejemplo hace referencia a columnas de éstas, hay que tener cuidado al asignar el nombre del alias a cada tabla. Como notarán la columna de unión entre PASAJERO y PAGO es IDPASAJERO, mientras que entre PASAJERO y PAIS la columna de unión es IDPAIS.

La imagen siguiente muestra el resultado de la consulta:


Ejemplo 4
Script que permita mostrar a los pasajeros de un determinado PAIS ingresado por es usuario utilizando a clausula JOIN

DECLARE @PAIS VARCHAR(50) = 'MEXICO'

SELECT *
       FROM PASAJERO PAS
       INNER JOIN PAIS PAI ON PAS.IDPAIS = PAI.IDPAIS
       WHERE PAI.PAIS=@PAIS
GO



Se declara la variable @PAIS para colocar el criterio de búsqueda, en este caso buscaremos a todos los pasajeros del país MÉXICO. Se le adiciona la clausula WHERE a la consulta para poder condicionar el país de los pasajeros que se necesitan mostrar, como notará dentro del WHERE se puede referencias a cualquiera de las columnas de ambas tablas, pero en este caso solo es necesario indicar el nombre del país por medio de PAI.PAIS que es el alias de la tabla PAIS y que representa al nombre del país

LEFT JOIN

Ejemplo 5
Mostrar todos los registros de la tabla pasajero y el país utilizando LEFT JOIN

SELECT *
       FROM PAIS PAI
       LEFT JOIN PASAJERO PAS ON PAI.IDPAIS = PAS.IDPAIS
GO

En el script la tabla PASAJERO es referenciado a la unión externa izquierda eso quiere decir que la consulta deberá mostrar sus columnas en el lado izquierdo y forzar a la otra tabla a mostrar todas sus filas, esto significa que la tabla puede tener registros que no necesariamente se encuentren en la tabla izquierda. Cuando ocurre este caso, la tabla izquierda mostrará NULL en los valores cruzados. Como se muestra en la imagen siguiente que es el resultado de la consulta anterior:


Al observar la imagen la interpretación que se puede dar aquí es que se muestran todos los paises inclusive, los que no participan en la tabla PASAJERO. Chile, Venezuela, Bolivia, Honduras, EEUU, y Puerto Rico son países que aún no tienen pasajeros registrados.

Modificaremos el script para poder mostrar solo a los países que aun no tienen pasajeros registrados, ya sabemos que los países de respuesta serían Chile, Venezuela, Bolivia, Honduras, EEUU y Puerto Rico, pero veamos la solución para mostrar únicamente esos países

SELECT *
       FROM PAIS PAI
       LEFT JOIN PASAJERO PAS ON PAI.IDPAIS = PAS.IDPAIS
       WHERE PAS.IDPAIS IS NULL
GO


Right Join

El caso de RIGHT JOIN es similar al de LEFT JOIN, solo que esta vez será la tabla de la derecha, utilizaremos el mismo ejemplo anterior, solo que ahora le daremos solución con RIGHT JOIN

SELECT PAI.*
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAI.IDPAIS = PAS.IDPAIS
       WHERE PAS.IDPAIS IS NULL
GO


Ejemplo 6
Script que permita mostrar los pasajeros que aún no han realizado ningún pago utilizando LEFT JOIN y RIGHT JOIN
SELECT PAI.*
       FROM PASAJERO PAS
       RIGHT JOIN PAIS PAI ON PAI.IDPAIS = PAS.IDPAIS
       WHERE PAS.IDPAIS IS NULL
GO

SELECT  PAS.*
       FROM PAGO PAG
       RIGHT JOIN PASAJERO PAS ON PAS.IDPASAJERO = PAG.IDPASAJERO
       WHERE PAG.IDPASAJERO IS NULL
GO


Finalmente, podríamos haber usado la clausula FULL JOIN que permite combinar LEFT con RIGHT JOIN dentro de una consulta. El script es como sigue

SELECT  PAS.*
       FROM PAGO PAG
       FULL JOIN PASAJERO PAS ON PAS.IDPASAJERO = PAG.IDPASAJERO
       WHERE PAG.IDPASAJERO IS NULL
GO

En todos los casos el resultado es el siguiente:


CROSS JOIN

Ejemplo 7
Script que permita mostrar los resultados de la tabla PASAJERO y PAGO de forma que apliquen un producto cartesiano entre sus filas. Use CROSS JOIN

SELECT *
       FROM PASAJERO
       CROSS JOIN PAGO
GO


En el script se muestran dos tablas involucradas, esta vez usando CROSS JOIN que permita una combinación completa entre las tablas, si visualiza la cantidad de filas en la consulta, notará que el resultado es de 130 rows, ya que por cada fila de PASAJEROS es multiplicado por cada fila de la tabla PAGO realizando una combinación completa entre sus filas. La imagen a continuación muestra la combinación CROSS JOIN















Hasta aquí el post queridos lectores, aun falta la parte mas interesante, que la programación de disparadores, procedimientos, funciones, etc. Pero eso será en post venideros, espero haya sido de utilidad este post, les haya agradado, espero también comenten, den un +1 o algún clic en una publicidad, me despido de momento, pero nos estamos leyendo por aqui muy pronto

Saludos

Banderas de Visitantes

Flag Counter