Saltar a contenido

Una unión natural es una unión que crea una unión implícita basada en los mismos nombres de columna en las tablas unidas.

A continuación se muestra la sintaxis de la unión natural PostgreSQL:

SELECT select_list
FROM table1
NATURAL [INNER, LEFT, RIGHT] JOIN table2;

En esta sintaxis:

  • En primer lugar, especifique las columnas de las tablas de las que desea obtener datos en la select_list de la cláusula SELECT.
  • En segundo lugar, indique la tabla principal (table1) de la que desea obtener los datos.
  • En tercer lugar, especifique la tabla (table2) a la que desea unirse, en la cláusula NATURAL JOIN.

Una unión natural puede ser una unión interna, izquierda o derecha. Si no especifica un join explícito, PostgreSQL utilizará el INNER JOIN por defecto.

La conveniencia del NATURAL JOIN es que no requiere que especifique la cláusula join porque utiliza una cláusula join implícita basada en la columna común.

Inner Join

Las siguientes sentencias son equivalentes:

SELECT select_list
FROM table1
NATURAL INNER JOIN table2;

y

SELECT select_list
FROM table1
INNER JOIN table2 USING (column_name);

Left Join

Las siguientes sentencias son equivalentes:

SELECT select_list
FROM table1
NATURAL LEFT JOIN table2;

y

SELECT select_list
FROM table1
LEFT JOIN table2 USING (column_name);

Right join

Las siguientes sentencias son equivalentes:

SELECT select_list
FROM table1
NATURAL RIGHT JOIN table2;

y

SELECT select_list
FROM table1
RIGHT JOIN table2 USING (column_name);

Creación de tablas de ejemplo

Las siguientes sentencias crean las tablas categories y products, e insertan datos de ejemplo para la demostración:

CREATE TABLE categories (
  category_id SERIAL PRIMARY KEY, 
  category_name VARCHAR (255) NOT NULL
);

CREATE TABLE products (
  product_id serial PRIMARY KEY, 
  product_name VARCHAR (255) NOT NULL, 
  category_id INT NOT NULL, 
  FOREIGN KEY (category_id) REFERENCES categories (category_id)
);

INSERT INTO categories (category_name) 
VALUES 
  ('Smartphone'), 
  ('Laptop'), 
  ('Tablet'),
  ('VR');

INSERT INTO products (product_name, category_id) 
VALUES 
  ('iPhone', 1), 
  ('Samsung Galaxy', 1), 
  ('HP Elite', 2), 
  ('Lenovo Thinkpad', 2), 
  ('iPad', 3), 
  ('Kindle Fire', 3);

SELECT * FROM products;
SELECT * FROM categories;

La tabla productos tiene los siguientes datos:

 product_id |  product_name   | category_id
------------+-----------------+-------------
          1 | iPhone          |           1
          2 | Samsung Galaxy  |           1
          3 | HP Elite        |           2
          4 | Lenovo Thinkpad |           2
          5 | iPad            |           3
          6 | Kindle Fire     |           3
(6 rows)

La tabla categories tiene los siguientes datos:

 category_id | category_name
-------------+---------------
           1 | Smartphone
           2 | Laptop
           3 | Tablet
           4 | VR
(4 rows)

Ejemplos de NATURAL JOIN en PostgreSQL

Exploremos algunos ejemplos del uso de la sentencia NATURAL JOIN.

Ejemplo básico de NATURAL JOIN en PostgreSQL

La siguiente sentencia utiliza la cláusula NATURAL JOIN para unir la tabla products con la tabla categories:

SELECT * 
FROM products
NATURAL JOIN categories;

This statement performs an inner join using the category_id column.

Output:

 category_id | product_id |  product_name   | category_name
-------------+------------+-----------------+---------------
           1 |          1 | iPhone          | Smartphone
           1 |          2 | Samsung Galaxy  | Smartphone
           2 |          3 | HP Elite        | Laptop
           2 |          4 | Lenovo Thinkpad | Laptop
           3 |          5 | iPad            | Tablet
           3 |          6 | Kindle Fire     | Tablet
(6 rows)

La sentencia es equivalente a la siguiente sentencia que utiliza la cláusula INNER JOIN:

SELECT  * 
FROM products
INNER JOIN categories USING (category_id);

Uso de PostgreSQL NATURAL JOIN para realizar un LEFT JOIN

El siguiente ejemplo utiliza la cláusula NATURAL JOIN para realizar un LEFT JOIN sin especificar la columna coincidente:

SELECT * 
FROM categories
NATURAL LEFT JOIN products;

Salida:

 category_id | category_name | product_id |  product_name
-------------+---------------+------------+-----------------
           1 | Smartphone    |          1 | iPhone
           1 | Smartphone    |          2 | Samsung Galaxy
           2 | Laptop        |          3 | HP Elite
           2 | Laptop        |          4 | Lenovo Thinkpad
           3 | Tablet        |          5 | iPad
           3 | Tablet        |          6 | Kindle Fire
           4 | VR            |       null | null
(7 rows)

Ejemplo de utilización de NATURAL JOIN que provoca un resultado inesperado

En la práctica, debería evitar utilizar el NATURAL JOIN siempre que sea posible porque a veces puede provocar un resultado inesperado.

Considere las siguientes tablas city y country de la base de datos de ejemplo:

img

img

  • Ambas tablas tienen la misma columna country_id por lo que puede utilizar el NATURAL JOIN para unir estas tablas de la siguiente manera:

SELECT * FROM ciudad NATURAL JOIN país;

La consulta devuelve un conjunto de resultados vacío.

La razón es que ambas tablas tienen otra columna común llamada last_update. Cuando la cláusula NATURAL JOIN utiliza la columna last_update, no encuentra ninguna coincidencia.

# Resumen

  • Utilice la cláusula NATURAL JOIN de PostgreSQL para consultar datos de dos o más tablas que tengan columnas comunes.