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.
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 JOINindica la segunda tabla.ONdefine la condición de unión, normalmente "clave foránea = clave primaria".- La palabra clave
INNERes opcional:JOINsolo significaINNER 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.
- La primera unión agrega las filas de
film_actorde cada actor. - La segunda unión agrega la película de cada una de esas filas.
- Cada
JOINtrabaja 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 JOINdevuelve solo los pares de filas que cumplen la condiciónON.- Las filas sin coincidencia en la otra tabla se descartan; las filas con varias coincidencias se repiten.
JOINeINNER JOINson lo mismo.- Usa alias de tablas y antepón la tabla a las columnas que existen en ambas.
- Encadena varios
JOINpara atravesar tablas intermedias comofilm_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.