<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>