Saltar al contenido

Lección 13 de 15 · Lectura y práctica

JOIN: Combinar datos de múltiples tablas

Concepto claveImagina que tienes dos listas de Excel: una con clientes y otra con pedidos. Quieres saber qué cliente hizo cada pedido. En SQL, para combinar datos de dos o más tablas, usamos JOIN. Es como emparejar registros de.

Del concepto a la práctica

Taller de esta lección

Un JOIN necesita una relación explícita y el tipo elegido determina qué filas sobreviven. Para listar todos los socios, incluso quienes nunca pidieron un libro, conviene comenzar en socios y usar LEFT JOIN hacia prestamos.

Ejemplo resuelto

sql
SELECT s.nombre, p.id AS prestamo
FROM socios s
LEFT JOIN prestamos p ON p.socio_id = s.id
ORDER BY s.id;

Con socios (1,'Mara'), (2,'Omar') y un préstamo (9,1), la salida es Mara-9 y Omar-NULL. Omar no desaparece porque está en la tabla izquierda.

Pruébalo

  1. Crea las dos tablas con sus identificadores.

  2. Inserta dos socios y un préstamo para el primero.

  3. Ejecuta el LEFT JOIN.

  4. Ejecuta un INNER JOIN y compara las filas.

Resultado esperado: LEFT JOIN devuelve dos socios; INNER JOIN devuelve solo Mara.

Comprueba tu resultado

Error frecuente: poner una condición de la tabla derecha en WHERE y convertir accidentalmente el LEFT JOIN en filtro obligatorio. Corrígelo observando dónde debe aplicarse la condición y conserva el NULL del socio sin préstamo.

Tablas de clientes y pedidos: INNER JOIN conserva coincidencias y LEFT JOIN conserva también a Luis sin pedidos.
CursaloMapa de práctica
Relacionar tablas sin perder filas

Una clave conecta cada pedido con su cliente. INNER JOIN devuelve las coincidencias y puede producir varias filas por cliente. LEFT JOIN conserva también los clientes sin pedido y representa los campos ausentes con NULL.

Ver la infografía en tamaño completo ↗

Concepto clave

Imagina que tienes dos listas de Excel: una con clientes y otra con pedidos. Quieres saber qué cliente hizo cada pedido. En SQL, para combinar datos de dos o más tablas, usamos JOIN. Es como emparejar registros de una tabla con los de otra usando una llave común (por ejemplo, el ID del cliente).

El tipo más común es INNER JOIN, que solo devuelve las filas que tienen coincidencia en ambas tablas. Si un cliente no tiene pedidos, no aparece. Si un pedido no tiene cliente, tampoco. Es como la intersección de dos círculos en un diagrama de Venn.

Otros tipos incluyen LEFT JOIN (todo de la tabla izquierda, y solo coincidencias de la derecha), RIGHT JOIN (al revés) y FULL OUTER JOIN (todo de ambas, con nulos donde no hay coincidencia). Para empezar, domina INNER JOIN y LEFT JOIN.

Cómo funciona en la práctica

Supón que tienes dos tablas: clientes y pedidos. clientes tiene id_cliente, nombre. pedidos tiene id_pedido, id_cliente, total. Quieres listar todos los pedidos con el nombre del cliente.

Paso 1: Identifica la columna común: id_cliente.
Paso 2: Escribe el SELECT con las columnas que quieres: pedidos.id_pedido, clientes.nombre, pedidos.total.
Paso 3: Usa INNER JOIN: FROM pedidos INNER JOIN clientes ON pedidos.id_cliente = clientes.id_cliente.

El resultado será una tabla con cada pedido y el nombre del cliente que lo hizo. Si un cliente no tiene pedidos, no aparece.

Código en acción

Aquí tienes un ejemplo completo con datos de muestra:

-- Crear tablas
CREATE TABLE clientes (
    id_cliente INT PRIMARY KEY,
    nombre VARCHAR(50)
);

CREATE TABLE pedidos (
    id_pedido INT PRIMARY KEY,
    id_cliente INT,
    total DECIMAL(10,2),
    FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
);

-- Insertar datos
INSERT INTO clientes VALUES (1, 'Ana'), (2, 'Luis'), (3, 'Carlos');
INSERT INTO pedidos VALUES (101, 1, 150.00), (102, 2, 200.00), (103, 1, 75.00);

-- INNER JOIN: solo pedidos con cliente existente
SELECT pedidos.id_pedido, clientes.nombre, pedidos.total
FROM pedidos
INNER JOIN clientes ON pedidos.id_cliente = clientes.id_cliente;

Resultado:

id_pedido | nombre | total
101       | Ana    | 150.00
102       | Luis   | 200.00
103       | Ana    | 75.00

Nota: Carlos no aparece porque no tiene pedidos.

Errores comunes

  • Olvidar la condición ON: Si pones JOIN sin ON, obtienes un producto cartesiano (todas las combinaciones). Siempre especifica ON.
  • Confundir INNER JOIN con LEFT JOIN: INNER JOIN excluye filas sin coincidencia; LEFT JOIN las incluye con nulos. Decide según necesites datos de la tabla izquierda aunque no tengan match.
  • No usar alias de tabla: Si las columnas tienen el mismo nombre en ambas tablas, debes prefijarlas con el nombre de la tabla o alias. Ejemplo: c.nombre vs p.nombre.
  • JOIN en columnas no indexadas: En tablas grandes, JOIN sin índices puede ser lento. Asegúrate de que las columnas de JOIN tengan índices.
  • Usar WHERE en lugar de ON para condiciones de JOIN: Aunque a veces funciona, es mejor poner las condiciones de relación en ON y los filtros adicionales en WHERE.

Checklist de dominio

  • [ ] Puedo explicar qué es un JOIN y para qué sirve.
  • [ ] Distingo entre INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL OUTER JOIN.
  • [ ] Escribo una consulta con INNER JOIN usando ON correctamente.
  • [ ] Escribo una consulta con LEFT JOIN y entiendo los nulos resultantes.
  • [ ] Uso alias de tabla para hacer el código más legible.
  • [ ] Identifico y corrijo errores comunes como falta de ON o producto cartesiano.
  • [ ] He completado el ejercicio práctico de combinar tablas de clientes y pedidos.

Combina datos de clientes y pedidos

Objetivo: Crear una consulta que muestre todos los clientes (incluso los que no tienen pedidos) junto con el total de sus pedidos. Si un cliente no tiene pedidos, debe aparecer con total NULL.

Entregable: El script SQL completo (CREATE TABLE, INSERT y SELECT) en un archivo .sql o pegado en la respuesta.

Pasos:

  1. Crea una tabla clientes con columnas: id_cliente INT PRIMARY KEY, nombre VARCHAR(50).
  2. Crea una tabla pedidos con columnas: id_pedido INT PRIMARY KEY, id_cliente INT, total DECIMAL(10,2), y una clave foránea a clientes(id_cliente).
  3. Inserta al menos 3 clientes: Ana, Luis, Carlos. Inserta al menos 2 pedidos para Ana, 1 para Luis, y ninguno para Carlos.
  4. Escribe un SELECT que use LEFT JOIN para mostrar: clientes.nombre, SUM(pedidos.total) como total_gastado. Agrupa por clientes.id_cliente y clientes.nombre.
  5. Ordena los resultados por total_gastado de mayor a menor (los NULL deben ir al final).

Mini-rúbrica de evaluación:

  • (1 punto) Las tablas están creadas correctamente con tipos de datos adecuados.
  • (1 punto) Los datos insertados permiten probar clientes con y sin pedidos.
  • (2 puntos) La consulta usa LEFT JOIN correctamente e incluye a Carlos con NULL.
  • (1 punto) La agregación SUM y el GROUP BY están bien aplicados.
  • (1 punto) El ordenamiento coloca los NULL al final (puedes usar ORDER BY total_gastado DESC NULLS LAST o similar según tu SGBD).
Pistas
  • Recuerda que LEFT JOIN toma todos los registros de la tabla izquierda (clientes) y solo las coincidencias de la derecha (pedidos).
  • Para sumar los totales, usa SUM(pedidos.total). Los clientes sin pedidos tendrán NULL, que se puede mostrar como 0 con COALESCE(SUM(pedidos.total), 0).
  • El GROUP BY debe incluir todas las columnas no agregadas del SELECT. En este caso, clientes.id_cliente y clientes.nombre.

Sigue con SQL para Principiantes: Domina las Bases de Datos desde Cero

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.