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áusulaSELECT
. - 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áusulaNATURAL 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:
- Ambas tablas tienen la misma columna
country_id
por lo que puede utilizar elNATURAL 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.