九月 1, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的RIGHT JOIN从两个表中查询数据。
目录
设置样例表
假设您有两个表films和film_reviews,如下所示:
DROP TABLE IF EXISTS films;
DROP TABLE IF EXISTS film_reviews;
CREATE TABLE films(
film_id SERIAL PRIMARY KEY,
title varchar(255) NOT NULL
);
INSERT INTO films(title)
VALUES('Joker'),
('Avengers: Endgame'),
('Parasite');
CREATE TABLE film_reviews(
review_id SERIAL PRIMARY KEY,
film_id INT,
review VARCHAR(255) NOT NULL
);
INSERT INTO film_reviews(film_id, review)
VALUES(1, 'Excellent'),
(1, 'Awesome'),
(2, 'Cool'),
(NULL, 'Beautiful');
一部电影可以有零个或多个评论,并且一个评论属于零个或一个电影。films表中的film_id列引用film_reviews表中的film_id列。
films和film_reviews表的内容如下所示:
SELECT * FROM films;

SELECT * FROM film_reviews;

ID 为 1 的电影有两条评论。ID 为 2 的电影有 1 条评论。ID 为 3 的电影还没有评论。ID 为 4 的评论与任何电影均无关。
PostgreSQL RIGHT JOIN 子句简介
以下语句使用RIGHT JOIN来从films和film_reviews表中查询数据:
SELECT
review,
title
FROM
films
RIGHT JOIN film_reviews
ON film_reviews.film_id = films.film_id;

在此语句中,films是左表,film_reviews是右表。
该RIGHT JOIN子句开始从右表 (film_reviews) 中查询数据。
对于右表 (film_reviews) 中的每一行,它检查film_reviews表中film_id列中的值是否等于左表 (films) 中每一行的film_id列中的值。
如果它们相等,则RIGHT JOIN创建一个新行,其中包含SELECT列表子句中指定的两个表中的列,并将该新行包含在结果集中。
否则,RIGHT JOIN仍然会创建一个新行,其中包含两个表中的列,并将该新行包含在结果集中。但是,它用NULL填充左表 (films) 中的列。
换句话说,RIGHT JOIN从右表中查询所有行,无论它们在左表中是否具有匹配行。
根据films和film_reviews表中的数据:
- ID 为 1 的评论与 ID 为 1 的电影相匹配。
- ID 为 2 的评论与 ID 为 2 的电影匹配。
- ID 为 3 的评论与 ID 为 2 的电影相匹配。
- ID 为 4 的评论与任何电影都不匹配,因此
title列填充为 NULL。
请注意,RIGHT OUTER JOIN与RIGHT JOIN相同。关键字OUTER是可选的。
下面的维恩图说明了RIGHT JOIN的工作原理:

使用 USING 语法的 RIGHT JOIN
由于连接列具有相同的名称 (film_id),因此您可以在连接谓词中使用USING语法,如下:
SELECT review, title
FROM films
RIGHT JOIN film_reviews USING (film_id);
此查询返回与使用ON子句相同的结果。
带有 WHERE 子句的 RIGHT JOIN
要查找右表中与左表中没有任何对应行的行,请添加WHERE子句,如下:
SELECT review, title
FROM films
RIGHT JOIN film_reviews using (film_id)
WHERE title IS NULL;

在本教程中,您学习了如何使用 PostgreSQL 的RIGHT JOIN子句连接两个表中的数据。