Módulo 4 · Relacionar tablas

Combina varias tablas sin duplicar filas

Usa varios JOIN y aprende a detectar por qué aparecen filas repetidas.

28 minNivel IntermedioAntes necesitas: INNER JOIN y LEFT JOIN

0 de 45 lecciones

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

Estructura
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 y líneas utilizadas en el ejemplo
pedido_idclienteproductocantidad
101Ana TorresRatón1
101Ana TorresTeclado1
101Ana TorresAuriculares1

La consulta parte de un pedido, encuentra su cliente, recorre sus líneas y obtiene el nombre de cada producto.

SQL
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;
Resultado esperado
pedido_idclienteproductocantidad
101Ana TorresRatón1
101Ana TorresTeclado1
101Ana TorresAuriculares1

Cómo funciona

  1. El pedido 101 encuentra una sola fila de cliente.
  2. Ese pedido encuentra tres filas en detalle_pedido; por eso el resultado pasa a tener tres filas.
  3. Cada línea encuentra un producto y añade su nombre sin cambiar la cantidad de filas.
Comprueba tu comprensión

¿Qué representa cada fila del resultado final?

Un error habitual

Sumar después de multiplicar filas

Consulta problemática
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

Pendiente

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…

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.

Conceptos relacionados