SQL中的JOIN操作

基础概念

在了解 JOIN 之前,我们先来清晰地界定一些关键的基础概念:

  • 表(Table):在数据库中,它是用于存储数据的结构化单元,恰似一个个分类存放数据的容器。例如,我们设有一个被称为“学生信息表”的表,专门用于收纳学生的各类相关数据。
  • 字段(Field):表中的一列,其作用是存储特定类型的数据,如同容器里的一个个专属格子,每个格子都有其特定的用途。好比在“学生信息表”中,可能存在“姓名”字段用以存放学生的名字,“年龄”字段用于记录学生的岁数等。
  • 记录(Record):表中的一行,代表着单个的数据项,如同容器里的一个具体物件。例如在“学生信息表”中的一行记录或许代表着一个具体学生的姓名、年龄、性别等详尽信息。

示例表

假设我们存在以下两张表:

学生表(students)

学号(student_id) 姓名(student_name)
1 张三
2 李四
3 王五

成绩表(scores)

学号(student_id) 课程(course) 分数(score)
1 数学 90
2 语文 85

内连接(INNER JOIN)

内连接仅仅返回两个表中相互匹配的行。

SELECT *
FROM students
INNER JOIN scores
ON students.student_id = scores.student_id;

解释:内连接会依据指定的连接条件,即学生表的学号与成绩表的学号相同,来筛选出同时存在于两个表中的行。唯有当两个表中的学号相互匹配时,对应的行才会被选取出来并组成结果集。因此这里学号为3的就不会被选取出来。就是说不匹配的行不会显示

结果表

学号(student_id) 姓名(student_name) 学号(student_id) 课程(course) 分数(score)
1 张三 1 数学 90
2 李四 2 语文 85

外连接(OUTER JOIN)

外连接可分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)
外连接会显示主表的所有行,即使另一张表中没有匹配的行,这些行也会被包含在结果集中。

  • 左外连接(LEFT JOIN)

SELECT *
FROM students
LEFT JOIN scores
ON students.student_id = scores.student_id;

解释:左外连接以左表(此处为 students 表)为主,会返回左表中的所有行。即便在右表(scores 表)中不存在与之匹配的学号,左表中的行依然会被包含在结果集中,只不过对应右表的列值会显示为 NULL 。

结果表

学号(student_id) 姓名(student_name) 学号(student_id) 课程(course) 分数(score)
1 张三 1 数学 90
2 李四 2 语文 85
3 王五 NULL NULL NULL
  • 右外连接(RIGHT JOIN)

SELECT *
FROM students
RIGHT JOIN scores
ON students.student_id = scores.student_id;

解释:右外连接以右表(此处为 scores 表)为主,会返回右表中的所有行。倘若左表(students 表)中不存在与之匹配的学号,左表的列值则会显示为 NULL 。

结果表

学号(student_id) 姓名(student_name) 学号(student_id) 课程(course) 分数(score)
1 张三 1 数学 90
2 李四 2 语文 85

右外链接和左外连接可以通过交换左右表来达到同样的效果。

  • 全外连接(FULL OUTER JOIN)

全外连接会返回两个表中的所有行,若没有匹配项则为 NULL 。

SELECT *
FROM students
FULL OUTER JOIN scores
ON students.student_id = scores.student_id;

解释:全外连接会同时涵盖左外连接和右外连接的结果,也就是说,无论左表还是右表中的行,都会出现在结果集中。假如某一行在另一个表中没有匹配项,相应的列值将显示为 NULL 。

结果表

学号(student_id) 姓名(student_name) 学号(student_id) 课程(course) 分数(score)
1 张三 1 数学 90
2 李四 2 语文 85
3 王五 NULL NULL NULL

交叉连接(CROSS JOIN)

交叉连接会返回两个表的笛卡尔积,也就是每个表中的每一行都与另一个表中的每一行相连接。一般来说这个操作没有必要,除非你真的需要生成一个笛卡尔积。

SELECT *
FROM students
CROSS JOIN scores;

解释:交叉连接会生成两个表中行的所有可能组合。这意味着,如果学生表有 m 行,成绩表有 n 行,那么交叉连接的结果集将包含 m×n 行。

结果表

学号(student_id) 姓名(student_name) 学号(student_id) 课程(course) 分数(score)
1 张三 1 数学 90
1 张三 2 语文 85
2 李四 1 数学 90
2 李四 2 语文 85
3 王五 1 数学 90
3 王五 2 语文 85
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇