larepaweb-logo

Programación, tecnología y mucho más.

Archivos de 'Base de Datos'

Hablemos de JOINS

diciembre 5th, 2010. Publicado en Base de Datos. Sin Comentarios. 769 Lecturas

Es muy común ver en consultas SQL la sentencia JOIN para la recuperación de datos de más de una tabla (multitabla), pero a veces no se comprende con exactitud las opciones que la acompañan. En general estas opciones estan disponibles en todos los motores de Base de Datos que implementen el stándard ANSI SQL.

Para hacerlo más ilustrativo tomaremos el siguiente ejemplo:

Los Empleados trabajan en un Departamento que a su vez constituyen un Área pero los empleados no siempre dependen de un Departamento sino que pueden depender directamente de una Área.  Por otra parte los Empleados tienen Actividades por realizar.

Esquema:

INNER JOIN: Si quisiéramos listar todas las actividades con su respectivo empleado podemos utilizar esta consulta.

SELECT Actividades. numero, Actividades.nombre, Empleados.nombre
FROM  Actividades
INNER JOIN Empleados ON Actividades.empleado = Empleados.numero

En la consulta anterior se utiliza las columnas de relación (Actividades.empleado que es el código del empleado y Empleados.numero) entre ambas tablas. Cabe mencionar que esta relación es estricta (JOIN INTERNO) por lo tanto no aparecerán Actividades que no esten asignadas a un Empleado, sólo aparecerán las filas cuya relación exista con la tabla de la derecha (Empleados).

LEFT JOIN: Caso contrario al anterior, si queremos mostrar no sólo las filas cuyas relaciones existan con la tabla Empleados podemos usar la siguiente consulta.

SELECT Actividades. numero, Actividades.nombre, Empleados.nombre
FROM  Actividades
LEFT JOIN Empleados ON Actividades.empleado = Empleados.numero

Ahora sí, se listará las filas de la tabla Actividades que tengan relación con Empleados y también las que no la tienen. En este último caso se “rellenará” el valor faltante con NULL.

RIGHT JOIN: Similar a LEFT JOIN pero esta vez se listarán todas las filas de la columna de la derecha (Empleados) rellenando con NULL aquellos que aún no tengan una Activadad asginada.

SELECT Actividades. numero, Actividades.nombre, Empleados.nombre
FROM  Actividades
RIGHT JOIN Empleados ON Actividades.empleado = Empleados.numero

LEFT o RIGHT JOIN son relaciones de tipo externas ya que incluyen filas que no necesariamente poseen una correspondencia. Los operadores a utilizar en los JOIN son de comparación siendo el mas usado ‘=’.

OUTER JOIN: Como ya vimos se pueden listar a izquerda o a derecha, esta opción incluye a ambas es por eso que se llama join externo completo.

Ademas es bueno acostumbrarse en escribir el nombre de la tabla a la que pertenece la columna así eliminaremos ambigüedades en caso de que las columnas de 2 o mas tablas tengan el mismo nombre.

De esta forma se pueden hacer combinaciones entre JOIN de lo que se nos ocurra y lograr consultas más completas como:

SELECT Empleados.numero,
Empleados.nombre,
CASE WHEN Departamentos.nombre IS NULL THEN 'Sin Departamento' ELSE Departamentos.nombre END AS Departamento,
CASE WHEN Areas.nombre IS NULL THEN 'Sin Area' ELSE Areas.nombre END AS Area,
Actividades.nombre
FROM Empleados
INNER JOIN Actividades ON Empleados.numero = Actividades.empleado
LEFT JOIN Areas ON Empleados.area = Areas.codigo
LEFT JOIN Departamentos ON Empleados.departamento = Departamentos.codigo
WHERE Empleados.estado = 'activo'

La consulta anterior lista los empleados con sus respectivas actividades, departamento o área a la que pertenece.