今天我们要聊聊关系型数据库里最有意思的主题之一——用 JOIN 把多个表的数据合起来。这玩意儿超强大,能让你搞定各种复杂的关联和分析。
想象一下,你的数据库就像一本超大的漫画书,每个分开的表就是一格画面。要拼成完整的故事,你得把这些画面连起来。JOIN 就是帮你干这事儿的。数据合并其实就是让查询能从多个表里拿到信息,并且按照你设定的条件把它们关联起来。
关系型数据库的核心就是表之间的关联概念。每个表都存着某个实体的信息,但想看全貌,咱们经常得把不同表的数据连起来。比如:
students表存学生名单。courses表存课程列表。enrollments表显示谁上了哪些课。
想知道哪个学生上了哪门课,就得把这些表连起来。在面试时,会用 JOIN 的开发者看起来就很专业,因为这可是数据领域最吃香的技能之一。
主要的 JOIN 类型
在 PostgreSQL 里有几种 JOIN,每种都有自己的用处。我们先来大致过一遍,别一上来就被复杂例子搞晕:
| JOIN 类型 | 说明 |
|---|---|
INNER JOIN |
只返回两个表里都能匹配上的行。 |
LEFT JOIN |
返回左边表的所有行,右边表只返回能匹配上的。 |
RIGHT JOIN |
返回右边表的所有行,左边表只返回能匹配上的。 |
FULL OUTER JOIN |
返回两个表的所有行,没匹配的地方用 NULL 补上。 |
选哪种 JOIN,得看你要干啥:
- 只要两个表都能对上的数据,用
INNER JOIN。 - 想保留一个表的所有数据,另一个只要能对上的,用
LEFT JOIN或RIGHT JOIN。 - 两个表的所有数据都要,不管能不能对上,用
FULL OUTER JOIN。
咱们直接上手练练这些 JOIN 吧。
例题——“谁上了哪门课?”
假设我们有三个表:
students 表
| id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
courses 表
| id | title |
|---|---|
| 101 | 数学 |
| 102 | 英语 |
enrollments 表
| student_id | course_id |
|---|---|
| 1 | 101 |
| 2 | 102 |
这些表的关系如下:
students里的id字段是学生的唯一标识。courses里的id字段是课程的唯一标识。enrollments里的student_id和course_id字段把学生和课程连起来。
假如我们要解决这样一个问题:哪个学生报了哪门课?
用 JOIN 就能搞定。我们要根据它们的关联把表连起来:
- 把
students和enrollments按id = student_id连起来。 - 把
enrollments和courses按course_id = id连起来。
SQL 查询长这样:
SELECT students.name, courses.title
FROM enrollments
JOIN students ON enrollments.student_id = students.id
JOIN courses ON enrollments.course_id = courses.id;
这个查询干了啥:
FROM enrollments—— 先从把学生和课程连起来的表开始。JOIN students ON enrollments.student_id = students.id—— 加上学生表,拿到名字。JOIN courses ON enrollments.course_id = courses.id—— 加上课程表,拿到课程名。
结果会是这样:
| name | title |
|---|---|
| Otto | 数学 |
| Anna | 英语 |
注意:如果某个学生一门课都没报,他不会出现在结果里——因为 JOIN 默认是严格的(INNER JOIN)。后面我们会讲怎么用 LEFT JOIN 把这些学生也查出来。
如果你对这个查询还有点懵,别急!慢慢来,后面的课都会帮你搞明白!
现实生活中有啥用?
现在你知道怎么连表了,咱们聊聊现实世界。你有没有想过网店是怎么运作的?比如你挑手机时能看到别人的评价。
products表存商品信息。reviews表存买家的评价。customers表存买家自己的信息。
要在网站上显示评价,就得把 products、reviews 和 customers 这几个表合起来。这就是 JOIN 的实际应用。
要注意啥?
在我们下节课深入 JOIN 之前,有几点你得记住:
JOIN的顺序很重要。 比如LEFT JOIN会返回左边表的所有行,顺序一换结果就变了。- 先用小表练手。 一开始别查几百万行。记住,哪怕最简单的查询也要让人一看就懂。
- 习惯去想表之间的关系。 当你能把表当成一个大结构的部分来看,
JOIN就会变得很自然。
从今天开始,我们就要变身 SQL 专家啦。下节课你会学会怎么用 INNER JOIN 从两个表里查数据。这会是你学 PostgreSQL 的一个大进步!
GO TO FULL VERSION