Al terminar, podrás
- Predecir cuántas filas puede producir una cadena de
JOIN. - Relacionar pedidos, clientes, líneas y productos sin perder el origen de cada dato.
- Detectar cuándo una relación uno-a-muchos puede inflar una suma.
Recupera lo aprendido: ¿Puede una fila de clientes producir varias filas después de relacionarse con pedidos?
La idea clave
Cada JOIN crea combinaciones de filas. Si un pedido tiene tres líneas, al unirlo con detalle_pedido ese pedido aparece tres veces. Una unión posterior trabaja sobre esas tres filas, no sobre el pedido original.
Predice antes de ejecutar: identifica la relación de cada paso —uno a uno, uno a muchos o muchos a muchos— y anota qué entidad define una fila del resultado.
Control de cardinalidad: después de cada JOIN, detente y pregunta “¿cuántas filas puede producir una fila de la etapa anterior?”. Si la respuesta es “varias”, cualquier valor de la etapa anterior puede repetirse. Haz esta comprobación antes de sumar o contar.
La sintaxis básica
SELECT ...
FROM tabla_a AS a
JOIN tabla_b AS b ON b.clave = a.clave
JOIN tabla_c AS c ON c.clave = b.clave;Lee la cadena de izquierda a derecha: primero se relacionan a y b; después, cada fila intermedia se compara con c.
Ejemplo paso a paso
| pedido_id | cliente | producto | cantidad |
|---|---|---|---|
| 101 | Ana Torres | Ratón | 1 |
| 101 | Ana Torres | Teclado | 1 |
| 101 | Ana Torres | Auriculares | 1 |
La consulta parte de un pedido, encuentra su cliente, recorre sus líneas y obtiene el nombre de cada producto.
SELECT p.id AS pedido_id,
c.nombre AS cliente,
pr.nombre AS producto,
d.cantidad
FROM pedidos AS p
JOIN clientes AS c ON c.id = p.cliente_id
JOIN detalle_pedido AS d ON d.pedido_id = p.id
JOIN productos AS pr ON pr.id = d.producto_id
WHERE p.id = 101
ORDER BY d.id;| pedido_id | cliente | producto | cantidad |
|---|---|---|---|
| 101 | Ana Torres | Ratón | 1 |
| 101 | Ana Torres | Teclado | 1 |
| 101 | Ana Torres | Auriculares | 1 |
Cómo funciona
- El pedido 101 encuentra una sola fila de cliente.
- Ese pedido encuentra tres filas en
detalle_pedido; por eso el resultado pasa a tener tres filas. - Cada línea encuentra un producto y añade su nombre sin cambiar la cantidad de filas.
Un error habitual
Sumar después de multiplicar filas
SELECT p.id, SUM(p.total)
FROM pedidos AS p
JOIN detalle_pedido AS d ON d.pedido_id = p.id
GROUP BY p.id;p.total se repite una vez por línea. En el pedido 101 se sumaría tres veces. Si quieres calcular el importe desde el detalle, suma d.cantidad * d.precio_unitario; si quieres el total guardado del pedido, no lo agregues sobre una relación que lo duplica.
Puente hacia el laboratorio: empieza por clientes y coloca el filtro de pedidos no cancelados en ON para conservar a todos. Agrupa por c.id, c.nombre. SUM(p.total) devuelve NULL si no hay importes; COALESCE(SUM(p.total), 0) sustituye ese resultado por cero. COALESCE devuelve el primer argumento que no sea NULL.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Escribe una consulta que devuelva todos los clientes y su total no cancelado; usa 0 cuando no tengan pedidos válidos.
Resultado esperado: 12 filas con nombre, total. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Empieza con clientes.
Usa LEFT JOIN para conservarlos.
Filtra cancelados dentro de ON y agrupa por cliente.
Solución
SELECT c.nombre, COALESCE(SUM(p.total), 0) AS total FROM clientes AS c LEFT JOIN pedidos AS p ON c.id = p.cliente_id AND p.estado <> 'cancelado' GROUP BY c.id, c.nombre;Colocar el filtro en ON conserva clientes sin pedidos válidos; COALESCE convierte la suma ausente en cero.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Comprueba si puedes explicarlo
Un pedido de 100 tiene tres líneas. Después del JOIN, ¿SUM(p.total) da 100 o 300?
Ver respuesta razonada
Da 300 porque el importe de cabecera aparece tres veces. Si quieres el total guardado, consulta la cabecera; si quieres reconstruirlo desde las líneas, suma cantidad por precio_unitario.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- Cada JOIN trabaja sobre el resultado intermedio del paso anterior.
- La tabla del lado muchos suele definir la granularidad final.
- Agrega únicamente después de comprobar qué valores se han repetido.
A continuación: Continúa con Práctica: elige y comprueba un JOIN.
Fuentes técnicas consultadas
Estas referencias describen cómo se encadenan las tablas unidas y cómo la condición de unión determina las coincidencias.