23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” SQLShack SQL Server training English Introducción y resumen de la cláusula de “SQL JOIN” May 12, 2019 by Bojan Petrovic La sentencia del “SQL JOIN” es uno de los componentes principales de la sentencia Select, que se uti‐ liza para extraer datos del “SQL Server”. La palabra “Select” inicia la sentencia. A menudo es seguido por un asterisco (*) “AKA splat” como al‐ gunos lo llaman DBA. Nota: para expandir automáticamente los comodines a las columnas explícitas, consulte How to prevent performance problems and errors due to wildcards in SELECT statements Esto solo significa retornar a todas las columnas. Si tenemos varias tablas, un Select asterisco captu‐ rará todas las columnas de todas las tablas, por ejemplo, unir varias tablas usando la sentencia de “SQL JOIN”, que es el tema principal de este artículo. Empezaremos con la definición. Join es el proceso de tomar datos de varias tablas y colocarlos en una vista generada. Por tanto, una instrucción de “SQL JOIN” en un comando Select combina las columnas entre una o más tablas en una base de datos relacional y retorna a un conjunto de datos. “El FROM” también es parte esencial de la instrucción Select y es aquí donde se especifica de qué ta‐ bla estamos extrayendo los datos. La parte de join es donde queremos unir datos de varias tablas y tenemos tres tipos diferentes de combinaciones: Inner join – esta es la opción predeterminada. Si no se especifica el tipo de unión, se estable‐ cerá de manera predeterminada como la unión interna. Esto implica que si estamos uniendo dos tablas en una columna común, solo retornaran los datos que coincidan en ambas tablas https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ 1/9 23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” Left join – este tipo de unión significa que solo retornan todos los datos de la tabla de la mano izquierda, solo si los datos coinciden con la tabla de la mano derecha Right join – este tipo de unión es el caso opuesto al anterior. Implica que solo retornaran los datos de la tabla de la mano derecha, solo si los datos coinciden con la tabla de la mano izquierda Select usando Inner Join Vayamos hasta SQL Server Management Studio (SSMS) y verifiquemos cómo se puede trabajar con la instrucción de “SQL JOIN” utilizando ejemplos del mundo real. A continuación, mostramos un ejemplo de cómo unir tablas en una columna común. En nuestra base de datos de ejemplo AdventureWorks2012, tenemos la tabla “Producto” que tiene una columna “ProductID” y en la tabla “SalesOrderDetail”, también se tiene una columna “ProductID”. Entonces, si deseamos averiguar las ventas totales y los descuentos para cada producto y sacar el nombre, debemos unir estos dos en esta columna común: https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ 2/9 23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” USE AdventureWorks2012; GO SELECT p.Name AS ProductName, NonDiscountSales = (OrderQty * UnitPrice), Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount) FROM Production.Product AS p JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID ORDER BY ProductName DESC; GO Tome en cuenta que, si solo se especifica JOIN por sí mismo, sin una palabra clave interna en la sen‐ tencia de “SQL JOIN”, seguirá siendo un INNER JOIN. Por supuesto, puede poner la palabra clave “in‐ ner” para mayor claridad, pero si no hay una combinación de etiqueta izquierda / derecha, se estable‐ cerá por defecto una combinación interna: Select usando LEFT JOIN Ahora, démosle un vistazo al LEFT OURTER JOIN que nos ofrece todo desde la tabla de la izquierda y solo los registros que coinciden en la tabla de la derecha. En nuestro ejemplo, la siguiente consulta nos dará algunas personas que no han realizado ninguna compra: SELECT * FROM Person.Person p LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID El left join devuelve todos los registros, incluso si no existen, y pone un valor Nulo si no existe: https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ 3/9 23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” El conjunto de resultados indica que retornaron 19972 registros, y se tiene un grupo de valores nulos en la columna “BusinessEntityID”. Las filas que tienen nulos son personas que no realizaron ninguna compra. Se puede extender de la consulta anterior y agregar otra sentencia de “SQL JOIN” para poder incluir a las personas con la información de la tarjeta de crédito. Tome en cuenta que se acaba de especificar la palabra clave Join, que es una combinación interna de forma predeterminada y eliminará todos los va‐ lores nulos porque esas personas no tienen información de la tarjeta de crédito: SELECT * FROM Person.Person p LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID JOIN Sales.CreditCard cc ON pcc.CreditCardID = cc.CreditCardID; Esta vez, la consulta hace retornar 19118 registros en lugar de 19972 anteriores: De esta forma es como “SQL Join” con “Left tag” puede ayudarnos Si deseamos incluir los registros y https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ 4/9 23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” De esta forma es como SQL Join con Left tag puede ayudarnos. Si deseamos incluir los registros y contar con el recuento completo de personas, incluso si ellas no han realizado compras, simplemente se unen a la segunda cláusula: SELECT * FROM Person.Person p LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID LEFT JOIN Sales.CreditCard cc ON pcc.CreditCardID = cc.CreditCardID; Se puede ver que todos los que no han hecho una compra tienen un registro nulo para la tabla de “Tarjeta de crédito” y la tabla de “Tarjeta de crédito de persona” desde que nos fuimos con ellos: Adicionalmente, se puede elegir a todas aquellas personas que no han realizado una compra al ex‐ pandir aún más la sentencia “SQL Join” y buscar valores nulos con una cláusula Where: SELECT * FROM Person.Person p LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID LEFT JOIN Sales.CreditCard cc ON pcc.CreditCardID = cc.CreditCardID WHERE pcc.BusinessEntityID IS NULL; Si se ejecuta esto, se obtienen 854 registros o como se mencionó anteriormente, todos aquellos que no hayan realizado una compra: Por tanto, este fue un ejemplo de un LEFT JOIN utilizado para crear una hoja de ventas en la que se desea ver absolutamente cada compra, ya se tenga alguna compra o no, pero siempre quisimos que se mostraran los registros. La diferencia clave entre INNER JOIN y LEFT JOIN es que no estamos per‐ https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ 5/9 23/6/2021 Introducción y resumen de la cláusula de “SQL JOIN” diendo / omitiendo registros. Select usando Right Join Ahora, la cláusula RIGHT JOIN es exactamente lo opuesto a LEFT JOIN. Básicamente hacen lo mismo. La izquierda es derecha y la derecha es izquierda y se puede obtener el mismo efecto simplemente cambiando las tablas. Los RIGHT JOIN no están en omitidas, simplemente no son tan comunes. Por ra‐ zones de consistencia, es una práctica común utilizar LEFT JOIN en lugar de uniones derechas. Conclusión y prácticas comunes Se han cubierto las tres uniones principales: inner, left y right join. Esos tres JOIN son los que se usan con mayor frecuencia. Incluso si tú eres un novato en el mundo de la base de datos, es altamente pro‐ bable que hayas encontrado bastante diferentes tipos de SQL JOIN. Además de esto, también verás tipos de combinaciones Externas y Cruzadas. La Outer join tiene 3 ti‐ pos diferentes: 1. Left outer join – recupera registros si están presentes en la tabla izquierda 2. Right outer join – recupera registros si están presentes en la tabla derecha 3. Full outer join – recupera registros si están presentes en cualquiera de las dos tablas 4. Cross join – como indica su nombre, hace [n X m] donde se una todo combinado con todo. Es un escenario donde simplemente listamos las tablas para unir (en la cláusula From de la senten‐ cia Select), usando comas para separarlas Puntos a tener en cuenta: Si solo se especifica Join, entonces por defecto es una Inner join Un Outer join debe ser LEFT / RIGHT / FULL. No puedes simplemente decir Outer join y dejarlo de esa forma solamente Puede eliminar la palabra clave Outer y simplemente decir say Left join, Right join o Full join Espero que el uso de los diagramas de Venn para poder explicar los diferentes tipos de Join sea útil, i i id l lid d d i t i d SQL JOIN https://www.sqlshack.com/es/introduccion-y-resumen-de-la-clausula-de-sql-join/ i b P l t t l 6/9