QuieroProgramar por Rodri Gonzalez
SQL · Lección 08 de 15

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.

80–100 min Prerrequisitos: SQL 07
01

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)
LEFT JOIN es el más usado de los OUTER JOINs. En la práctica, casi siempre usás INNER o LEFT. RIGHT es poco frecuente (podés invertir el orden de las tablas y usar LEFT). FULL es raro en análisis diario. Focalizate en dominar LEFT JOIN.

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
En el trabajo: "¿Qué clientes no tienen tarjeta de crédito?" (oportunidad de cross-sell), "¿Qué productos no se vendieron este mes?" (stock muerto), "¿Qué sucursales no registraron transacciones?" (posible problema operativo). Todos se resuelven con LEFT JOIN + IS NULL.

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;
02

Ejemplos explicados paso a paso

Ejemplo 1: INNER vs LEFT — la diferencia

ejemplo_01_inner_vs_left.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Anti-JOIN — encontrar los que NO tienen

ejemplo_02_anti_join.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: LEFT JOIN + COALESCE + GROUP BY

ejemplo_03_coalesce.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: CROSS JOIN — generar combinaciones

ejemplo_04_cross.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: Reporte completo — todos los clientes con detalle

ejemplo_05_reporte.sqlSQL

        
Hacé clic en ▶ Ejecutar
03

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)
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: LEFT JOIN básico

Mostrá TODOS los clientes con sus cuentas (incluso sin cuenta). Debe incluir Sosa.

ejercicio_01.sqlDebe incluir "Sosa"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Anti-JOIN — clientes sin cuenta

Encontrá clientes que NO tienen cuenta. Debe incluir Sosa.

ejercicio_02.sqlDebe incluir "Sosa"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: COALESCE con LEFT JOIN

Mostrá saldo de cada cliente, usando 0 cuando no tiene cuenta. Debe incluir 0.

ejercicio_03.sqlDebe incluir "0"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: LEFT JOIN + GROUP BY

Saldo total por cliente (incluyendo $0 para los sin cuenta). Debe incluir 650000.

ejercicio_04.sqlDebe incluir "650000"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Contar productos por cliente

¿Cuántas cuentas tiene cada cliente? (0 si no tiene). Debe incluir 0.

ejercicio_05.sqlDebe incluir "0"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: CROSS JOIN

Generá todas las combinaciones de 3 sucursales × 2 productos. Debe incluir 9 (si son 3×3) o la cantidad correcta.

ejercicio_06.sqlDebe incluir "Centro"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Productos no vendidos (anti-JOIN)

Encontrá productos que NO tuvieron ventas. Debe incluir Auriculares.

ejercicio_07.sqlDebe incluir "Auriculares"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_08.sqlDebe incluir "Sin cuenta"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Doble LEFT JOIN — 3 tablas

TODOS los clientes con sus cuentas y transacciones (NULL donde no haya). Debe incluir Sosa.

ejercicio_09.sqlDebe incluir "Sosa"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10.sqlDebe incluir "penetracion"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

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.