Una sentencia JOIN de SQL (término inglés para “unión”) designa toda operación en bases de datos re­la­cio­na­les que permite realizar consultas en varias bases de datos. Las se­n­te­n­cias JOIN combinan datos guardados en di­fe­re­n­tes tablas y los presentan de forma filtrada en una tabla de re­su­l­ta­dos.

El principio de las se­n­te­n­cias SQL JOIN se basa en la operación homónima del álgebra re­la­cio­nal, una co­m­bi­na­ción entre producto ca­r­te­siano y selección. Mediante la selección del tipo de JOIN y de la de­fi­ni­ción de una condición de selección, el usuario puede es­ta­ble­cer qué datos de las tablas ori­gi­na­les apa­re­ce­rán en la tabla de re­su­l­ta­dos.

A co­n­ti­nua­ción, te in­fo­r­ma­mos sobre los fu­n­da­me­n­tos ma­te­má­ti­cos de SQL JOIN, co­m­pa­ra­mos di­fe­re­n­tes tipos de JOIN y te mostramos con ejemplos prácticos cómo aplicar estas se­n­te­n­cias en las consultas a las bases de datos con SQL.

Consejo

Este artículo requiere conocer ciertos conceptos sobre el modelo re­la­cio­nal de bases de datos, co­n­cre­ta­me­n­te en lo que a re­la­cio­nes, tuplas, atributos o claves se refiere. En nuestro artículo general sobre bases de datos re­la­cio­na­les en­cue­n­tras más in­fo­r­ma­ción.

¿Cómo funcionan las se­n­te­n­cias SQL JOIN?

El principio básico de un SQL JOIN puede en­te­n­de­r­se mejor si partimos de las ope­ra­cio­nes que la componen. El fu­n­da­me­n­to de todo JOIN son las si­guie­n­tes ope­ra­cio­nes de álgebra re­la­cio­nal:

  • Producto ca­r­te­siano
  • Selección

El producto ca­r­te­siano

El producto ca­r­te­siano es una operación de la teoría de conjuntos en la que dos o más conjuntos se combinan entre sí. En el modelo de base de datos re­la­cio­nal se utiliza el producto ca­r­te­siano para in­te­r­co­ne­c­tar conjuntos de tuplas en la forma de una tabla. El resultado de esta operación es otro conjunto de tuplas ordenadas, donde cada tupla está compuesta por un elemento de cada conjunto inicial.

En álgebra re­la­cio­nal se utiliza el símbolo de la mu­l­ti­pli­ca­ción (×) como operador para el producto ca­r­te­siano.

Veamos un ejemplo:

El producto ca­r­te­siano A × B de ambos conjuntos A = {x, y, z} y B = {1, 2, 3} es:

A × B = {(x,1), (x,2), (x,3), (y,1), (y,2), (y,3), (z,1), (z,2), (z,3)}

Este cálculo puede ilu­s­trar­se con el siguiente gráfico:

Es im­po­r­ta­n­te señalar el orden de formación de los pares. El producto ca­r­te­siano A × B no se co­rre­s­po­n­de, por ejemplo, con el conjunto del producto ca­r­te­siano de B × A.

A × B = {(x,1), (x,2), (x,3), (y,1), (y,2), (y,3), (z,1), (z,2), (z,3)}

B × A = {(1,x), (1,y), (1,z), (2,x), (2,y), (2,z), (3,x), (3,y), (3,z)}

En la te­r­mi­no­lo­gía SQL, una operación en la que el producto ca­r­te­siano resulta de dos tablas se denomina CROSS JOIN. En la práctica, las se­n­te­n­cias CROSS JOIN no se utilizan muy a menudo porque el conjunto re­su­l­ta­n­te (in­te­r­se­c­ción) se presenta sin filtrar.

La selección

Por selección se entiende la operación del álgebra re­la­cio­nal que permite se­le­c­cio­nar unas tuplas de­te­r­mi­na­das de un conjunto inicial y mo­s­trar­las como conjunto de re­su­l­ta­dos. Para es­ta­ble­cer qué tuplas co­n­s­ti­tui­rán este conjunto se utiliza una expresión re­la­cio­nal. El resultado de la selección es, por lo tanto, un conjunto de tuplas que cumplen la condición de la selección definida en esta expresión re­la­cio­nal. Como operador se utiliza la letra griega sigma (σ) y la operación se plasma de la siguiente manera:

σF (R)

El es­pa­cia­dor “F” co­rre­s­po­n­de a la expresión re­la­cio­nal, una fórmula de pre­di­ca­dos lógicos que define la condición de la selección. “R” hace re­fe­re­n­cia al volumen de datos que ha de se­le­c­cio­nar­se. También puede uti­li­zar­se la notación linear R[F].

Para formular las co­n­di­cio­nes de la selección debe re­cu­rri­r­se a los ope­ra­do­res re­la­cio­na­les ha­bi­tua­les, como son el símbolo de igual (=), más que (>) o menor que (<).

Te ex­pli­ca­mos la selección por medio de un ejemplo extraído del texto sobre el modelo re­la­cio­nal. La siguiente tabla muestra datos pe­r­so­na­les ficticios que las empresas pueden requerir de sus empleados. Para cada empleado se recogen el número personal (e_ID), los apellidos y el nombre (apellidos, nombre), el número de la seguridad social (n° SS), la dirección (calle, n°, código postal, municipio), así como el número del vehículo de la empresa que se le ha asignado (coche_ID).

Tabla: Empleados
e_ID 1 er apellido 2º apellido nombre n° SS calle CP municipio coche_ID
1 García Fernández Antonio 32 12345678 12 Calle Principal 1 11111 Vi­lla­rri­ba 3
2 García García Josefa 28 87654321 49 Calle Iglesia 2 22222 Villabajo 1
3 Expósito Hernández Gonzalo 25 09122598 46 Plaza Mercado 3 33333 Ca­m­poa­rri­ba 1
4 Casas González Antonia 23 17083912 78 Calle Grande 4 44444 Ca­m­poa­ba­jo 2

Si queremos filtrar la tabla “Empleados” de manera que solo se muestren aquellos que utilicen el coche de empresa con el coche_ID 1, puedes proceder así:

σcoche_ID=1(Empleados)

En este caso, se hace una llamada a las tuplas en las que el valor de la columna coche_ID es igual a 1.

El resultado se recoge en la siguiente tabla:

Tabla: Empleados (selección)
e_ID 1 er apellido 2º apellido nombre n° SS calle CP municipio coche_ID
2 García García Josefa 28 87654321 49 Calle Iglesia 2 22222 Villabajo 1
3 Expósito Hernández Gonzalo 25 09122598 46 Plaza Mercado 3 33333 Ca­m­poa­rri­ba 1

En el lenguaje de bases de datos SQL se definen las co­n­di­cio­nes de selección con ayuda del comando WHERE.

SELECT * FROM Empleados WHERE Empleados.coche_ID = 1;

Si una tupla cumple con la condición coche_ID=1, deben emitirse los valores de todas las columnas.

Nota

En la sintaxis SQL, el asterisco (*) re­pre­se­n­ta a todas las columnas de una tabla.

Co­m­bi­na­ción de producto ca­r­te­siano y selección

Los di­fe­re­n­tes tipos de JOIN combinan el producto ca­r­te­siano con una condición de selección. Para explicar una operación de bases de datos de tal índole, reducimos la tabla “Empleados” (por claridad) a cuatro columnas. A esta añadimos la tabla “Vehículos” en la que se guarda in­fo­r­ma­ción sobre los vehículos de la empresa.

Ambas tablas están vi­n­cu­la­das entre sí por una relación de claves externas. La clave primaria de la tabla “Vehículos” (coche_ID) funciona como clave externa en la tabla “Empleados”.

Tabla: Empleados
e_ID 1 er apellido 2º apellido nombre coche_ID
1 García Fernández Antonio 3
2 García García Josefa 1
3 Expósito Hernández Gonzalo 1
4 Casas González Antonia 2
Tabla: Vehículos
coche_ID marca modelo matrícula fa­bri­ca­ción ITV
1 VW Caddy 1234 TGB 2016 43452
2 Opel Astra 9876 ZBU 2010 43689
3 BMW X6 5847 LOG 2017 43344
Nota

El reparto de la in­fo­r­ma­ción en di­fe­re­n­tes bases de datos es un concepto básico del modelo re­la­cio­nal de bases de datos. En nuestro artículo sobre la no­r­ma­li­za­ción de bases de datos re­la­cio­na­les te ex­pli­ca­mos las ventajas de este diseño de bases de datos, así como su rea­li­za­ción.

Si se quieren combinar ambas tablas y se­le­c­cio­nar las tuplas re­le­va­n­tes, deben co­m­bi­nar­se las ope­ra­cio­nes de bases de datos ex­pli­ca­das an­te­rio­r­me­n­te:

σcoche_ID=coche_ID(Empleados × Vehículos)

Primero se formará el producto ca­r­te­siano Empleados × Vehículos. El resultado (pro­vi­sio­nal) es un CROSS JOIN, es decir, una tabla de re­su­l­ta­dos en la que cada tupla de la tabla “Empleados” se combina con cada tupla de la tabla “Au­to­mó­vi­les”.

Tabla: Producto ca­r­te­siano “Empleados” × “Vehículos”
e_ID 1 er apellido 2º apellido nombre empleados.coche_ID vehículos.coche_ID marca modelo matrícula fa­bri­ca­ción ITV
1 García Fernández Antonio 3 1 VW Caddy 1234 TGB 2016 18.12.2018
1 García Fernández Antonio 3 2 Opel Astra 9876 ZBU 2010 12.08.2019
1 García Fernández Antonio 3 3 BMW X6 5847 LOG 2017 01.09.2018
2 García García Josefa 1 1 VW Caddy 1234 TGB 2016 18.12.2018
2 García García Josefa 1 2 Opel Astra 9876 ZBU 2010 12.08.2019
2 García García Josefa 1 3 BMW X6 5847 LOG 2017 01.09.2018
3 Expósito Hernández Gonzalo 1 1 VW Caddy 1234 TGB 2016 18.12.2018
3 Expósito Hernández Gonzalo 1 2 Opel Astra 9876 ZBU 2010 12.08.2019
3 Expósito Hernández Gonzalo 1 3 BMW X6 5847 LOG 2017 01.09.2018
4 Casas González Antonia 2 1 VW Caddy 1234 TGB 2016 18.12.2018
4 Casas González Antonia 2 2 Opel Astra 9876 ZBU 2010 12.08.2019
4 Casas González Antonia 2 3 BMW X6 5847 LOG 2017 01.09.2018

A co­n­ti­nua­ción, se se­le­c­cio­nan las tuplas en las que el coche_ID de la tabla “Vehículos” coincide con el coche_ID de la tabla “Empleados”. La condición de selección es, por lo tanto, que la clave externa de la tabla “Empleados” se co­rre­s­po­n­da con la clave primaria de la tabla “Vehículos”.

Como resultado (final) se obtiene una tabla que combina ambas tablas sin re­du­n­da­n­cias.

Tabla: JOIN sobre “Empleados” y “Vehículos”
e_ID 1 er apellido 2º apellido nombre empleados.coche_ID vehículos.coche_ID marca modelo matrícula fa­bri­ca­ción ITV
1 García Fernández Antonio 3 3 BMW X6 5847 LOG 2017 01.09.2018
2 García García Josefa 1 1 VW Caddy 1234 TGB 2016 18.12.2018
3 Expósito Hernández Gonzalo 1 1 VW Caddy 1234 TGB 2016 18.12.2018
4 Casas González Antonia 2 2 Opel Astra 9876 ZBU 2010 12.08.2019

Como co­m­bi­na­ción de producto ca­r­te­siano y selección, las se­n­te­n­cias JOIN de SQL agrupan ambas ope­ra­cio­nes en una conjunta. Como operador se utiliza el símbolo de la pajarita (⋈).

Por lo tanto, se aplica:

σcoche_ID=coche_ID(Empleados × Vehículos) := Empleados⋈ código_vehículo=código_vehículoVehículos

La operación σcoche_ID=coche_ID(Empleados × Vehículos) se co­rre­s­po­n­de con un JOIN en las tablas “Empleados” y “Vehículos” con la condición coche_ID=coche_ID.

Tra­n­s­fe­ri­da a la sintaxis SQL, la operación pre­se­n­ta­da an­te­rio­r­me­n­te se co­rre­s­po­n­de­ría con la siguiente sentencia:

SELECT * FROM Empleados INNER JOIN Vehículos ON Empleados.coche_ID = Vehículos.coche_ID;

INNER JOIN es una de las se­n­te­n­cias JOIN más im­po­r­ta­n­tes utilizada en el marco de las consultas a las bases de datos. Aun así, en ocasiones son ne­ce­sa­rios algunos tipos de se­n­te­n­cias JOIN es­pe­cia­les para lograr el resultado deseado.

Tipos de SQL JOIN

En el modelo re­la­cio­nal de bases de datos se utilizan di­fe­re­n­tes tipos de se­n­te­n­cias JOIN de SQL que permiten realizar consultas en un grupo de tablas. El requisito para ello es que las tablas se­le­c­cio­na­das estén vi­n­cu­la­das entre sí por medio de re­la­cio­nes de claves externas.

Entre los tipos de se­n­te­n­cias JOIN de SQL más im­po­r­ta­n­tes se en­cue­n­tran:

  • INNER JOIN: INNER JOIN hace re­fe­re­n­cia a una forma filtrada de CROSS JOIN en la que solo se incluyen en el conjunto re­su­l­ta­n­te las tuplas de las tablas ori­gi­na­rias que cumplen la condición de selección definida por el usuario.
     
  • OUTER JOIN: OUTER JOIN es una extensión de INNER JOIN. El conjunto de re­su­l­ta­dos de una sentencia OUTER JOIN contiene las tuplas de que cumplen la condición de selección definida por el usuario, así como el resto de tuplas de la primera tabla, de la segunda o de ambas tablas. Las se­n­te­n­cias OUTER JOIN pueden cla­si­fi­car­se en 3 tipos: LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN.
Consejo

Puedes encontrar una de­s­cri­p­ción detallada sobre INNER JOIN y OUTER JOIN en los artículos de nuestra guía que dan cobertura a dichas se­n­te­n­cias.

Las di­fe­re­n­cias entre INNER JOIN y los di­fe­re­n­tes tipos de OUTER JOIN pueden ilu­s­trar­se con diagramas de Venn. El siguiente gráfico es una re­pre­se­n­ta­ción visual de los tipos de JOIN pre­se­n­ta­dos:

In­de­pe­n­die­n­te­me­n­te de la di­fe­re­n­cia­ción entre INNER JOIN y OUTER JOIN, las se­n­te­n­cias SQL JOIN pueden cla­si­fi­car­se en los si­guie­n­tes tipos:

  • EQUI JOIN
  • NON EQUI JOIN
  • SELF JOIN

Las se­n­te­n­cias INNER JOIN y OUTER JOIN pueden im­ple­me­n­tar­se en forma de EQUI JOIN y NON EQUI JOIN. Los di­fe­re­n­tes ejemplos de JOIN es­pe­ci­fi­ca­dos hasta ahora están re­pre­se­n­ta­dos por EQUI JOIN y este tipo se ca­ra­c­te­ri­za por el hecho de que solo permite el signo de igual como operador re­la­cio­nal (=).

La condición de selección de una sentencia EQUI JOIN siempre es, por lo tanto, la igualdad de los valores de las columnas.

En principio, las se­n­te­n­cias JOIN no se limitan (al igual que la selección en el álgebra re­la­cio­nal) a la igualdad de las columnas. Los posibles ope­ra­do­res re­la­cio­na­les son:

Operador re­la­cio­nal Si­g­ni­fi­ca­do
= Igual
< Menor que
> Mayor que
≤ Menor o igual
≥ Mayor o igual
<> Diferente
!= Diferente

Desde SQL-92, el lenguaje de bases de datos ofrece con la palabra clave USING una forma abreviada para se­n­te­n­cias EQUI JOIN que requiere que las columnas afectadas tengan el mismo nombre, lo que no siempre ocurre.

El siguiente ejemplo muestra dos se­n­te­n­cias SQL di­fe­re­n­tes que dan lugar al mismo resultado. En la primera sentencia se define la condición JOIN con ayuda de la palabra clave ON. En la segunda se utiliza la versión abreviada con la clave USING.

SELECT * FROM Empleados INNER JOIN Vehículos ON Empleados.coche_ID = Vehículos.coche_ID;
SELECT * FROM Empleados INNER JOIN Vehículos USING coche_ID;

Por el contrario, las se­n­te­n­cias NON EQUI JOIN excluyen ope­ra­cio­nes en base a la igualdad de las columnas. Así, se permiten todas las ope­ra­cio­nes re­la­cio­na­les a excepción de las que van aco­m­pa­ña­das del signo igual (=).

Nota

Dado que las re­la­cio­nes en las bases de datos re­la­cio­na­les se definen ge­ne­ra­l­me­n­te por medio de la igualdad de las claves primarias y externas, las se­n­te­n­cias NON EQUI JOIN tienen una im­po­r­ta­n­cia se­cu­n­da­ria en el modelo de bases de datos re­la­cio­nal debido a que, al igual que las se­n­te­n­cias CROSS JOIN, dan lugar a menudo a muchos registros de re­su­l­ta­dos.

Después de todo, una sentencia SELF JOIN es un tipo especial de sentencia SQL JOIN en la que la tabla de una base de datos está vinculada a sí misma. En principio, cada tipo de JOIN puede eje­cu­tar­se como SELF JOIN.

Si dos tablas están unidas por columnas homónimas, se puede hablar de NATURAL JOIN. Una sentencia de este tipo que utiliza una palabra clave homónima se im­ple­me­n­ta no­r­ma­l­me­n­te como INNER JOIN, pero en este tipo de JOIN no están definidas las se­n­te­n­cias NATURAL JOIN, sino que la po­si­bi­li­dad es recurrir a las se­n­te­n­cias NATURAL LEFT OUTER JOIN o NATURAL RIGHT OUTER JOIN.

Dado que el vínculo en las se­n­te­n­cias NATURAL JOIN se logra uti­li­za­n­do columnas del mismo nombre, los valores en cuestión no se ofrecen por partida doble en el conjunto de re­su­l­ta­dos, sino que se fusionan en una columna conjunta. Puedes encontrar ejemplos de se­n­te­n­cias INNER JOIN y OUTER JOIN en otros artículos de nuestra guía.

Ir al menú principal