Lección 5.8: Escenarios y Técnicas de JOIN Prácticos
Hasta ahora, hemos explorado la mecánica de diferentes tipos de joins. En esta lección, iremos más allá de lo básico y veremos cómo aplicar joins para resolver problemas comerciales comunes, manejar múltiples tablas y combinar joins con agregación.
1. Uniendo Múltiples Tablas (3+)
En bases de datos complejas, los datos que necesitas a menudo están distribuidos en tres o más tablas conectadas por tablas intermedias.
Escenario: Queremos ver una lista de actores y los títulos de las películas en las que han aparecido.
Esto requiere tres tablas: actor, film_actor (el puente) y film.
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
ORDER BY
a.last_name
LIMIT 10;
Cómo funciona:
- Cada
JOINcrea una nueva tabla virtual que el siguienteJOINpuede utilizar. - El orden de los joins generalmente sigue el camino de relación en el ERD (Diagrama de Base de Datos).
2. Usando Funciones Agregadas con JOINs
Uno de los usos más poderosos de los joins es calcular estadísticas a través de tablas relacionadas. Puedes usar funciones como COUNT, SUM y AVG después de hacer un join.
Escenario: Calcular el total gastado por cada cliente.
SELECT
c.first_name,
c.last_name,
SUM(p.amount) AS total_spent
FROM
customer AS c
INNER JOIN
payment AS p ON c.customer_id = p.customer_id
GROUP BY
c.customer_id, c.first_name, c.last_name
ORDER BY
total_spent DESC;
Nota: Al usar GROUP BY con joins, siempre incluye la clave primaria (customer_id) para asegurar resultados únicos si dos clientes tienen el mismo nombre.
3. Encontrando Datos Faltantes (El "Anti-Join")
Podemos usar LEFT JOIN combinado con una cláusula WHERE para encontrar registros que no tienen una entrada correspondiente en otra tabla.
Escenario: Encontrar todas las películas que actualmente NO están en nuestro inventario (lo que significa que tenemos el registro pero no copias físicas).
SELECT
f.title
FROM
film AS f
LEFT JOIN
inventory AS i ON f.film_id = i.film_id
WHERE
i.inventory_id IS NULL;
4. La Trampa del FILTRO: WHERE vs. ON
Un error común es poner un filtro en la cláusula WHERE al usar un LEFT JOIN, lo que accidentalmente lo convierte de nuevo en un INNER JOIN.
Incorrecto:
-- Esto elimina clientes sin pagos porque p.payment_date se verifica después del join
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
WHERE p.payment_date > '2005-08-01';
Correcto (manteniendo todos los clientes):
-- Esto mantiene todos los clientes pero solo une datos de pago que coinciden con la fecha
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
AND p.payment_date > '2005-08-01';
Conclusiones Clave de Esta Lección
- Encadenando Joins: Puedes unir tantas tablas como necesites añadiendo más declaraciones
JOIN. - Informes: Combinar
JOINconGROUP BYpermite informes complejos a través de entidades comerciales. - Auditoría de Datos: Usa
LEFT JOIN ... WHERE ... IS NULLpara encontrar brechas en tus datos. - Precisión Lógica: Ten cuidado donde colocas tus filtros (en
ONvs.WHERE) al trabajar con joins externos.