Las combinaciones (JOIN) de SQL explicadas, con un ejemplo de cada una

Una combinación (JOIN) une filas de dos tablas haciendo coincidir una columna. El tipo de combinación decide qué ocurre con las filas que no encuentran pareja. Todos los ejemplos usan la base de datos de la panadería: 8 clientes y 12 pedidos, de los cuales dos son pedidos de mostrador sin cliente.

INNER JOIN: solo las coincidencias

Conserva una fila solo cuando ambos lados tienen coincidencia. Los clientes sin pedidos y los pedidos sin cliente desaparecen.

SELECT c.last_name, o.order_id
FROM customers AS c
INNER JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Resultado: 10 filas: los pedidos que pertenecen a un cliente.

LEFT JOIN: conserva todo lo de la izquierda

Conserva cada fila de la tabla izquierda. Cuando la tabla derecha no tiene coincidencia, sus columnas son NULL. Filtrar con IS NULL encuentra las filas sin coincidencia.

SELECT c.last_name, COUNT(o.order_id) AS orders
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.last_name
ORDER BY c.customer_id;

Resultado: Los 8 clientes; Kim y Meyer muestran 0 pedidos.

RIGHT JOIN: conserva todo lo de la derecha

Es la imagen espejo de LEFT JOIN. La mayoría de la gente invierte el orden de las tablas y usa LEFT JOIN, que se lee de forma más natural.

SELECT o.order_id, c.last_name
FROM customers AS c
RIGHT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Resultado: Los 12 pedidos; los pedidos 4 y 11 tienen un apellido NULL (pedidos de mostrador).

FULL JOIN: conserva todo en ambos lados

Conserva las filas sin coincidencia de ambas tablas. Es útil para comparar dos listas y ver qué falta en cada lado.

SELECT c.last_name, o.order_id
FROM customers AS c
FULL JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id, c.last_name;

Resultado: 14 filas: 10 coincidencias, 2 pedidos de mostrador y los clientes Kim y Meyer sin pedido.

CROSS JOIN: todas las combinaciones

Empareja cada fila de la primera tabla con cada fila de la segunda. El número de filas es el producto de ambas. Úsala a propósito, por ejemplo para crear una cuadrícula de fechas y categorías.

SELECT COUNT(*) AS combinations
FROM customers
CROSS JOIN products;

Resultado: 72, que es 8 clientes por 9 productos.

Autocombinación (self join): una tabla consigo misma

Asigna dos alias a la misma tabla para comparar filas de esa tabla, por ejemplo dos clientes de la misma ciudad.

SELECT a.first_name AS first_customer, b.first_name AS second_customer, a.city
FROM customers AS a
JOIN customers AS b ON a.city = b.city AND a.customer_id < b.customer_id
ORDER BY a.city;

Resultado: Las parejas Emma y Hugo (Berlin), Ben y Dev (London), y Chloe y Farid (Paris).

Preguntas frecuentes

¿Por qué mi combinación devuelve más filas de las que esperaba?
Normalmente porque la columna de unión no es única en uno de los lados, así que cada fila coincide con varias. Revisa las claves y comprueba el número de filas antes y después del JOIN.
¿Importa si una condición va en ON o en WHERE?
En un INNER JOIN no hay diferencia. En un LEFT JOIN, una condición sobre la tabla derecha en WHERE elimina las filas sin coincidencia y convierte el LEFT JOIN en un INNER JOIN. Ponla en ON para conservarlas.
¿Qué combinación equivale a BUSCARV?
Un LEFT JOIN: se conservan todas las filas de la tabla principal, y la columna buscada es NULL donde no hay coincidencia, como #N/A. A diferencia de BUSCARV, devuelve todas las coincidencias, no solo la primera.

Practícalo