Misión 2 · Lección 4

Joins en SQL

Objetivos

INNER JOIN

-- Clientes y sus pedidos
SELECT c.nombre, p.total
FROM clientes c
INNER JOIN pedidos p
ON c.id = p.cliente_id;

Muestra solo las filas con coincidencias en ambas tablas.

LEFT JOIN

-- Todos los clientes y sus pedidos (si tienen)
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id;

Incluye todos los clientes, aunque no tengan pedidos.

RIGHT JOIN

-- Todos los pedidos y sus clientes
SELECT c.nombre, p.total
FROM clientes c
RIGHT JOIN pedidos p
ON c.id = p.cliente_id;

Incluye todos los pedidos, incluso si no hay cliente asociado (raro pero posible).

FULL OUTER JOIN

-- Todos los clientes y pedidos, coincidan o no
SELECT c.nombre, p.total
FROM clientes c
FULL JOIN pedidos p
ON c.id = p.cliente_id;

Combina LEFT y RIGHT JOIN: trae todo, aunque no coincida.

CROSS JOIN

-- Combinación cartesiana
SELECT c.nombre, pr.nombre
FROM clientes c
CROSS JOIN productos pr;

Devuelve todas las combinaciones posibles (cuidado con tablas grandes).

JOIN en varias tablas

-- Clientes, pedidos y productos
SELECT c.nombre, pr.nombre, p.total
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
JOIN productos pr ON pr.id = p.producto_id;

Alias en Joins

SELECT c.nombre AS cliente, pr.nombre AS producto
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
JOIN productos pr ON pr.id = p.producto_id;

Los alias hacen más legible la consulta.

Ejemplo: Clientes sin pedidos

SELECT c.nombre
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.id IS NULL;

Útil para detectar clientes inactivos.

INNER JOIN: Clientes y sus Representantes de Ventas

  SELECT c.customerName, e.firstName, e.lastName
  FROM customers c
  INNER JOIN employees e 
    ON c.salesRepEmployeeNumber = e.employeeNumber;
  

Ejercicio: Muestra los clientes junto con el correo electrónico de su representante.

LEFT JOIN: Clientes con o sin Pagos

  SELECT c.customerName, p.checkNumber, p.amount
  FROM customers c
  LEFT JOIN payments p 
    ON c.customerNumber = p.customerNumber
  ORDER BY c.customerName;
  

Ejercicio: Encuentra los clientes que no han hecho ningún pago.

RIGHT JOIN: Órdenes y Clientes

  SELECT o.orderNumber, o.orderDate, c.customerName
  FROM orders o
  RIGHT JOIN customers c 
    ON o.customerNumber = c.customerNumber;
  

Ejercicio: Identifica los clientes que aún no tienen órdenes registradas.

JOIN con Múltiples Tablas: Órdenes, Detalles y Productos

  SELECT o.orderNumber, p.productName, od.quantityOrdered, od.priceEach
  FROM orders o
  JOIN orderdetails od ON o.orderNumber = od.orderNumber
  JOIN products p ON od.productCode = p.productCode;
  

Ejercicio: Lista los productos y cantidades pedidos por cada cliente.

JOIN + Agregación: Total Pagado por Cliente

  SELECT c.customerName, SUM(p.amount) AS totalPagado
  FROM customers c
  JOIN payments p ON c.customerNumber = p.customerNumber
  GROUP BY c.customerName
  ORDER BY totalPagado DESC;
  

Ejercicio: Encuentra el cliente que ha pagado la mayor cantidad total.

Ejercicio Avanzado

Consulta los clientes, su representante de ventas, el número de órdenes realizadas y el total pagado, mostrando solo los que han hecho más de 5 órdenes.

  -- Inténtalo tú: requiere combinar customers, employees, orders y payments
  

Ejercicio Guiado

  1. Haz un INNER JOIN para ver clientes y sus pedidos.
  2. Usa LEFT JOIN para mostrar todos los clientes aunque no compren.
  3. Encuentra productos que nunca se han vendido.