Pildoritas de Bases de Datos: SQL. JOIN

En las últimas pildoritas hemos adquirido conocimientos bastante aceptables de sintáxis SQL, pero hasta este momento no hemos utilizado álgebra relacional, que es el verdadero potencial de las Bases de datos SQL. Os pido que a partir de ahora penséis en los datos de tablas o los resultados de una query como conjuntos de datos, si es que no lo hacíais ya.

En muchas ocasiones, por no decir la gran mayoría, necesitaremos datos que se encuentran repartidos en varias tablas. Para ello, nos apoyaremos en la operación por antonomasia para relacionar tablas, el JOIN.

JOIN es el operador cartesiano de Algebra relacional y combina los registros de dos tablas tal que su resultado es la combinación de todos los registros de la primera tabla, con los de la segunda.

Un JOIN, como digo, es una relación entre tablas. Por tanto, ambas tablas deben tener al menos un campo común entre ellas con el que poderlas relacionar. Dichos campos suelen ser keys de las tablas.

El JOIN más típico, es aquel que realizamos de la siguiente forma:

SELECT EMPLEADO.DNI, EMPLEADO.NOMBRE, PUESTO.NOMBRE AS PUESTO 
FROM PUESTO, EMPLEADO 
WHERE EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

Con esta consulta obtenemos el DNI, nombre y puesto del empleado en la misma consulta, relacionando como se ve las tablas de Empleado y Puesto. Como vemos, lo único que hemos hecho es igualar la PK de Puesto (FK en Empleado) de ambas tablas.

Este JOIN realizado en el WHERE es igual al INNER JOIN, pero no nos adelantemos, poco a poco.

Existen muchas variaciones del JOIN, así que primeros vamos a ver los básicos: JOIN, LEFT JOIN, RIGHT JOIN, INNER JOIN y FULL OUTER JOIN.

Para los ejemplos de esta sección utilizaremos las tablas de Empleado y Puesto:

Joins (tablas ejemplo)

Por otra parte, los datos de las tablas serán los siguientes:

Empleado

DNI idPuesto idCompañia Nombre Apellidos Teléfono
87190290G 1 1 Pepe Padefo 666666666
28050763D 1 2 Antonia Picateclas 688888888
82500395Q 3 1 Eustaquio Traumas 699999999
01148640C 2 5 Augusto Flipao 655555555
70686067Y NULL 2 Pablo Unknow 644444444

 

Puesto

idPuesto Nombre Descripción
1 Programador Blablau!
2 Analista Blablauuuu!
3 Jefe de Proyecto RequeteBlablauuu!
4 Gerente MegaBlablauuuu!

 

INNER JOIN

Como comentaba justo arriba, el JOIN que se da al igualar la Key de dos claves es el INNER JOIN. Este sólo nos devolverá los datos que sean comunes a ambas tablas (esto tiene sentido si, por ejemplo, hay empleados sin un puesto). El JOIN simple es también un INNER JOIN.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE,
PUESTO.ID_PUESTO,
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO INNER JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

inner join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista

 

RIGHT JOIN

El RIGHT JOIN fuerza a que aparezcan todos los registros de la tabla de la derecha. Si no hay vinculación con uno de ellos, se colocarán los campos referenciados de la tabla de la izquierda a NULL.

SELECT EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO RIGHT JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

right join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
NULL NULL 4 Gerente

 

LEFT JOIN

El LEFT JOIN fuerza a que aparezcan todos los registros de la tabla de la izquierda. Si no hay vinculación entre alguno de esos registros y los de la tabla de la derecha, se colocarán los campos de la tabla de la derecha a NULL.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO LEFT JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

left join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
70686067Y Pablo NULL NULL

 

FULL OUTER JOIN

El FULL OUTER JOIN realiza un producto cartesiano entre ambas tablas y obtiene las combinaciones entre todos los registros, haya relación o no.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO FULL OUTER JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

full outer join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
70686067Y Pablo NULL NULL
NULL NULL 4 Gerente

 

Con esto hemos acabado los JOIN, pero no con el tema, ya que ahora vamos a ver operadores que en vez de combinar tablas, combinan los resultados de varias queries.

UNION / UNION ALL

UNION es como una suma, o un OR lógico para ser más correctos. Lo que hace es unir los registros devueltos por dos consultas en un único conjunto de resultado. Para ello, es obligatorio que ambas queries tengan las mismas columnas en el SELECT.

Si se quiere que se muestren registros duplicados usaremos UNION ALL.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

UNION

SELECT DNI,NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 2

union

DNI NOMBRE
87190290G Pepe
28050763D Antonia
01148640C Augusto

 

INTERSECT

INTERSECT es parecido al operador UNION, pero en su caso aplica un AND lógico en vez de un OR.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

INTERSECT

SELECT DNI, NOMBRE FROM EMPLEADO WHERE DNI =  ‘28050763D’

intersect

 

DNI NOMBRE
28050763D Antonia

 

MINUS

El operador MINUS lo que hace es subtraer de la primera query los datos devueltos de la segunda que se encuentren en ella.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

MINUS

SELECT DNI, NOMBRE FROM EMPLEADO WHERE DNI =  ‘28050763D’

minus

 

DNI NOMBRE
87190290G Pepe

 

 

 

Ahora ya sí, terminamos con el tema de los JOIN. En la siguiente pildorita veremos los predicados, tema que pone fin (ya era hora) a la parte de SQL.

Índice de Pildoritas

Share