九月 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
子句连接两个表中的数据。