PostgreSQL 教程: NATURAL JOIN 自然连接

九月 1, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的NATURAL JOIN从两个或多个表中查询数据。

自然连接是一种基于连接表中相同列名创建隐式连接的连接。

下面显示了 PostgreSQL 自然连接的语法:

SELECT select_list
FROM T1
NATURAL [INNER, LEFT, RIGHT] JOIN T2;

自然连接可以是内连接左连接或右连接。如果您没有显式指定连接,例如INNER JOIN, LEFT JOIN, RIGHT JOIN,PostgreSQL 将默认使用INNER JOIN

如果在选择列表中使用星号 (*),结果将包含以下列:

  • 所有公共列,即两个表中具有相同名称的列。
  • 两个表中的每一列,这不是公共列。

PostgreSQL NATURAL JOIN 示例

为了演示 PostgreSQL 自然连接,我们将创建两个表:categoriesproducts

以下CREATE TABLE语句创建categoriesproducts表。

DROP TABLE IF EXISTS categories;
CREATE TABLE categories (
	category_id serial PRIMARY KEY,
	category_name VARCHAR (255) NOT NULL
);

DROP TABLE IF EXISTS products;
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)
);

每个类别有零个或多个产品,每个产品属于一个且仅一个类别。

products表中的category_id列是引用categories主键外键category_id是我们将用来执行自然连接的公共列。

以下 INSERT 语句将一些数据插入到categoriesproducts表中。

INSERT INTO categories (category_name)
VALUES
	('Smart Phone'),
	('Laptop'),
	('Tablet');

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

以下语句使用NATURAL JOIN子句将products表与categories表连接起来:

SELECT * FROM products
NATURAL JOIN categories;

PostgreSQL NATURAL JOIN example

上面的语句等价于下面使用INNER JOIN子句的语句。

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

NATURAL JOIN的便利之处在于它不需要您指定 join 子句,因为它使用基于公共列的隐式 join 子句。

但是,您应该尽可能避免使用NATURAL JOIN,因为有时它可能会导致意外结果。

例如,请查阅示例数据库中的citycountry表,如下:

img

img

两个表具有相同的country_id列,因此您可以使用NATURAL JOIN来连接这些表,如下所示:

SELECT * 
FROM city
NATURAL JOIN country;

该查询返回一个空结果集。

原因是……

两个表还有另一个称为last_update的公共列,该列不能用于连接。但是,该NATURAL JOIN子句还是使用了last_update列。

在本教程中,您了解了 PostgreSQL 的NATURAL JOIN的工作原理,以及如何使用它从两个或多个具有公共列的表中查询数据。