为了通过示例理解这些概念,我们将考虑下面分别定义的两个表、marks和student_info -
marks -
me | 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 表没有roll_no 12 的条目,而student_info 表没有roll_no 45 的条目。现在,让我们一一了解不同的JOINS。
它仅返回在两个表中都存在条目的那些行。
SELECT marks.name, marks.roll_no, student_info.age FROM marks INNER JOIN student_info onmarks.roll_no= student_info.roll_no
输出是 :
name | roll_no | age |
---|---|---|
Yash | 26 | 25 |
Siddhi | 45 | [null] |
Isha | 56 | 25 |
这将包括添加左表的条目,而不管右表中是否存在相应的条目。在下面的查询中,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 不存在年龄,因此其值为空。
name | roll_no | age |
---|---|---|
Yash | 26 | 25 |
Siddhi | 45 | [null] |
Isha | 56 | 25 |
这将包括添加右表的条目,而不管左表中是否存在相应的条目。在下面的查询中,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 的行显示该字段。输出如下所示 :
name | roll_no | age |
---|---|---|
[null] | [null] | 26 |
Yash | 26 | 25 |
Isha | 56 | 25 |
您可以将完全外部联接视为 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 的行。
name | roll_no | age |
---|---|---|
[null] | [null] | 26 |
Yash | 26 | 25 |
Siddhi | 45 | [null] |
Isha | 56 | 25 |