LEFT, RIGHT y FULL JOIN
INNER JOIN solo muestra coincidencias. Pero a veces necesitás ver TODOS los clientes, incluso los que no tienen cuentas. O encontrar "los que NO tienen" — clientes sin transacciones, productos sin ventas. Para eso existen los OUTER JOINs.
Concepto teórico
Tipos de JOIN
| JOIN | Qué incluye | Uso típico |
|---|---|---|
INNER JOIN |
Solo coincidencias de AMBAS tablas | Combinar datos relacionados |
LEFT JOIN |
TODAS las filas de la izquierda + coincidencias de la derecha | Todos los clientes, con o sin cuenta |
RIGHT JOIN |
TODAS las filas de la derecha + coincidencias de la izquierda | Menos usado (invertí el LEFT) |
FULL JOIN |
TODAS las filas de AMBAS tablas | Reconciliación de datos |
CROSS JOIN |
Producto cartesiano (cada fila × cada fila) | Generar combinaciones |
LEFT JOIN — la estrella de los OUTER JOINs
LEFT JOIN devuelve TODAS las filas de la tabla izquierda (la del FROM). Si hay coincidencia en la
tabla derecha, trae los datos. Si NO hay coincidencia, llena con NULL:
SELECT c.nombre, cu.tipo, cu.saldo FROM clientes c -- tabla IZQUIERDA: todos aparecen LEFT JOIN cuentas cu ON c.id = cu.cliente_id; -- tabla DERECHA: NULL si no hay match -- Resultado: -- García | CA$ | 150000 ← tiene cuenta -- López | CA$ | 320000 ← tiene cuenta -- Sosa | NULL | NULL ← NO tiene cuenta (LEFT JOIN lo incluye igual)
El patrón "Anti-JOIN" — encontrar los que NO tienen
Uno de los patrones más poderosos: LEFT JOIN + WHERE ... IS NULL para encontrar filas SIN coincidencia:
-- Clientes SIN cuentas SELECT c.nombre FROM clientes c LEFT JOIN cuentas cu ON c.id = cu.cliente_id WHERE cu.id IS NULL; -- las que NO tuvieron match
COALESCE con LEFT JOIN
Cuando un LEFT JOIN produce NULLs, usás COALESCE para reemplazarlos con valores por defecto:
SELECT c.nombre,
COALESCE(SUM(cu.saldo), 0) AS saldo_total
FROM clientes c
LEFT JOIN cuentas cu ON c.id = cu.cliente_id
GROUP BY c.id, c.nombre;
Ejemplos explicados paso a paso
Ejemplo 1: INNER vs LEFT — la diferencia
Hacé clic en ▶ Ejecutar
Ejemplo 2: Anti-JOIN — encontrar los que NO tienen
Hacé clic en ▶ Ejecutar
Ejemplo 3: LEFT JOIN + COALESCE + GROUP BY
Hacé clic en ▶ Ejecutar
Ejemplo 4: CROSS JOIN — generar combinaciones
Hacé clic en ▶ Ejecutar
Ejemplo 5: Reporte completo — todos los clientes con detalle
Hacé clic en ▶ Ejecutar
Referencia rápida
| JOIN | Tabla izquierda | Tabla derecha | Sin coincidencia |
|---|---|---|---|
| INNER | Solo coincidencias | Solo coincidencias | Se excluye |
| LEFT | TODAS | Solo coincidencias | NULL en cols de derecha |
| RIGHT | Solo coincidencias | TODAS | NULL en cols de izquierda |
| FULL | TODAS | TODAS | NULL donde no hay match |
| CROSS | TODAS × TODAS | TODAS × TODAS | Producto cartesiano |
| Patrón | Código |
|---|---|
| Todos con o sin | LEFT JOIN ... (todos los clientes) |
| Los que NO tienen | LEFT JOIN ... WHERE t2.id IS NULL |
| Reemplazar NULL | COALESCE(SUM(col), 0) |
Ejercicios
Ejercicio 1: LEFT JOIN básico
Mostrá TODOS los clientes con sus cuentas (incluso sin cuenta). Debe incluir Sosa.
Hacé clic en ▶ Ejecutar
Ejercicio 2: Anti-JOIN — clientes sin cuenta
Encontrá clientes que NO tienen cuenta. Debe incluir Sosa.
Hacé clic en ▶ Ejecutar
Ejercicio 3: COALESCE con LEFT JOIN
Mostrá saldo de cada cliente, usando 0 cuando no tiene cuenta. Debe incluir 0.
Hacé clic en ▶ Ejecutar
Ejercicio 4: LEFT JOIN + GROUP BY
Saldo total por cliente (incluyendo $0 para los sin cuenta). Debe incluir 650000.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Contar productos por cliente
¿Cuántas cuentas tiene cada cliente? (0 si no tiene). Debe incluir 0.
Hacé clic en ▶ Ejecutar
Ejercicio 6: CROSS JOIN
Generá todas las combinaciones de 3 sucursales × 2 productos. Debe incluir 9 (si son 3×3) o la
cantidad correcta.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Productos no vendidos (anti-JOIN)
Encontrá productos que NO tuvieron ventas. Debe incluir Auriculares.
Hacé clic en ▶ Ejecutar
Ejercicio 8: LEFT JOIN + CASE para estado
Mostrá cada cliente con estado "Con cuenta" o "Sin cuenta" usando LEFT JOIN + CASE. Debe incluir
Sin cuenta.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Doble LEFT JOIN — 3 tablas
TODOS los clientes con sus cuentas y transacciones (NULL donde no haya). Debe incluir Sosa.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Reporte de penetración de productos
Para cada ciudad, mostrá: total clientes, clientes CON cuenta, clientes SIN cuenta, y % de penetración. Debe
incluir penetracion.
Hacé clic en ▶ Ejecutar
Resumen y conexión
LEFT JOINincluye TODAS las filas de la tabla izquierda, con NULL donde no hay match.- Anti-JOIN:
LEFT JOIN ... WHERE t2.id IS NULLencuentra los que NO tienen coincidencia. COALESCE(SUM(col), 0)reemplaza NULLs por 0 en agregaciones con LEFT JOIN.CROSS JOINgenera el producto cartesiano (todas las combinaciones).- En la práctica, usás INNER y LEFT en el 95% de los casos.
En la siguiente lección (09 · Subconsultas) vas a aprender a usar SELECTs dentro de otros SELECTs — la herramienta para consultas complejas que no se resuelven con un solo SELECT.