Uniones de tablas con NATURAL JOIN en PostgreSQL

En este artículo veremos cómo hacer uniones de tablas con NATURAL JOIN en PostgreSQL. Puedes leer otros artículos para aprender más sobre las uniones u otros artículo para aprender a utilizar INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN.

Consejo

Al mostrar columnas de varias tablas, en el caso de que exista la misma columna en varias tablas dará error. Siempre se aconseja utilizar alias de tablas para evitar este problema.

Modelo utilizado

Al final del artículo puedes encontrar el script completo para crear las tablas utilizadas en este ejemplo. Para poder comprender el funcionamiento es necesario que visualices el modelo que está construido en la base de datos. Tenemos dos tablas, departamentos y empleados, las cuales la única relación posible que tienen entre ellas es la columna id_departamento. Este ejemplo incluye una clave externa entre las tablas.

Natural Join

Natural join se apoya en las claves foráneas entre las tablas, pero además, unirá las tablas por nombre de columna. En este ejemplo la tabla de empleados tiene una clave externa o foránea por la columna id_departamento con la tabla de departamentos. Ambas tablas tienen un campo nombre que no se puede llamar igual porque natural join lo intentara unir también por esa columna y no nos devolvería ningún resultado. Ten encuentra que si solo especificas natural join internamente PostgreSQL lo reconoceré como natural inner join.

Sintaxis

La sintaxis para unir tablas con natural join es la siguiente:

SELECT tabla1.columna1, tabla1.columnaN, 
       tabla2.columna1, tabla2.columnaN 
FROM nombreTabla1 tabla1
   NATURAL [inner, left, right, full] JOIN nombreTabla2 tabla2;

Ejemplo

En el siguiente ejemplo se puede comprobar el uso de natural right join, el cual nos muestra todos los departamentos tengan o no empleados.

select e.nombre_emp, d.nombre_dpto
from empleados e
  natural right join departamentos d;

Ejemplo completo

Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios.

--MiguelTroyano.com
-- Borramos las tablas si existen
drop table if exists empleados;
drop table if exists departamentos;

-- Creamos las tablas
create table departamentos
(
    id_departamento numeric(2,0) primary key,
    nombre_dpto character varying(50),
    edificio character varying(50),
     planta numeric(2,0)
);

create table empleados
(
    id_empleado numeric(2,0) primary key,
    id_departamento numeric(2,0),
    nombre_emp character varying(50),
    puesto character varying(50),
    fecha_alta date,
    sueldo integer,
	FOREIGN KEY (id_departamento) REFERENCES departamentos (id_departamento)
);

-- Insertamos valores
insert into departamentos
values (1,'Mantenimiento','Edificio 1',7),
       (2,'Inteligencia de negocio','Edificio 2',7),
       (3,'Recursos Humanos','Edificio 3',8),
       (4,'Finanzas','Edificio 3',8);

insert into empleados
values (1,2,'Miguel Troyano','Analista',TO_DATE( '26/09/1986', 'DD/MM/YYYY'),60000),
       (2,2,'Ismael Troyano','Analista',TO_DATE( '01/01/2001', 'DD/MM/YYYY'),60000),
       (3,3,'Jose Troyano','Alta Dirección',TO_DATE( '01/01/2001', 'DD/MM/YYYY'),80000),
       (4,3,'Pilar Redondo','Alta Dirección',TO_DATE( '02/02/2002', 'DD/MM/YYYY'),80000);

-- Mostramos todos los departamentos tenga
-- o no empleados
select e.nombre_emp, d.nombre_dpto
from empleados e
  natural right join departamentos d;

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.