PostgreSQL 中的 INNER JOIN、FULL OUTER JOIN、LEFT JOIN 和 RIGHT JOIN?


为了理解这些概念并结合示例,我们将考虑两个表,分别为 *marks* 和 *student_info*,定义如下:

marks 表:

姓名 (name)学号 (roll_no)百分比分数 (perc_marks)
Siddhi4565
Yash2642
Isha5687

student_info 表:

姓名 (name)学号 (roll_no)年龄 (age)性别 (gender)
Aniket1226男 (M)
Isha5625女 (F)
Yash2625男 (M)

正如你所看到的,marks 表中没有 Aniket 的条目,而 student_info 表中没有 Siddhi 的条目。换句话说,marks 表中没有学号为 12 的条目,而 student_info 表中没有学号为 45 的条目。现在,让我们逐一了解不同的 JOIN。

INNER JOIN

它只返回两个表中都存在条目的那些行。

SELECT marks.name, marks.roll_no, student_info.age
FROM marks
INNER JOIN student_info on marks.roll_no = student_info.roll_no

输出结果为:

姓名 (name)学号 (roll_no)年龄 (age)
Yash2625
Isha5625

LEFT JOIN

这将包含左侧表的全部条目,无论右侧表中是否存在相应的条目。在下面的查询中,marks 表是左侧表。

SELECT marks.name, marks.roll_no, student_info.age
FROM marks
LEFT JOIN student_info on marks.roll_no = student_info.roll_no

因此,输出将包含 Siddhi 的一行,但不包含 Aniket 的一行,如下所示。由于 Siddhi 的年龄不存在,其值将为 null。

姓名 (name)学号 (roll_no)年龄 (age)
Yash2625
Siddhi45[null]
Isha5625

RIGHT JOIN

这将包含右侧表的全部条目,无论左侧表中是否存在相应的条目。在下面的查询中,student_info 表是左侧表。

SELECT marks.name, marks.roll_no, student_info.age
FROM marks
RIGHT JOIN student_info on marks.roll_no = student_info.roll_no

因此,输出将包含 Aniket 的一行,但不包含 Siddhi 的一行。此查询的输出很有趣。由于我们查询的是 marks 表中的姓名和学号,因此 Aniket 的这些值将不会显示。只有从 student_info 查询的年龄被查询,因此,只有该字段将显示在 Aniket 的行中。输出如下所示:

姓名 (name)学号 (roll_no)年龄 (age)
[null][null]26
Yash2625
Isha5625

FULL OUTER JOIN

你可以将 full outer join 视为 LEFT JOIN 和 RIGHT JOIN 的并集。此查询将返回右侧表或左侧表中存在的每个唯一条目的行。

SELECT marks.name, marks.roll_no, student_info.age
FROM marks
FULL OUTER JOIN student_info on marks.roll_no = student_info.roll_no

正如预期的那样,输出包含 Siddhi 和 Aniket 的行。

姓名 (name)学号 (roll_no)年龄 (age)
[null][null]26
Yash2625
Siddhi45[null]
Isha5625



更新于:2021年2月2日

733 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告