innerjoin和outerjoin区别
时间: 2025-01-08 11:52:22 浏览: 11
### SQL `INNER JOIN` vs `OUTER JOIN` 区别解释
#### 定义与功能差异
`INNER JOIN` 只返回两个表中满足连接条件的记录。这意味着只有当左表和右表都存在匹配的数据时,才会显示这些数据[^1]。
相比之下,`OUTER JOIN` 则会返回即使在另一表中没有匹配也会返回的行。具体来说:
- **LEFT JOIN (LEFT OUTER JOIN)**:返回左表中的所有记录以及右表中存在的匹配;如果右表中不存在,则结果集中相应的列为空(NULL)[^2]。
- **RIGHT JOIN (RIGHT OUTER JOIN)**:类似于 LEFT JOIN ,但是取的是右边表格的所有记录加上左边存在的对应部分。
- **FULL OUTER JOIN**:理论上应该返回两张表所有的组合情况,不过 MySQL 并不直接支持此语法,可以通过 UNION 左外连加右外连来实现相同效果。
#### 示例对比
假设有一个名为 `students` 的学生信息表和另一个叫作 `courses` 的课程注册表,其中包含如下字段:
- students(id, name)
- courses(student_id, course_name)
##### 使用 `INNER JOIN`
```sql
SELECT s.name AS student_name, c.course_name
FROM students s
INNER JOIN courses c ON s.id = c.student_id;
```
这段代码只会显示出那些既存在于 `students` 表又存在于 `courses` 表的学生及其所选修的课程名称。
##### 使用 `LEFT JOIN`
```sql
SELECT s.name AS student_name, IFNULL(c.course_name,'未选课') as course_name
FROM students s
LEFT JOIN courses c ON s.id = c.student_id;
```
这里不仅展示了已报名任何一门或多门课程的同学的信息,还包括了尚未选择任何课程的学生,并将其对应的课程名设为 "未选课"。
##### 使用 `RIGHT JOIN`
```sql
SELECT s.name AS student_name, c.course_name
FROM students s
RIGHT JOIN courses c ON s.id = c.student_id;
```
这将展示所有已经选择了至少一节课的学生名单,同时也可能包括一些重复项或来自其他班级的学生(取决于实际数据结构),因为是从右侧表开始进行关联操作的结果集。
##### 模拟 `FULL OUTER JOIN`
由于 MySQL 不原生提供 `FULL OUTER JOIN` 关键字的支持,可以采用以下方式模拟其行为:
```sql
(SELECT s.name AS student_name, c.course_name FROM students s LEFT JOIN courses c ON s.id = c.student_id)
UNION ALL
(SELECT NULL ,c.course_name FROM courses c WHERE NOT EXISTS (SELECT * FROM students s WHERE s.id=c.student_id));
```
该语句先执行了一个左侧外部联接,再补充上仅存在于右侧表而不在左侧表内的条目,从而达到全外连接的效果。
阅读全文