Saltar al contenido

JOIN — armar información que vive en tablas distintas.

Cuando tienes usuarios y pedidos separados, un JOIN combina las filas que se corresponden según la FK. Hay cuatro variantes — la diferencia es qué pasa con las filas que no encuentran pareja.

01INNER JOIN — solo lo que está en ambas

SELECT u.nombre, p.total
FROM   usuarios u
INNER JOIN pedidos p ON p.usuario_id = u.id;

Solo aparecen usuarios que tengan al menos un pedido, y pedidos cuyo usuario exista. El alias (u, p) hace la consulta más corta y legible — úsalo siempre.

02LEFT JOIN — todos los de la izquierda

SELECT u.nombre, p.total
FROM   usuarios u
LEFT JOIN pedidos p ON p.usuario_id = u.id;

Mantiene todas las filas de usuarios aunque no tengan pedidos; en ese caso las columnas de pedidos aparecen como NULL. Útil para “quién no ha pedido”.

03Las cuatro variantes en una imagen mental

INNER
Intersección. Solo coincidencias.
LEFT
Todo lo de A + coincidencias de B.
RIGHT
Todo lo de B + coincidencias de A.
FULL
Todo, con NULLs donde no hay match.

04Laboratorio · ver y comparar

~/sql-labpostgres · in-memory
query.sql
-- Quién compró cuánto (solo usuarios con pedidos)
SELECT u.nombre, p.id AS pedido, p.total
FROM usuarios u
INNER JOIN pedidos p ON p.usuario_id = u.id
ORDER BY u.nombre;
listo
usuarios
idINT🔑nombreVARCHAR(40)ciudadVARCHAR(40)
1AnaBogotá
2LuisMedellín
3MaríaCali
4PedroCartagena
pedidos
idINT🔑usuario_idINTtotalDECIMAL(10,2)
10145000
11218000
12123000
13232000
1419000
El error #1 del JOIN

Olvidar la condición ON produce un producto cartesiano: cada fila de A se combina con cada fila de B. Si tienes 1.000 y 1.000, te salen un millón de filas. El motor no se queja, pero el servidor sí.

05Desafíos · ponete a prueba

Tres retos con JOINs, de menor a mayor dificultad. Escribí tu consulta y dale Comprobar.

Traé el nombre del usuario y el total de cada pedido. Solo deben aparecer usuarios que tengan al menos un pedido. Mostrá las columnas nombre y total.

Básico

Encontrá los usuarios que NO tienen ningún pedido registrado. Mostrá solo la columna nombre.

Intermedio

Calculá el total gastado por cada usuario que tiene pedidos. Mostrá nombre y total_gastado, ordenados del mayor al menor gasto.

Avanzado