JOIN es la instrucción de SQL que une dos o más tablas para que puedas consultar información relacionada en una sola línea de resultado.
El problema que resuelve JOIN
Imagina que trabajas en el área de datos de Liverpool. Tienes una tabla con pedidos y otra tabla con información de clientes. Si quieres saber qué cliente hizo cada pedido, necesitas unir ambas tablas. Sin JOIN, tendrías que hacer dos consultas separadas y unir la información tú mismo. Con JOIN, lo haces en una sola consulta.
Eso es exactamente lo que ocurre en cualquier empresa real. Las bases de datos están divididas en muchas tablas pequeñas para evitar duplicar información. JOIN es la herramienta que las vuelve a conectar cuando necesitas una respuesta.
El Sistema de Llaves: cómo se conectan las tablas
Antes de escribir un JOIN, necesitas entender cómo se relacionan las tablas. Cada tabla tiene una columna que la identifica de forma única. A esa columna se le llama llave primaria (primary key).
Cuando esa misma columna aparece en otra tabla para crear la relación, se llama llave foránea (foreign key).
Por ejemplo:
- La tabla
clientestiene una columnaid_cliente(llave primaria). - La tabla
pedidostiene una columnaid_cliente(llave foránea) que apunta al cliente que hizo ese pedido.
JOIN une las dos tablas usando esas dos columnas como punto de conexión.
Las dos tablas de ejemplo
Vamos a trabajar con dos tablas inspiradas en el sistema de ventas de Mercado Libre México.
Tabla clientes:
| id_cliente | nombre | ciudad |
|---|---|---|
| 1 | Ana Torres | CDMX |
| 2 | Luis Ramírez | Guadalajara |
| 3 | Sofía Mendoza | Monterrey |
| 4 | Carlos Vega | Puebla |
Tabla pedidos:
| id_pedido | id_cliente | producto | monto |
|---|---|---|---|
| 101 | 1 | Teclado USB | $850 |
| 102 | 2 | Audífonos | $1,200 |
| 103 | 1 | Mouse inalámbrico | $650 |
| 104 | 3 | Webcam HD | $1,800 |
Nota que Carlos Vega (id_cliente = 4) no tiene ningún pedido todavía. Eso será importante más adelante.
INNER JOIN: solo lo que coincide
INNER JOIN regresa únicamente las filas que tienen coincidencia en ambas tablas. Si un cliente no tiene pedido, no aparece. Si un pedido no tiene cliente registrado, tampoco aparece.
Sintaxis base:
SELECT columnas
FROM tabla1
INNER JOIN tabla2 ON tabla1.columna_comun = tabla2.columna_comun;
Ejemplo concreto:
SELECT clientes.nombre, pedidos.producto, pedidos.monto
FROM clientes
INNER JOIN pedidos ON clientes.id_cliente = pedidos.id_cliente;
Resultado:
| nombre | producto | monto |
|---|---|---|
| Ana Torres | Teclado USB | $850 |
| Luis Ramírez | Audífonos | $1,200 |
| Ana Torres | Mouse inalámbrico | $650 |
| Sofía Mendoza | Webcam HD | $1,800 |
Carlos Vega no aparece porque no tiene pedidos. INNER JOIN solo muestra lo que existe en ambos lados.
Alias de tabla: escribe menos, lee más
Cuando los nombres de tablas son largos, repetirlos en cada columna se vuelve tedioso. Puedes usar alias para abreviarlos.
SELECT c.nombre, p.producto, p.monto
FROM clientes AS c
INNER JOIN pedidos AS p ON c.id_cliente = p.id_cliente;
El resultado es exactamente el mismo. Solo escribiste c y p en lugar de los nombres completos. En proyectos reales con tablas de nombres largos como detalle_pedidos_historico, esto ahorra mucho tiempo.
LEFT JOIN: todos los de la izquierda, con o sin pareja
LEFT JOIN regresa todas las filas de la tabla de la izquierda, más las filas que coincidan de la tabla de la derecha. Si no hay coincidencia en la derecha, los campos aparecen como NULL.
Sintaxis:
SELECT columnas
FROM tabla1
LEFT JOIN tabla2 ON tabla1.columna_comun = tabla2.columna_comun;
Ejemplo:
SELECT c.nombre, p.producto, p.monto
FROM clientes AS c
LEFT JOIN pedidos AS p ON c.id_cliente = p.id_cliente;
Resultado:
| nombre | producto | monto |
|---|---|---|
| Ana Torres | Teclado USB | $850 |
| Luis Ramírez | Audífonos | $1,200 |
| Ana Torres | Mouse inalámbrico | $650 |
| Sofía Mendoza | Webcam HD | $1,800 |
| Carlos Vega | NULL | NULL |
Ahora Carlos Vega sí aparece, pero sin producto ni monto porque no tiene pedidos. Eso es exactamente la diferencia clave entre INNER JOIN y LEFT JOIN.
¿Cuándo usar INNER JOIN y cuándo LEFT JOIN?
Usa INNER JOIN cuando solo te interesan los registros que tienen relación en ambas tablas. Por ejemplo: mostrar solo los clientes que ya compraron.
Usa LEFT JOIN cuando quieres ver todos los registros de la tabla principal, aunque algunos no tengan datos relacionados. Por ejemplo: ver todos los clientes registrados, incluyendo los que aún no han comprado.
En el sistema de FEMSA, si quieres auditar qué distribuidoras no han registrado ventas este mes, usas LEFT JOIN para que las distribuidoras sin ventas aparezcan con NULL.
Filtrar resultados después del JOIN
Puedes combinar JOIN con WHERE para filtrar los resultados. Esto es muy poderoso.
Ejemplo: pedidos de clientes en CDMX con monto mayor a $700:
SELECT c.nombre, c.ciudad, p.producto, p.monto
FROM clientes AS c
INNER JOIN pedidos AS p ON c.id_cliente = p.id_cliente
WHERE c.ciudad = 'CDMX' AND p.monto > 700;
Resultado:
| nombre | ciudad | producto | monto |
|---|---|---|---|
| Ana Torres | CDMX | Teclado USB | $850 |
Primero JOIN une las tablas. Después WHERE filtra solo lo que cumple las condiciones.
Combinar JOIN con GROUP BY
En la lección anterior aprendiste GROUP BY con funciones de agregación. Puedes combinarlos con JOIN para crear reportes completos.
Ejemplo: total de ventas por cliente:
SELECT c.nombre, COUNT(p.id_pedido) AS total_pedidos, SUM(p.monto) AS total_ventas
FROM clientes AS c
INNER JOIN pedidos AS p ON c.id_cliente = p.id_cliente
GROUP BY c.nombre
ORDER BY total_ventas DESC;
Resultado:
| nombre | total_pedidos | total_ventas |
|---|---|---|
| Ana Torres | 2 | $1,500 |
| Sofía Mendoza | 1 | $1,800 |
| Luis Ramírez | 1 | $1,200 |
Este tipo de reporte es exactamente lo que un analista de datos en Bimbo o en Liverpool presentaría en una reunión de resultados.
Errores comunes al usar JOIN
Error 1: Olvidar la condición ON.
Si escribes JOIN sin la parte ON tabla1.col = tabla2.col, obtienes un producto cartesiano: cada fila de la primera tabla se combina con cada fila de la segunda. Con tablas grandes, eso genera millones de filas innecesarias y puede bloquear el servidor.
Error 2: Columnas ambiguas sin prefijo de tabla.
Si ambas tablas tienen una columna llamada id_cliente y solo escribes id_cliente sin indicar de qué tabla, SQL no sabe a cuál te refieres y lanza un error. Siempre escribe c.id_cliente o p.id_cliente.
Error 3: Confundir LEFT y RIGHT JOIN. RIGHT JOIN hace lo contrario de LEFT JOIN: trae todas las filas de la tabla derecha. En la práctica, casi siempre puedes reescribir un RIGHT JOIN como un LEFT JOIN intercambiando el orden de las tablas. La mayoría de equipos usan solo LEFT JOIN para mantener consistencia en el código.
Error 4: No usar alias cuando las tablas tienen nombres largos.
Escribir detalle_pedidos_historico.id_cliente en cada columna es innecesario y dificulta leer la consulta. Define alias desde el principio con AS.
El orden de una consulta con JOIN
Cuando combines todo lo que has aprendido, tu consulta seguirá este orden:
SELECT -- qué columnas quieres ver
FROM -- tabla principal
JOIN -- tabla secundaria y condición ON
WHERE -- filtros de filas
GROUP BY -- agrupación
HAVING -- filtros de grupos
ORDER BY -- orden de resultados
LIMIT -- cuántas filas mostrar
No todas las consultas usan todas estas cláusulas. Pero cuando las combinan, siempre van en ese orden.
JOIN es el puente que convierte datos dispersos en información útil: sin él, una base de datos relacional no puede responder preguntas reales.