内连接(INNER JOIN)
只获取两张表中匹配条件的记录,即 “交集” 部分。
语法
SELECT 字段 FROM 表A
INNER JOIN 表B
ON 表A.关联字段 = 表B.关联字段;
示例
查询学生姓名和对应的课程名(只显示有课程的学生):
SELECT students.name, courses.course_name
FROM students
INNER JOIN courses
ON students.course_id = courses.course_id;
外连接(保留一张表的全部数据)
左外连接(LEFT JOIN)
左表所有记录均显示,右表只显示匹配记录,不匹配部分用NULL
填充(即 “左表全部 + 交集”)。
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;
右外连接(RIGHT JOIN)
右表所有记录均显示,左表只显示匹配记录,不匹配部分用NULL
填充(即 “右表全部 + 交集”)。
SELECT s.name, c.course_name
FROM students AS s -- 左表:students
RIGHT JOIN courses AS c -- 右表:courses
ON s.course_id = c.course_id;
完全外连接(FULL JOIN)
MySQL 不直接支持,但可通过UNION
合并左外连接和右外连接的结果(即 “左表全部 + 右表全部”):
(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);
多表关联查询(JOIN 多次)
当需要关联 3 张及以上表时,可多次使用JOIN
,逐步建立关联关系。
示例
查询学生姓名、课程名及授课教师:
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;
子查询(嵌套在其他查询中的查询)
子查询可理解为 “查询中的查询”,用于简化复杂逻辑,常见用法:
1. 作为条件值(比较运算符)
-- 查询年龄最小的学生姓名
SELECT name FROM students
WHERE age = (SELECT MIN(age) FROM students); -- 子查询:获取最小年龄
2. 作为集合(IN / NOT IN)
-- 查询已注册的学生姓名
SELECT name FROM students
WHERE student_id IN (SELECT student_id FROM regs); -- 子查询:获取已注册的student_id
3. 存在性判断(EXISTS / NOT EXISTS)
判断子查询是否返回结果(不关心具体数据,只关心 “有 / 无”):
-- 若存在ID为1的课程,则查询所有学生
SELECT * FROM students
WHERE EXISTS (SELECT * FROM courses WHERE course_id = 1);