PostgreSQL 中的内部连接与完全外部连接与左连接与右连接?
为了通过示例理解这些概念,我们将考虑下面分别定义的两个表、marks和student_info-
marks-
student_info-
如您所见,marks表中没有Aniket的条目,而student_info表中没有Siddhi的条目。也就是说,marks表没有roll_no12的条目,而student_info表没有roll_no45的条目。现在,让我们一一了解不同的JOINS。
INNERJOIN
它仅返回在两个表中都存在条目的那些行。
SELECT marks.name, marks.roll_no, student_info.age FROM marks INNER JOIN student_info onmarks.roll_no= student_info.roll_no
输出是:
LEFTJOIN
这将包括添加左表的条目,而不管右表中是否存在相应的条目。在下面的查询中,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不存在年龄,因此其值为空。
RIGHTJOIN
这将包括添加右表的条目,而不管左表中是否存在相应的条目。在下面的查询中,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的行显示该字段。输出如下所示:
FULLOUTERJOIN
您可以将完全外部联接视为LEFTJOIN和RIGHTJOIN的并集。此查询将为右表或左表中存在的每个唯一条目返回一行。
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的行。