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
04Laboratorio · ver y comparar
-- 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;
| idINT🔑 | nombreVARCHAR(40) | ciudadVARCHAR(40) |
|---|---|---|
| 1 | Ana | Bogotá |
| 2 | Luis | Medellín |
| 3 | María | Cali |
| 4 | Pedro | Cartagena |
| idINT🔑 | usuario_idINT↗ | totalDECIMAL(10,2) |
|---|---|---|
| 10 | 1 | 45000 |
| 11 | 2 | 18000 |
| 12 | 1 | 23000 |
| 13 | 2 | 32000 |
| 14 | 1 | 9000 |
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.
Encontrá los usuarios que NO tienen ningún pedido registrado. Mostrá solo la columna nombre.
Calculá el total gastado por cada usuario que tiene pedidos. Mostrá nombre y total_gastado, ordenados del mayor al menor gasto.