Responder preguntas complejas de negocio con una sola consulta es el verdadero poder del modelo relacional. Cuando la información vive en varias tablas, los joins permiten cruzarla sin esfuerzo, evitando el trabajo manual de exportar datos y combinarlos en una hoja de cálculo. Aquí se explican los dos tipos fundamentales: inner join y left join, con ejemplos prácticos paso a paso.
¿Qué problema resuelven los joins en SQL?
Imagina que necesitas saber qué vendió una tienda en un país específico, durante el último trimestre, desglosado por categoría de producto [0:10]. Sin joins, tendrías que ejecutar varias consultas independientes y cruzar los resultados a mano. Con un join, todo se resuelve en una sola query.
Los joins combinan filas de dos o más tablas usando una columna en común, generalmente una clave foránea que conecta ambas tablas. Esto es la esencia del modelo relacional: las tablas se diseñan separadas, pero se consultan juntas.
¿Cómo funciona el inner join paso a paso?
El inner join retorna únicamente las filas que tienen coincidencia en ambas tablas [1:02]. Si un dato existe en la tabla A pero no en la tabla B, simplemente no aparece en el resultado.
¿Cómo se construye la sintaxis del inner join?
Partiendo de una consulta con agregación que mostraba solo el cliente_id y la cantidad de pedidos, se necesita además el nombre del cliente, que vive en otra tabla [1:30]. La construcción sigue estos pasos:
- Asignar alias a las tablas: la tabla
pedidos se abrevia como P y la tabla clientes como C [2:05].
- En el
SELECT, especificar de qué tabla proviene cada columna: P.cliente_id, C.nombre [2:30].
- Escribir
INNER JOIN clientes C después del FROM [2:00].
- Usar la cláusula
ON para indicar la columna que relaciona ambas tablas: P.cliente_id = C.cliente_id [3:05].
Los alias de tablas son indispensables cuando trabajas con joins porque permiten indicar con claridad de cuál tabla proviene cada columna, evitando ambigüedades.
¿Por qué el group by sigue siendo obligatorio?
Al ejecutar la consulta por primera vez, apareció un error [3:30]. La razón: cuando existe una función de agregación como COUNT(*), todas las columnas que no son agregaciones deben estar en el GROUP BY. Eso incluye tanto P.cliente_id como C.nombre [3:55]. La regla del group by no desaparece por usar joins; se sigue aplicando igual.
Una vez corregido, el resultado muestra el ID del cliente, su nombre y la cantidad de pedidos realizados [4:18]. Además, se puede combinar con HAVING para filtrar, por ejemplo, solo clientes con tres o más pedidos [4:35]. Y si se necesita el apellido, basta con agregar C.apellido al SELECT y al GROUP BY [5:08].
¿Cuándo usar left join en lugar de inner join?
El left join mantiene todas las filas de la tabla izquierda, tengan o no coincidencia en la tabla derecha [5:30]. Donde no hay coincidencia, el resultado aparece como NULL.
Un caso de uso clásico es identificar clientes sin pedidos [5:40]. Estos clientes existen en la tabla clientes pero no tienen ningún registro en la tabla pedidos. Son candidatos ideales para una campaña de reactivación.
- El
FROM parte de la tabla clientes (tabla izquierda).
- Se hace
LEFT JOIN pedidos (tabla derecha) usando la columna cliente_id.
- Se agrega un filtro
WHERE P.pedido_id IS NULL para quedarse solo con los clientes cuyo pedido es nulo [6:15].
- Se ordena por nombre con
ORDER BY.
El resultado devuelve todos los clientes con su correo electrónico que no han realizado ningún pedido [6:40]. Al agregar P.pedido_id al select, se confirma que el valor es NULL en cada fila.
La diferencia clave: el inner join descarta lo que no coincide; el left join preserva todo lo de la izquierda y rellena con nulos donde no hay coincidencia.
Pon en práctica lo aprendido con estos dos retos: primero, construye un inner join que cruce cuatro tablas mostrando pedido, cliente, sucursal, país y total. Segundo, usa left join para contar cuántos clientes nunca hicieron un pedido y calcula qué porcentaje representan. Comparte tus resultados en los comentarios.