Volver a la lista de artículos Artículos
Lectura de 4 minutos

JOINs SQL

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.
tipos de uniones sql

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.

Dos tablas de ejemplo de la base de datos, SQL JOIN

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.

Diagrama de Venn para ilustrar el CROSS JOIN de SQL

SELECT *
FROM tableA
CROSS JOIN tableB;

Ejemplo de cómo funciona el CROSS JOIN de SQL en dos tablas

La TablaA y la TablaB contienen 4 filas. La tabla resultante tendrá 4 * 4 = 16 filas y tendrá el siguiente aspecto:

La tabla que es el resultado de SQL CROSS JOIN

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.

Diagrama de Venn que ilustra el INNER JOIN de SQL
 
SELECT *
FROM tableA
INNER JOIN tableB
  ON tableA.name = tableB.name

Ejemplo de cómo funciona el INNER JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado de un INNER JOIN de SQL

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.

Diagrama de Venn que ilustra el FULL OUTER JOIN de SQL

 
SELECT *
FROM TableA
FULL OUTER JOIN TableB
  ON TableA.name = TableB.name;

Ejemplo de cómo funciona el FULL OUTER JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado de SQL FULL OUTER JOIN

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:

Diagrama de Venn que ilustra el LEFT OUTER JOIN de SQL

SELECT *
FROM TableA
LEFT OUTER JOIN TableB
  ON tableA.name = tableB.name;

Ejemplo de cómo funciona el SQL LEFT OUTER JOIN en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado de SQL LEFT OUTER JOIN

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:

Diagrama de Venn para ilustrar el RIGHT OUTER JOIN de SQL

SELECT *
FROM tableA
RIGHT OUTER JOIN tableB
  ON tableA.name = tableB.name

Ejemplo de cómo funciona el RIGHT OUTER JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado de SQL RIGHT OUTER JOIN

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 >, &lt, >= 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.

Diagrama de Venn que ilustra el OUTER EXCLUDING JOIN de SQL
SELECT *
FROM tableA
FULL OUTER JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL
  OR tableB.name IS NULL

Ejemplo de cómo funciona el OUTER EXCLUDING JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla resultante de SQL OUTER EXCLUDING JOIN

Un LEFT EX CLUDING JOIN devuelve todos los registros de la TablaA que no coinciden con ningún registro de la TablaB.

Diagrama de Venn que ilustra el LEFT EXCLUDING JOIN de SQL

SELECT *
FROM tableA
LEFT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableB.name IS NULL

Ejemplo que muestra cómo funciona el LEFT EXCLUDING JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado de SQL LEFT EXCLUDING JOIN

Un RIGHT EX CLUDING JOIN devuelve todos los registros de la TablaB que no coinciden con ningún registro de la TablaA.

Diagrama de Venn ilustrando el RIGHT EXCLUDING JOIN de SQL

SELECT *
FROM tableA
RIGHT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL

Ejemplo de cómo funciona el RIGHT EXCLUDING JOIN de SQL en dos tablas

La tabla resultante será la siguiente:

La tabla que es el resultado del RIGHT EXCLUDING JOIN de SQL

Un montón de enlaces útiles: