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:
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.
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:
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:
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:
Resumen¶