在MySQL中,JOIN
、LEFT JOIN
和 INNER JOIN
都是用于根据两个或多个表之间的相关列之间的关系,从这些表中查询数据的SQL操作。它们之间的主要区别在于如何处理不匹配的记录。
- INNER JOIN (或 JOIN)
INNER JOIN
返回两个表中都有的记录。换句话说,它只返回那些在两个指定的表中有匹配的行。如果某行在其中一个表中没有匹配项,则不会出现在结果集中。
示例:
假设我们有两个表:students
和 scores
。
students
表:
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Carol |
scores
表:
student_id | score |
---|---|
1 | 90 |
2 | 85 |
4 | 92 |
如果我们想查询每个学生的分数,我们可以使用 INNER JOIN
:
SELECT students.name, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;
结果集:
name | score |
---|---|
Alice | 90 |
Bob | 85 |
注意,Carol没有出现在结果集中,因为她在 scores
表中没有分数。同样,分数为92的学生也没有出现在结果集中,因为他在 students
表中没有记录。
2. LEFT JOIN (或 LEFT OUTER JOIN)
LEFT JOIN
返回左表中的所有记录,以及右表中匹配的记录。如果左表的某行在右表中没有匹配项,则结果集中右表的部分将包含NULL。
使用上面的 students
和 scores
表为例:
SELECT students.name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;
结果集:
name | score |
---|---|
Alice | 90 |
Bob | 85 |
Carol | NULL |
在这里,Carol虽然没有分数,但仍然出现在结果集中,因为 LEFT JOIN
保证了左表(students
)的所有记录都会被返回。
3. RIGHT JOIN (或 RIGHT OUTER JOIN)
RIGHT JOIN
与 LEFT JOIN
相反,它返回右表中的所有记录,以及左表中匹配的记录。如果右表的某行在左表中没有匹配项,则结果集中左表的部分将包含NULL。在实际应用中,RIGHT JOIN
使用得较少,因为通常可以通过调整表的位置和使用 LEFT JOIN
来达到相同的效果。
对于上面的 students
和 scores
表,如果我们使用 RIGHT JOIN
:
SELECT students.name, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;
结果集:
name | score |
---|---|
Alice | 90 |
Bob | 85 |
NULL | 92 |
在这里,分数为92的学生虽然没有在 students
表中的记录,但仍然出现在结果集中,因为 RIGHT JOIN
保证了右表(scores
)的所有记录都会被返回。
总之,选择哪种 JOIN
类型取决于你的查询需求和你想要从结果集中获取哪些数据。