20th Jul 2022 Lectura de 4 minutos JOINs SQL Patrycja Dybka JOIN Índice CROSS JOIN INNER JOIN OUTER JOIN Uniones basadas en operadores JOIN NATURAL Un montón de enlaces útiles: Un JOIN en SQL es un método para recuperar datos de dos o más tablas de la base de datos. Este artículo presenta una visión básica de cómo serán los datos de una unión SQL particular. Una forma popular de entender las uniones SQL es visualizarlas usando diagramas de Venn, por lo que cada ejemplo tiene su correspondiente diagrama de Venn, la declaración SELECT apropiada y la tabla de resultados. Hay algunos tipos principales de uniones SQL: INNER JOIN OUTER [LEFT | RIGHT | FULL] JOIN JOIN NATURAL CROSS JOIN Distinguimos la implementación de estas uniones en función de los operadores de unión: equi y theta, que se describirán más adelante. Para el propósito de este artículo, vamos a discutir las uniones usando un ejemplo simple. Supongamos que tenemos dos tablas básicas, la TablaA y la TablaB, que se llenan con algunos datos de ejemplo. Como vamos a unir las tablas en la columna name, distinguimos las filas del mismo nombre resaltándolas en rojo. En las siguientes secciones, veremos lo que ocurre con estos datos cuando se implementan diferentes tipos de uniones. CROSS JOIN Un CROSS JOIN es un producto cartesiano de la TablaA y la TablaB. Cada fila de la TablaA se empareja con cada fila de la TablaB; por eso un CROSS JOIN no tiene sentido en la mayoría de las situaciones. SELECT * FROM tableA CROSS JOIN tableB; La TablaA y la TablaB contienen 4 filas. La tabla resultante tendrá 4 * 4 = 16 filas y tendrá el siguiente aspecto: INNER JOIN Un INNER JOIN combina SOLO las filas que coinciden en AMBAS tablas. Un JOIN sin ninguna otra palabra clave de JOIN (como INNER, OUTER, LEFT, etc) es un INNER JOIN. Los resultados se encuentran en el área de superposición. SELECT * FROM tableA INNER JOIN tableB ON tableA.name = tableB.name La tabla resultante será la siguiente: OUTER JOIN FULL OUTER JOIN devuelve las filas coincidentes y no coincidentes de ambas tablas (es una unión de ambas). Si no hay coincidencia, el lado que falta contendrá null. SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name; La tabla resultante será la siguiente: Un LEFT OUTER JOIN devuelve todas las filas de la tabla izquierda (TablaA) con las filas coincidentes de la tabla derecha (TablaB) o null - si no hay coincidencia en la tabla derecha. Los resultados se encuentran en todo el círculo de la izquierda: SELECT * FROM TableA LEFT OUTER JOIN TableB ON tableA.name = tableB.name; La tabla resultante será la siguiente: Un RIGHT OUTER JOIN devuelve todas las filas de la tabla derecha (TableB) con las filas coincidentes de la tabla izquierda (TableA) o null - si no hay ninguna coincidencia en la tabla izquierda. Los resultados se encuentran en todo el círculo de la derecha: SELECT * FROM tableA RIGHT OUTER JOIN tableB ON tableA.name = tableB.name La tabla resultante será la siguiente: Uniones basadas en operadores Implementación de Equi-join Este JOIN se realiza utilizando el operador de igualdad (=) para comparar los valores de la PrimaryKey de una tabla y los valores de la Foreign Key de otra tabla. SELECT * FROM TableA INNER/OUTER JOIN TableB ON TableA.PK =TableB.Fk; Implementación de Theta-join (no equi) Es igual que el equi JOIN pero permite todos los demás operadores como >, <, >= etc. SELECT * FROM TableA INNER/OUTER JOIN TableB ON tableA.Pk <= tableB.Fk; Implementación de Self-join Este tipo de JOIN se suele utilizar en el caso de un tipo de relación unitaria, donde una tabla se combina consigo misma. SELECT * FROM TableA A1 JOIN TableA A2 ON A1.Pk = A2.Fk; JOIN NATURAL Un join NATURAL es un tipo de join EQUI. No es necesario utilizar una cláusula ON. Las columnas con el mismo nombre en las tablas asociadas aparecen una sola vez. SELECT * FROM tableA NATURAL JOIN tableB Manipulando las palabras clave podemos excluir datos específicos. Un OUTER EXCLUDING JOIN devuelve todos los registros de la TablaA y todos los registros de la TablaB que no coinciden. SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.name = tableB.name WHERE tableA.name IS NULL OR tableB.name IS NULL La tabla resultante será la siguiente: Un LEFT EX CLUDING JOIN devuelve todos los registros de la TablaA que no coinciden con ningún registro de la TablaB. SELECT * FROM tableA LEFT JOIN tableB ON tableA.name = tableB.name WHERE tableB.name IS NULL La tabla resultante será la siguiente: Un RIGHT EX CLUDING JOIN devuelve todos los registros de la TablaB que no coinciden con ningún registro de la TablaA. SELECT * FROM tableA RIGHT JOIN tableB ON tableA.name = tableB.name WHERE tableA.name IS NULL La tabla resultante será la siguiente: Un montón de enlaces útiles: Coding horror: Una explicación visual de las uniones sql Proyecto de código: Una representación visual de las uniones sql SQL Rockstar: Ejemplos de uniones SQL en el mundo real Tags: JOIN