-- 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.
-- 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.
-- 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).
-- 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.
-- Combinación cartesiana
SELECT c.nombre, pr.nombre
FROM clientes c
CROSS JOIN productos pr;
Devuelve todas las combinaciones posibles (cuidado con tablas grandes).
-- 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;
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.
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.
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.
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.
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.
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.
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.
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