Aprende SQL · lección gratuita

Lección 17 · Combinar tablas: INNER JOIN

Resumen

Hasta ahora consultabas una tabla a la vez, pero los datos reales viven repartidos en varias tablas relacionadas por claves. Un JOIN combina filas de dos o más tablas según una condición de coincidencia. El INNER JOIN es el más común: devuelve solo las filas que tienen pareja en ambas tablas; las que no coinciden simplemente desaparecen del resultado.

Sintaxis / Conceptos

El motor evalúa el FROM ... JOIN ... ON antes que WHERE, GROUP BY y SELECT. Conceptualmente, primero forma el producto de ambas tablas y se queda con los pares que cumplen el ON; después aplica el resto de cláusulas sobre ese conjunto combinado.

Diferencia clave entre ON y WHERE: en un INNER JOIN son intercambiables para filtrar, pero con LEFT JOIN (próxima lección) no lo son. Por buena práctica, pon en ON la condición de emparejamiento y en WHERE los filtros del resultado.

Un error frecuente es olvidar el ON: en SQLite un JOIN sin ON produce un producto cartesiano (todas las combinaciones), casi nunca lo que quieres.

SELECT e.nombre, e.cargo, d.nombre AS departamento FROM empleados e JOIN departamentos d ON e.departamento_id = d.id LIMIT 6

Ejemplos

-- Cada empleado junto al nombre y ciudad de su departamento
SELECT e.nombre, e.cargo, d.nombre AS departamento, d.ciudad
FROM empleados e
INNER JOIN departamentos d ON e.departamento_id = d.id
ORDER BY d.nombre, e.nombre;

-- JOIN + filtro + agregación: salario promedio por departamento en Lima
SELECT d.nombre AS departamento, ROUND(AVG(e.salario), 0) AS salario_medio
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.id
WHERE d.ciudad = 'Lima'
GROUP BY d.nombre
ORDER BY salario_medio DESC;

-- Tres tablas: qué cliente y qué vendedor hay detrás de cada pedido
SELECT p.id AS pedido, c.empresa AS cliente, e.nombre AS vendedor, p.estado
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
JOIN empleados e ON p.empleado_id = e.id
ORDER BY p.id
LIMIT 10;
💡 Si un JOIN devuelve más filas de las esperadas, suele ser un ON incorrecto o una relación uno-a-muchos (un pedido tiene varias líneas). Si devuelve menos, alguna fila no encuentra pareja: ahí necesitarás un LEFT JOIN.

Cheatsheet

Cláusula / FormaQué hace
FROM a JOIN b ON a.fk = b.idEmpareja filas de a y b que coincidan
INNER JOINSolo filas con pareja en ambos lados (default de JOIN)
FROM empleados eAlias e para abreviar y desambiguar
e.nombre, d.nombreCualifica columnas con el mismo nombre
JOIN ... JOIN ...Encadena varias tablas en una consulta

---

← Agrupación múltiple y orden de ejecuciónConservar filas: LEFT y RIGHT JOIN →

Ver todas las lecciones de Aprende SQL →