第六篇:MySQL 多表查询与子查询

内连接(INNER JOIN)

只获取两张表中匹配条件的记录,即 “交集” 部分。

语法

1
2
3
4
<code>SELECT 字段 FROM 表A 
INNER JOIN 表B
ON 表A.关联字段 = 表B.关联字段;
</code>

示例

查询学生姓名和对应的课程名(只显示有课程的学生):

1
2
3
4
5
<code>SELECT students.name, courses.course_name 
FROM students
INNER JOIN courses
ON students.course_id = courses.course_id;
</code>

外连接(保留一张表的全部数据)

左外连接(LEFT JOIN)

左表所有记录均显示,右表只显示匹配记录,不匹配部分用NULL填充(即 “左表全部 + 交集”)。

1
2
3
4
5
<code>SELECT s.name, c.course_name 
FROM students AS s -- 左表:students(别名s)
LEFT JOIN courses AS c -- 右表:courses(别名c)
ON s.course_id = c.course_id;
</code>

右外连接(RIGHT JOIN)

右表所有记录均显示,左表只显示匹配记录,不匹配部分用NULL填充(即 “右表全部 + 交集”)。

1
2
3
4
5
<code>SELECT s.name, c.course_name 
FROM students AS s -- 左表:students
RIGHT JOIN courses AS c -- 右表:courses
ON s.course_id = c.course_id;
</code>

完全外连接(FULL JOIN)

MySQL 不直接支持,但可通过UNION合并左外连接和右外连接的结果(即 “左表全部 + 右表全部”):

1
2
3
4
5
6
7
8
9
10
<code>(SELECT s.name, c.course_name 
FROM students AS s
LEFT JOIN courses AS c
ON s.course_id = c.course_id)
UNION -- 合并结果,自动去重
(SELECT s.name, c.course_name
FROM students AS s
RIGHT JOIN courses AS c
ON s.course_id = c.course_id);
</code>

多表关联查询(JOIN 多次)

当需要关联 3 张及以上表时,可多次使用JOIN,逐步建立关联关系。

示例

查询学生姓名、课程名及授课教师:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code>SELECT st.name AS 学生姓名, 
c.course_name AS 课程名,
t.teacher_name AS 教师名
FROM students AS st
-- 关联课程表
INNER JOIN courses AS c
ON c.course_id = st.course_id
-- 关联注册表(中间表)
INNER JOIN regs AS re
ON re.student_id = st.student_id
-- 关联课程-教师关联表
INNER JOIN course_teachers AS ct
ON ct.course_id = st.course_id
-- 关联教师表
INNER JOIN teachers AS t
ON t.teacher_id = ct.teacher_id;
</code>

子查询(嵌套在其他查询中的查询)

子查询可理解为 “查询中的查询”,用于简化复杂逻辑,常见用法:

1. 作为条件值(比较运算符)

1
2
3
4
<code>-- 查询年龄最小的学生姓名
SELECT name FROM students
WHERE age = (SELECT MIN(age) FROM students); -- 子查询:获取最小年龄
</code>

2. 作为集合(IN / NOT IN)

1
2
3
4
<code>-- 查询已注册的学生姓名
SELECT name FROM students
WHERE student_id IN (SELECT student_id FROM regs); -- 子查询:获取已注册的student_id
</code>

3. 存在性判断(EXISTS / NOT EXISTS)

判断子查询是否返回结果(不关心具体数据,只关心 “有 / 无”):

1
2
3
<code>-- 若存在ID为1的课程,则查询所有学生
SELECT * FROM students
WHERE EXISTS (SELECT * FROM courses WHERE course_id = 1);</code>
上一篇
下一篇