🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

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 JOIN crea una nueva tabla virtual que el siguiente JOIN puede 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 JOIN con GROUP BY permite informes complejos a través de entidades comerciales.
  • Auditoría de Datos: Usa LEFT JOIN ... WHERE ... IS NULL para encontrar brechas en tus datos.
  • Precisión Lógica: Ten cuidado donde colocas tus filtros (en ON vs. WHERE) al trabajar con joins externos.