在数据库中,连接(Join)用于根据某些条件将多个表的数据组合在一起。常见的连接类型有左连接(LEFT JOIN)、右连接(RIGHT JOIN)、内连接(INNER JOIN)和外连接(FULL OUTER JOIN)。下面是它们的定义、用法和区别:
1. 内连接(INNER JOIN)
定义:
内连接是最常见的连接类型。它返回两个表中匹配条件的行。如果某一行在两个表中没有匹配的记录,这一行就不会出现在结果中。
用法:
SELECT *
FROM 表1
INNER JOIN 表2
ON 表1.字段 = 表2.字段;
示例:
假设有两个表:students(学生表)和 courses(课程表)。
students 表:
|
student_id |
name |
course_id |
|
1 |
李明 |
101 |
|
2 |
张华 |
102 |
|
3 |
王刚 |
103 |
courses 表:
|
course_id |
course_name |
|
101 |
数学 |
|
102 |
英语 |
|
104 |
物理 |
执行内连接查询:
SELECT students.name, courses.course_name
FROM students
INNER JOIN courses
ON students.course_id = courses.course_id;
结果:
|
name |
course_name |
|
李明 |
数学 |
|
张华 |
英语 |
解释:
只有 students 表和 courses 表中 course_id 匹配的行才会出现在结果中。王刚没有报名物理课,所以他的记录没有显示。
2. 左连接(LEFT JOIN)
定义:
左连接(或称左外连接)返回左表(即 FROM 后面的表)中的所有行,即使右表中没有匹配的记录。如果右表没有匹配,右表的相关字段会返回 NULL。
用法:
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.字段 = 表2.字段;
示例:
执行左连接查询:
SELECT students.name, courses.course_name
FROM students
LEFT JOIN courses
ON students.course_id = courses.course_id;
结果:
|
name |
course_name |
|
李明 |
数学 |
|
张华 |
英语 |
|
王刚 |
NULL |
解释:
students 表中的所有行都会出现在结果中,即使在 courses 表中没有找到匹配的课程(如王刚没有选课)。未找到匹配的课程会显示为 NULL。
3. 右连接(RIGHT JOIN)
定义:
右连接(或称右外连接)与左连接相反,返回右表(即 JOIN 后面的表)中的所有行,即使左表中没有匹配的记录。如果左表没有匹配,左表的相关字段会返回 NULL。
用法:
SELECT *
FROM 表1
RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
示例:
执行右连接查询:
SELECT students.name, courses.course_name
FROM students
RIGHT JOIN courses
ON students.course_id = courses.course_id;
结果:
|
name |
course_name |
|
李明 |
数学 |
|
张华 |
英语 |
|
NULL |
物理 |
解释:
courses 表中的所有课程都会出现在结果中,即使在 students 表中没有找到选修该课程的学生(如物理课程)。未找到匹配的学生会显示为 NULL。
4. 外连接(FULL OUTER JOIN)
定义:
外连接(或称全外连接)返回两个表中所有的行,无论它们是否匹配。如果某一行在左表中没有匹配,右表的相关字段会返回 NULL,反之亦然。
用法:
SELECT *
FROM 表1
FULL OUTER JOIN 表2
ON 表1.字段 = 表2.字段;
示例:
执行外连接查询:
SELECT students.name, courses.course_name
FROM students
FULL OUTER JOIN courses
ON students.course_id = courses.course_id;
结果:
|
name |
course_name |
|
李明 |
数学 |
|
张华 |
英语 |
|
王刚 |
NULL |
|
NULL |
物理 |
解释:
返回 students 和 courses 表中的所有记录。如果没有匹配的行,缺失的部分会显示为 NULL。
总结:
|
连接类型 |
结果 |
匹配条件 |
不匹配记录处理 |
|
内连接 |
返回两个表中匹配的行 |
必须满足条件 |
不返回不匹配的记录 |
|
左连接 |
返回左表所有行,右表匹配的行 |
左表所有行 |
右表不匹配的记录为 |
|
右连接 |
返回右表所有行,左表匹配的行 |
右表所有行 |
左表不匹配的记录为 |
|
外连接 |
返回两个表所有行 |
左表或右表有行 |
不匹配的记录显示 |



4450

被折叠的 条评论
为什么被折叠?



