Skip to content

4 Combinaciones de tablas (JOIN)

Introducción

Existe otra forma más moderna e intuitiva de trabajar con varias tablas. Para ello se utiliza la clausula JOIN. Supongamos que tenemos una base de datos de una entidad bancaria. Disponemos de una tabla con sus empleados y otra tabla con sus sucursales. En una sucursal trabajan varios empleados. Los empleados viven en una localidad y trabajan en una sucursal situada en la misma localidad o en otra localidad. El esquema E-R es el siguiente:

Figura 1 - ER Empleados

Figura 1 - ER Empleados

Los datos de las tablas son:

DNI Nombre Localidad Cod_Sucursal
11111111A Ana Almería 0001
22222222B Bernardo Granada 0001
33333333C Carlos Granada
44444444D David Jerez 0003
Cod_Sucursal Dirección Localidad
0001 C/Ancha, 1 Almería
0002 C/Nueva, 1 Granada
0003 C/Cortés, 33 Cádiz

Se observa que Ana vive en Almería y trabaja en la sucursal 0001 situada en Almería. Bernardo vive en Granada pero trabaja en la sucursal 0001 de Almería. Carlos es un empleado del que no disponemos el dato acerca de la sucursal en la que trabaja. David es un empleado que vive en Jerez de la Frontera y trabaja en la sucursal 0003 en Cádiz. Existe otra sucursal 0002 en Granada donde no aparece registrado ningún empleado.

Existen diversas formas de combinar (JOIN) las tablas según la información que deseemos obtener. Los tipos de JOIN se clasifican en:

  • INNER JOIN ( o simplemente JOIN): Combinación interna.
  • JOIN
  • SELF JOIN
  • NATURAL JOIN
  • OUTER JOIN: Combinación externa.
  • LEFT OUTER JOIN (o simplemente LEFT JOIN)
  • RIGHT OUTER JOIN (o simplemente RIGHT JOIN)
  • FULL OUTER JOIN (o simplemente FULL JOIN)
  • CROSS JOIN: Combinación cruzada.

Inner Join

También se conoce como EQUI JOIN o combinación de igualdad. Esta combinación devuelve todas las filas de ambas tablas donde hay una coincidencia. Este tipo de unión se puede utilizar en la situación en la que sólo debemos seleccionar las filas que tienen valores comunes en las columnas que se especifican en la cláusula ON.

Join

Se puede usar la palabra reservada INNER JOIN o simplemente JOIN, su sintaxis es:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 join TABLA2
ON TABLA1.columnaX = TABLA2.columnaY

En la sentencia ON se indica la relación de claves.

SELECT E.*, S.Localidad
FROM EMPLEADOS E JOIN SUCURSALES S
ON E.COD_SUCURSAL = S.COD_SUCURSAL
DNI NOMBRE LOCALIDAD COD_SUCURSAL LOCALIDAD
2222222B Bernardo Granada 0001 Almería
1111111A Ana Almería 0001 Almería
4444444D David Jerez 0003 Cádiz

En esta consulta, utilizamos la combinación interna basada en la columna COD_SUCURSAL que es común en las tablas EMPLEADOS y SUCURSALES. Esta consulta dará todas las filas de ambas tablas que tienen valores comunes en la columna COD_SUCURSAL

Self Join

En algún momento podemos necesitar unir una tabla consigo mísma. Este tipo de combinación se denomina SELF JOIN. En este JOIN, necesitamos abrir dos copias de una misma tabla en la memoria. Dado que el nombre de tabla es el mismo para ambas instancias, usamos los alias de tabla para hacer copias idénticas de la misma tabla que se abran en diferentes ubicaciones de memoria.

Sintaxis:

SELECT ALIAS1.columna1, ALIAS1.columna2, ..., ALIAS2.columna1,...
FROM TABLA ALIAS1 JOIN TABLA ALIAS2
ON ALIAS1.columnaX = ALIAS2.columnaY

Por ejemplo:

SELECT e1.nombre, e2.nombre, e1.localidad
FROM empleados e1 JOIN empleados e2 ON e1.localidad = e2.localidad
Nombre Nombre Localidad
Ana Ana Almería
Carlos Bernardo Granada
Bernardo Bernardo Granada
Carlos Carlos Granada
Bernardo Carlos Granada
David David Jerez

Esto muestra las combinaciones de los empleados que viven en la misma localidad. En este caso no es de mucha utilidad, pero el SELF JOIN puede ser muy útil en relaciones reflexivas.

Natural Join

NATURAL JOIN establece una relación de igualdad entre las tablas a través de los campos que tengan el mismo nombre en ambas tablas. Su sintaxis es:

Sintaxis:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 NATURAL JOIN TABLA2

En este caso no existe clausula ON puesto que se realiza la combinación teniendo en cuenta las columnas del mismo nombre. Por ejemplo:

SELECT * FROM EMPLEADOS E NATURAL JOIN SUCURSALES S
LOCALIDAD COD_SUCURSAL DNI NOMBRE DIRECCIÓN
Almería 0001 11111111A Ana C/ Ancha, 1

En el resultado de la consulta nos aparece la combinación donde la (LOCALIDAD, COD_SUCURSAL) de EMPLEADOS es igual a (LOCALIDAD, COD_SUCURSAL) de SUCURSALES. Es decir estamos mostrando todos los empleados que tienen asignada una sucursal y dicha sucursal está en la localidad donde vive el empleado. El NATURAL JOIN elimina columnas duplicadas, por eso no aparecen los campos LOCALIDAD ni SUCURSAL duplicados. Este tipo de consulta no permite indicar estos campos en la cláusula SELECT. Por ejemplo: SELECT E.LOCALIDAD o SELECT E.COD_SUCURSAL sería incorrecto.

Outer Join

La combinación externa o OUTER JOIN es muy útil cuando deseamos averiguar que campos están a NULL en un lado de la combinación. En nuestro ejemplo, podemos ver qué empleados no tienen sucursal asignada; también podemos ver que sucursales no tienen empleados asignados.

Left Join

También conocido como LEFT OUTER JOIN, nos permite obtener todas las filas de la primera tabla asociadas a filas de la segunda tabla. Si no existe correspondencia en la segunda tabla, dichos valores aparecen como NULL. Su sintaxis es:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 LEFT JOIN TABLA2
ON TABLA1.columnaX = TABLA2.columnaY;

Por ejemplo:

SELECT E.*, S.LOCALIDAD
FROM EMPLEADOS E LEFT JOIN SUCURSALES S
ON E.COD_SUCURSAL = S.COD_SUCURSAL;
DNI NOMBRE LOCALIDAD COD_SUCURSAL LOCALIDAD
1111111A ANA Almería 0001 Almería
2222222B BERNARDO Granada 0001 Almería
3333333C CARLOS Granada
4444444D Jerez Jerez 0003 Cádiz

Todos los empleados tienen una sucursal asignada salvo el empleado Carlos.

Right Join

También conocido como RIGHT OUTER JOIN, nos permite obtener todas las filas de la segunda tabla asociadas a filas de la primera tabla. Si no existe correspondencia en la primera tabla, dichos valores aparecen como NULL. Su sintaxis es:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 RIGHT JOIN TABLA2
ON TABLA1.columnaX = TABLA2.columnaY;

Por ejemplo:

SELECT E.DNI, E.NOMBRE, S.*
FROM EMPLEADOS E RIGHT JOIN SUCURSALES S
ON E.COD_SUCURSAL = S.COD_SUCURSAL;
DNI NOMBRE COD_SUCURSAL DIRECCIÓN LOCALIDAD
11111111A ANA 0001 C/ Ancha, 1 Almería
22222222B BERNARDO 0001 C/ Ancha, 1 Almería
44444444D DAVID 0003 C/ Cortés, 33 Cádiz
0002 C/ Nueva, 1 Granada

Todas las sucursales tienen algún empleado asignado salvo la sucursal 0002.

Full Join

También conocido como FULL OUTER JOIN, nos permite obtener todas las filas de la primera tabla asociadas a filas de la segunda tabla. Si no existe correspondencia en alguna de las tablas, dichos valores aparecen como NULL.

Su sintaxis:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 FULL JOIN TABLA2
ON TABLA1.columnaX = TABLA2.columnaY;

Por ejemplo:

SELECT E.DNI, E.NOMBRE, S.COD_SUCURSAL, S.LOCALIDAD
FROM EMPLEADOS E FULL JOIN SUCURSALES S
ON E.COD_SUCURSAL = S.COD_SUCURSAL;
DNI NOMBRE COD_SUCURSAL LOCALIDAD
22222222B BERNARDO 0001 Almería
11111111A ANA 0001 Almería
0002 Granada
44444444D David 0003 Cádiz
33333333C Carlos

Como puede observarse fácilmente, vemos que en la sucursal 0002 no hay ningún empleado asignado y que el empleado Carlos no tiene asignada ninguna sucursal.

Cross Join

El CROSS JOIN o combinación cruzada produce el mismo resultado del producto cartesiano, es decir nos da todas las combinaciones posibles. Su sintaxis es:

Sintaxis:

SELECT TABLA1.columna1, TABLA1.columna2, ...
       TABLA2.columna1, TABLA2.columna2, ...
FROM TABLA1 CROSS JOIN TABLA2;

Por ejemplo:

SELECT E.DNI, E.NOMBRE, E.LOCALIDAD, S.COD_SUCURSAL, S.LOCALIDAD
FROM EMPLEADOS E CROSS JOIN SUCURSALES S;
DNI NOMBRE LOCALIDAD COD_SUCURSAL LOCALIDAD
11111111A ANA ALMERÍA 0001 ALMERÍA
11111111A ANA ALMERÍA 0002 GRANADA
11111111A ANA ALMERÍA 0003 CÁDIZ
22222222B BERNARDO GRANADA 0001 ALMERÍA
22222222B BERNARDO GRANADA 0002 GRANADA
22222222B BERNARDO GRANADA 0003 CÁDIZ
33333333C CARLOS GRANADA 0001 ALMERÍA
33333333C CARLOS GRANADA 0002 GRANADA
33333333C CARLOS GRANADA 0003 CÁDIZ
44444444D DAVID JEREZ 0001 ALMERÍA
44444444D DAVID JEREZ 0002 GRANADA
44444444D DAVID JEREZ 0003 CÁDIZ

Combinaciones especiales

Uniones

La palabra UNION permite añadir el resultado de un SELECT a otro SELECT. Para ello ambas instrucciones tienen que utilizar el mismo número y tipo de columnas.

Ejemplo:

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 1

UNION

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 2;

Nota

Observa que sólo se pone un punto y final.

Es decir, UNION crea una sola tabla con registros que estén presentes en cualquiera de las consultas. Si están repetidas sólo aparecen una vez, para mostrar los duplicados se utiliza UNION ALL en lugar de la palabra UNION.

Intersecciones

De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo que el resultado serán las filas que estén presentes en ambas consultas. Ejemplo: tipos y modelos de piezas que se encuentren en los almacenes 1 y 2 (en ambos).

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 1

INTERSECT

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 2;

Diferencia

Con MINUS también se combinan dos consultas SELECT de forma que aparecerán los registros del primer SELECT que no estén presentes en el segundo. Ejemplo:

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 1

MINUS

SELECT tipo,modelo FROM existencias
WHERE n_almacen = 2;

Se podrían hacer varias combinaciones anidadas (una unión a cuyo resultado se restará de otro SELECT por ejemplo), en ese caso es conveniente utilizar paréntesis para indicar qué combinación se hace primero:

(
SELECT ...

UNION

SELECT ...
)

MINUS

SELECT ... ;

Resumen

Figura 2 - MySQL JOINS

Figura 2 - MySQL JOINS