PostgreSQL 中的内部连接与完全外部连接与左连接与右连接?

为了通过示例理解这些概念,我们将考虑下面分别定义的两个表、marksstudent_info -

marks -

meroll_noperc_marks
Siddhi4565
Yash2642
Isha5687

student_info -

nameroll_noagegender
Aniket1226M
Isha5625F
Yash2625M

如您所见,marks 表中没有 Aniket 的条目,而 student_info 表中没有 Siddhi 的条目。也就是说,marks 表没有roll_no 12 的条目,而student_info 表没有roll_no 45 的条目。现在,让我们一一了解不同的JOINS。

INNER JOIN

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

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

输出是 :

nameroll_noage
Yash2625
Siddhi45[null]
Isha5625

LEFT JOIN

这将包括添加左表的条目,而不管右表中是否存在相应的条目。在下面的查询中,marks 表是左表。

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

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

nameroll_noage
Yash2625
Siddhi45[null]
Isha5625

RIGHT JOIN

这将包括添加右表的条目,而不管左表中是否存在相应的条目。在下面的查询中,student_info 表是左表。

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

因此,输出将包含 Aniket 的行,但不包含 Siddhi 的行。这个查询的输出会很有趣。由于我们从标记中查询 name 和 roll_no,因此不会为 Aniket 显示这些值。从 student_info 只查询年龄,因此,只会为 Aniket 的行显示该字段。输出如下所示 :

nameroll_noage
[null][null]26
Yash2625
Isha5625

FULL OUTER JOIN

您可以将完全外部联接视为 LEFT JOIN 和 RIGHT JOIN 的并集。此查询将为右表或左表中存在的每个唯一条目返回一行。

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

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

nameroll_noage
[null][null]26
Yash2625
Siddhi45[null]
Isha5625