九月 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 自然连接,我们将创建两个表:categories
和products
。
以下CREATE TABLE
语句创建categories
和products
表。
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 语句将一些数据插入到categories
和products
表中。
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;
上面的语句等价于下面使用INNER JOIN
子句的语句。
SELECT * FROM products
INNER JOIN categories USING (category_id);
NATURAL JOIN
的便利之处在于它不需要您指定 join 子句,因为它使用基于公共列的隐式 join 子句。
但是,您应该尽可能避免使用NATURAL JOIN
,因为有时它可能会导致意外结果。
例如,请查阅示例数据库中的city
和country
表,如下:
两个表具有相同的country_id
列,因此您可以使用NATURAL JOIN
来连接这些表,如下所示:
SELECT *
FROM city
NATURAL JOIN country;
该查询返回一个空结果集。
原因是……
两个表还有另一个称为last_update
的公共列,该列不能用于连接。但是,该NATURAL JOIN
子句还是使用了last_update
列。
在本教程中,您了解了 PostgreSQL 的NATURAL JOIN
的工作原理,以及如何使用它从两个或多个具有公共列的表中查询数据。