PostgreSQL 教程: RIGHT JOIN 右连接

九月 1, 2023

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

设置样例表

假设您有两个表filmsfilm_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列。

filmsfilm_reviews表的内容如下所示:

SELECT * FROM films;

img

SELECT * FROM film_reviews;

img

ID 为 1 的电影有两条评论。ID 为 2 的电影有 1 条评论。ID 为 3 的电影还没有评论。ID 为 4 的评论与任何电影均无关。

PostgreSQL RIGHT JOIN 子句简介

以下语句使用RIGHT JOIN来从filmsfilm_reviews表中查询数据:

SELECT 
   review, 
   title
FROM 
   films
RIGHT JOIN film_reviews 
   ON film_reviews.film_id = films.film_id;

PostgreSQL RIGHT JOIN example

在此语句中,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从右表中查询所有行,无论它们在左表中是否具有匹配行。

根据filmsfilm_reviews表中的数据:

  • ID 为 1 的评论与 ID 为 1 的电影相匹配。
  • ID 为 2 的评论与 ID 为 2 的电影匹配。
  • ID 为 3 的评论与 ID 为 2 的电影相匹配。
  • ID 为 4 的评论与任何电影都不匹配,因此title列填充为 NULL。

请注意,RIGHT OUTER JOINRIGHT JOIN相同。关键字OUTER是可选的。

下面的维恩图说明了RIGHT JOIN的工作原理:

PostgreSQL Join - 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;

img

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