内连接、左连接、右连接
...大约 2 分钟MySQL数据库
INNER JOIN:
- 只返回两个表中匹配的行。如果没有匹配,则该行不会出现在结果集中。
- 适用于只关心交集数据的场景。
LEFT JOIN(或 LEFT OUTER JOIN):
- 返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配,则结果中的右侧列会显示为NULL。
- 适用于需要保留左表所有数据的场景。
RIGHT JOIN(或 RIGHT OUTER JOIN):
- 返回右表中的所有行,即使左表中没有匹配的行。如果左表没有匹配,则结果中的左侧列会显示为NULL。
- 适用于需要保留右表所有数据的场景。
例子:
假设我们有两个表:
表1:学生表(Students)
学号 姓名 001 张三 002 李四 003 王五 表2:成绩表(Scores)
学号 课程 分数 001 数学 90 002 英语 85
1. 如果使用内连接查询:
SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
INNER JOIN Scores ON Students.学号 = Scores.学号;
结果为:
学号 | 姓名 | 课程 | 分数 |
---|---|---|---|
001 | 张三 | 数学 | 90 |
002 | 李四 | 英语 | 85 |
解释:内连接只返回两个表中匹配的记录。学号为003
的学生没有成绩记录,因此不会出现在结果中。
2. 左连接(LEFT JOIN)
左连接会返回左表(第一个表)的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,则结果中右表的字段会显示为NULL
。
例子:
使用左连接查询:
SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
LEFT JOIN Scores ON Students.学号 = Scores.学号;
结果为:
学号 | 姓名 | 课程 | 分数 |
---|---|---|---|
001 | 张三 | 数学 | 90 |
002 | 李四 | 英语 | 85 |
003 | 王五 | NULL | NULL |
解释:左连接返回了左表(学生表)的所有记录。即使学号为003
的学生没有成绩记录,也会出现在结果中,右表的字段显示为NULL
。
3. 右连接(RIGHT JOIN)
右连接会返回右表(第二个表)的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,则结果中左表的字段会显示为NULL
。
例子:
使用右连接查询:
SELECT Students.学号, Students.姓名, Scores.课程, Scores.分数
FROM Students
RIGHT JOIN Scores ON Students.学号 = Scores.学号;
结果为:
学号 | 姓名 | 课程 | 分数 |
---|---|---|---|
001 | 张三 | 数学 | 90 |
002 | 李四 | 英语 | 85 |
解释:右连接返回了右表(成绩表)的所有记录。在这个例子中,因为所有成绩表的记录都能在学生表中找到匹配,所以结果与内连接相同。但如果成绩表中有额外的学号(例如004
),而学生表中没有对应的记录(退学了,或者说作弊了,不参与排名),那么左表的字段会显示为NULL
。