Mantén SQLtest vivo: Ayuda a cubrir los costos del servidor de este mes de $100 para mantener todas las lecciones y el playground de SQL en línea. Apoya el proyecto →
Código SQL copiado al portapapeles

Lección 5.2 · Tiempo de lectura: ~6 min

SQL INNER JOIN combina filas de dos tablas y devuelve solo los pares en los que la condición de unión es verdadera, es decir, filas que tienen coincidencia en ambas tablas. En esta lección aprenderás la sintaxis de INNER JOIN, por qué importan los alias de tablas, cómo unir tres tablas y qué pasa con las filas sin coincidencia.

SQL INNER JOIN: combinar filas coincidentes

En la lección anterior viste por qué los datos se reparten en varias tablas y cómo las claves las conectan. INNER JOIN es la forma más común de volver a juntar los datos: una ciudad con su país, un pago con su cliente, un actor con sus películas.

SQL INNER JOIN: las filas de dos tablas se emparejan según la condición de unión, y solo aparecen en el resultado las filas con coincidencia en ambas tablas

Qué devuelve INNER JOIN

INNER JOIN revisa la condición de unión para pares de filas de las dos tablas y conserva solo los pares en los que es verdadera.

  • Una fila de la primera tabla sin fila coincidente en la segunda no aparece en el resultado.
  • Una fila de la segunda tabla sin coincidencia tampoco aparece.
  • Una fila con varias coincidencias aparece varias veces, una por cada coincidencia.

Por eso a INNER JOIN se lo describe a menudo como la intersección de dos tablas.

Sintaxis básica

SELECT table1.column1, table2.column2
FROM table1
INNER JOIN table2 ON table1.key_column = table2.key_column;
  • INNER JOIN indica la segunda tabla.
  • ON define la condición de unión, normalmente "clave foránea = clave primaria".
  • La palabra clave INNER es opcional: JOIN solo significa INNER JOIN.

Unir dos tablas

La tabla city guarda country_id, una referencia a la tabla country. Para ver el nombre del país junto a cada ciudad:

SELECT city.city, country.country
FROM city
INNER JOIN country ON city.country_id = country.country_id
ORDER BY country.country, city.city;

Resultado: 600 ciudades, cada una con el nombre de su país.

Cuando ambas tablas tienen una columna con el mismo nombre, como country_id aquí, hay que anteponerle el nombre de la tabla; si no, la base de datos informa una columna ambigua.


Alias de tablas

Los nombres de tabla largos hacen difíciles de leer los joins. Un alias de tabla es un nombre corto que se define después de la tabla:

SELECT ci.city, co.country
FROM city AS ci
INNER JOIN country AS co ON ci.country_id = co.country_id
ORDER BY co.country, ci.city;

El resultado es el mismo. Cuando una tabla tiene alias, usa el alias en toda la consulta. Elige alias cortos pero significativos: ci y co se siguen mejor que a y b.


Unir tres tablas

Un actor puede actuar en muchas películas, y una película tiene muchos actores. Una relación de muchos a muchos como esta se guarda en una tabla intermedia: film_actor contiene pares (actor_id, film_id). Para listar actores con títulos de películas, une las tres tablas:

SELECT a.first_name, a.last_name, f.title
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
ORDER BY a.last_name, a.first_name, f.title
LIMIT 10;

Resultado: los primeros 10 pares actor–película en orden alfabético de actores.

  1. La primera unión agrega las filas de film_actor de cada actor.
  2. La segunda unión agrega la película de cada una de esas filas.
  3. Cada JOIN trabaja con el resultado del anterior, así que puedes encadenar tantas tablas como necesites.

Combinar JOIN con WHERE y ORDER BY

Después de un join vienen las cláusulas ya conocidas. Por ejemplo, las películas con Nick Wahlberg:

SELECT f.title, f.release_year, f.rating
FROM actor AS a
INNER JOIN film_actor AS fa ON fa.actor_id = a.actor_id
INNER JOIN film AS f ON f.film_id = fa.film_id
WHERE a.first_name = 'NICK'
  AND a.last_name = 'WAHLBERG'
ORDER BY f.title;

Resultado: los títulos, años de estreno y clasificaciones de todas las películas con este actor.


Las filas sin coincidencia desaparecen

INNER JOIN descarta en silencio las filas sin coincidencia. Sakila tiene 1000 películas, pero solo 958 tienen copias en la tabla inventory:

SELECT f.title, i.inventory_id, i.store_id
FROM film AS f
INNER JOIN inventory AS i ON i.film_id = f.film_id
ORDER BY f.title
LIMIT 10;

Resultado: películas con sus copias; 42 películas sin copias no aparecen, y una película con varias copias aparece varias veces.

Cuando las filas sin coincidencia deben quedar en el resultado, usa LEFT JOIN, que aprenderás en la próxima lección.


Conclusiones clave:

  • INNER JOIN devuelve solo los pares de filas que cumplen la condición ON.
  • Las filas sin coincidencia en la otra tabla se descartan; las filas con varias coincidencias se repiten.
  • JOIN e INNER JOIN son lo mismo.
  • Usa alias de tablas y antepón la tabla a las columnas que existen en ambas.
  • Encadena varios JOIN para atravesar tablas intermedias como film_actor.

Preguntas frecuentes

¿Cuál es la diferencia entre JOIN e INNER JOIN?

Ninguna. JOIN sin tipo es un INNER JOIN en todas las bases de datos principales. Escribir INNER JOIN de forma explícita aclara la intención cuando una consulta mezcla distintos tipos de join.

¿Por qué mi INNER JOIN devuelve filas duplicadas?

Porque una fila tiene varias coincidencias en la otra tabla. Una película con cuatro copias en inventory aparece cuatro veces después de unir film e inventory. Es el comportamiento correcto del join; agrega o filtra si necesitas una fila por película.

¿Se pueden unir más de dos tablas en SQL?

Sí. Agrega un JOIN ... ON ... por cada tabla. Cada join conecta una tabla nueva con las que ya están unidas.