Volver a la lista de artículos Artículos
Lectura de 8 minutos

Explicación de INNER JOIN en palabras sencillas

En este artículo, cubriré quizás el elemento más importante del lenguaje SQL. Así es. Estoy hablando de la cláusula INNER JOIN de SQL.

Como sabes, en una base de datos los datos se almacenan en varias tablas. En mi último artículo, cubrí cómo crear consultas SQL cuando los datos que necesitas están en una sola tabla. ¿Pero qué pasa si los datos que necesitas están en dos tablas? Para este caso, necesita usar una cláusula JOIN para combinar ambas tablas, que es algo similar a conectar ambas tablas. En este artículo, explicaré la cláusula INNER JOIN de SQL en palabras sencillas usando algunos ejemplos fáciles de entender.

Una Base de Datos de una Agencia de Viajes

Quizá ya sepa que en una base de datos los datos se almacenan en tablas. Supongamos que trabajas en una agencia de viajes y que la base de datos de la agencia tiene dos tablas TRAVEL_PACK y CITIES. En la siguiente imagen puedes ver la base de datos, por supuesto no se muestran todos los datos.

Muestra de TRAVEL_PACK Tabla

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

Muestra de CITIES Tabla

NAMETYPE_OF_CITYPACK_NAMEDAYS_STAYING
San FranciscohistoricalUnited States: West Coast5
WashingtonhistoricalUnited States: Big Cities3
New YorkbusinessUnited States: Big Cities7
Rio de JaneirobeachBeaches of Brazil4
UshuaiamountainSouth American Tour3
Salvador de BahiabeachBeaches of Brazil3
Los AngelesbeachUnited States: West Coast7

Tenga en cuenta: Para utilizar una cláusula JOIN para combinar dos tablas, debe haber un campo o columna que aparezca en ambas tablas.

En la base de datos de muestra este campo es el nombre del paquete de viaje. Como puede ver en la TRAVEL_PACK tabla, el nombre del paquete está en la columna PACK_NAMEy en la tabla CITIES tabla el nombre del paquete está en la columna PACK_NAME también. Es fácil ver que ambas columnas tienen el mismo nombre de columna, sin embargo en otras bases de datos puede ser diferente. Es decir, cuando se utiliza una cláusula INNER JOIN el nombre de la columna común puede ser diferente en ambas tablas o no. De todos modos, recuerde el nombre de la columna PACK_NAMEporque lo necesitará más tarde para escribir la cláusula JOIN.

Su Primer JOIN SQL: Obtenga los Paquetes de Viaje Incluyendo las Ciudades de la Playa

Suelo recomendar empezar pensando en dónde se encuentran los datos que necesitas para la consulta. En este caso está claro que necesitarás la tabla TRAVEL_PACK tabla para obtener los nombres de los paquetes, pero al mismo tiempo también necesitarás la CITIES porque necesitas comprobar si la ciudad es de playa o no. Por lo tanto, los datos necesarios para esta consulta están en dos tablas, que es la razón por la que necesita utilizar un JOIN SQL.

Cuando tiene que obtener datos de dos (o más) tablas, debe utilizar un JOIN SQL. El SQL JOIN actúa como un conector entre dos tablas, creando pares de registros. Básicamente, toma dos registros (uno de cada tabla) y los une en un par de registros. Este tipo de unión se llama INNER JOIN, y en SQL los términos JOIN o INNER JOIN son exactamente lo mismo. Para aquellos lectores que quieran profundizar, existen otros tipos de join en SQL, por ejemplo el opuesto al INNER join es otro tipo de join llamado LEFT join o OUTER LEFT join, y también puedes encontrar otros tipos de join como RIGHT join, NATURAL join y LATERAL join entre otros. Puedes aprender muchos de estos tipos de join en SQL en el curso online Tipos de JOIN en SQL . Sin embargo, en este artículo me centraré en el INNER JOIN, que es realmente poderoso.

La siguiente imagen muestra cómo la cláusula JOIN crea un par de registros:

Un GIF que representa cómo funciona la unión interna de tablas

(haga clic para ampliar)

Ahora, mostraré la sintaxis para implementar un INNER JOIN, utilizando el siguiente patrón

FROM table1 
INNER JOIN table2 ON common column in table1 = common column in table2

Si rellena el patrón con sus tablas de muestra y los nombres de las columnas, entonces tendrá la siguiente cláusula INNER JOIN:

FROM CITIES 
INNER JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

FROM CIUDADES Una vez que complete la cláusula FROM con el INNER JOIN, puede continuar trabajando en las cláusulas SELECT y WHERE de la consulta. La cláusula SELECT es fácil porque sólo necesitas devolver la columna NAME, luego la cláusula será:

SELECT TRAVEL_PACK.PACK_NAME

Observe que la referencia a la columna PACK_NAME se hace añadiendo un prefijo con el nombre de la tabla (TRAVEL_PACK en este caso). Esta es una buena práctica a aplicar cuando la consulta involucra más de una tabla.

En la cláusula WHERE tendrá que filtrar los resultados para incluir sólo las ciudades de playa. Entonces la cláusula será:

WHERE CITIES.TYPE_OF_CITY = 'beach'

Finalmente si juntas todas las cláusulas la consulta será:

SELECT TRAVEL_PACK.PACK_NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE CITIES.TYPE_OF_CITY = 'beach'

A continuación el resultado de la consulta anterior:

NAME
Los Angeles
Salvador de Bahia
Rio de Janeiro

Su siguiente unión: las ciudades incluidas en los paquetes de viaje más baratos que 2500 dólares

De nuevo, como en la consulta anterior, puede ver que necesita acceder a dos tablas para esta consulta, utilizando un JOIN para las columnas CITIES y TRAVEL_PACK de nuevo. Observe que utilizo el término JOIN en lugar de INNER JOIN porque ambos son exactamente lo mismo en SQL.

De la consulta anterior ya sabe cómo crear la cláusula JOIN. Los cambios están en las cláusulas SELECT y WHERE, como puede ver en los siguientes párrafos.

La cláusula select es fácil, porque sólo necesita el nombre de la ciudad:

SELECT CITY.NAME

En la cláusula where hay que filtrar por el precio del paquete de viaje, entonces la cláusula WHERE será:

WHERE TRAVEL_PACK.PRICE <= 2500

Entonces, la consulta completa será la siguiente:

SELECT CITY.NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE TRAVEL_PACK.PRICE <= 2500

El resultado de la consulta anterior será:

NAME
Rio de Janeiro
Ushuaia
Salvador de Bahia

Profundización: INNER JOIN para tres tablas

¿Es posible utilizar un INNER JOIN con más de dos tablas? Claro que sí. Es más, puede utilizar una cláusula JOIN con tantas tablas como desee.

Sin embargo, debo mencionar que cada cláusula SQL JOIN es sólo para un par de tablas. Así que si tiene tres tablas para unir, como T1, T2 y T3, necesitará dos cláusulas SQL JOIN como puede ver en el siguiente ejemplo:

FROM T1 JOIN T2 ON ...... 
				JOIN T3 ON .......

He dejado la cláusula ON vacía porque voy a explicar esta parte con el siguiente ejemplo. Supongamos que amplía la base de datos de la agencia añadiendo una nueva tabla llamada STATES en la que piensa almacenar los estados, regiones o provincias de cada país. La base de datos con tres tablas será como la siguiente imagen:

TRAVEL_PACK Tabla

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

STATES Tabla

NAMECOUNTRYPOPULATIONLANGUAGE
New YorkUnited States17000000english
Tierra del FuegoArgentina190000spanish
CaliforniaUnited States13400000english
Rio de JaneiroBrasil15000000portuguese
BahiaBrasil8000000portuguese

CITIES Tabla

NAMETYPE_OF CITYPACK_NAMEDAYS_STAYSTATE
San FranciscohistoricalUnited States: West Coast5California
WashingtonhistoricalUnited States: Big Cities3Washington
New YorkbusinessUnited States: Big Cities7New York
Rio de JaneirobeachBeaches of Brazil4Rio de Janeiro
UshuaiamountainSouth American Tour3Tierra del Fuego
Salvador de BahiabeachBeaches of Brazil3Bahia
Los AngelesbeachUnited States: West Coast7California

Supongamos que necesita obtener un informe con una lista de todas las ciudades con el estado, el nombre del paquete y el idioma utilizado en la ciudad en los estados donde el idioma es el español o el portugués. Está claro que necesita unir las tablas CITIES y STATES y luego JOIN este resultado también con la tabla TRAVEL_PACK tabla. Puede empezar aplicando lo que ha aprendido en los ejemplos anteriores.

Primero, utilice una cláusula JOIN para combinar la tabla CITIES con la tabla STATES. Está claro que necesita utilizar las columnas CITIES.STATE y STATE.NAME en la cláusula ON. Entonces la cláusula from será la siguiente:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME 

A continuación, hay que añadir la tercera tabla a la cláusula JOIN, que es la tabla TRAVEL_PACK. Ya aprendió cómo unir esta tabla en un ejemplo anterior, así que el JOIN completo será:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

Añadiendo las cláusulas SELECT y WHERE, la consulta completa será como la siguiente:

SELECT CITIES.NAME, STATES.NAME, TRAVEL_PACK.PACK_NAME, STATES.LANGUAGE
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE STATES.LANGUAGE IN ('spanish','portuguese')

Y el resultado será:

NAMENAMEPACK_NAMELANGUAGE
SalvadorBahiaBeaches of Brazilportuguese
Rio de JaneiroRio de JaneiroBeaches of Brazilportuguese
UshuaiaTierra del FuegoSouth American Tourspanish

Próximos pasos para seguir aprendiendo

En este artículo, cubrí cómo unir tablas en SQL. Expliqué mediante ejemplos lo que es un INNER JOIN en SQL y cómo funciona la cláusula JOIN. La cláusula JOIN abre un enorme mundo de nuevas posibilidades en SQL. Piensa que cualquier persona no técnica con capacidad para utilizar la cláusula JOIN en consultas SQL tiene un valor extra como empleado, independientemente del área de la empresa en la que trabaje. Profundice en Tipos de JOIN en SQL y sea un sólido colaborador de negocio en su empresa.