PostgreSQL 中的 INNER JOIN、FULL OUTER JOIN、LEFT JOIN 和 RIGHT JOIN?
为了理解这些概念并结合示例,我们将考虑两个表,分别为 *marks* 和 *student_info*,定义如下:
marks 表:
姓名 (name) | 学号 (roll_no) | 百分比分数 (perc_marks) |
---|---|---|
Siddhi | 45 | 65 |
Yash | 26 | 42 |
Isha | 56 | 87 |
student_info 表:
姓名 (name) | 学号 (roll_no) | 年龄 (age) | 性别 (gender) |
---|---|---|---|
Aniket | 12 | 26 | 男 (M) |
Isha | 56 | 25 | 女 (F) |
Yash | 26 | 25 | 男 (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) |
---|---|---|
Yash | 26 | 25 |
Isha | 56 | 25 |
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) |
---|---|---|
Yash | 26 | 25 |
Siddhi | 45 | [null] |
Isha | 56 | 25 |
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 |
Yash | 26 | 25 |
Isha | 56 | 25 |
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 |
Yash | 26 | 25 |
Siddhi | 45 | [null] |
Isha | 56 | 25 |
广告