子查询
MySQL 数据库学习笔记(续)
四、DQL 数据查询语言
4.7 子查询
本质:在 where 语句中嵌套一个子查询语句
where (select * from)
-- =================== 子查询 ==================== --
1. 查询 C语言-1 的所有考试结果(学号,科目编号,成绩) 降序排列
方式一:使用连接查询
SELECT studentno,r.subjectno,studentresult
FROM result r
INNER JOIN subject sub
ON r.subjectno = sub.subjectno
WHERE subjectname = 'C语言-1'
ORDER BY studentresult DESC;
方式二:使用子查询(由里及外)
-- 子查询: 查询 C语言-1 的 课程编号
SELECT subjectno FROM subject WHERE subjectname = 'C语言-1'
SELECT studentno,subjectno,studentresult
FROM result
WHERE subjectno = (
SELECT subjectno
FROM subject
WHERE subjectname = 'C语言-1'
)
ORDER BY studentresult DESC
2. 查询课程为 高等数学-2 且分数不小于 80 的同学的学号和姓名
方式一:连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.studentno = r.studentno
INNER JOIN subject sub
ON r.subjectno = sub.subjectno
WHERE studentresult >=80 AND subjectname = '高等数学-2'
方式二:连接 + 子查询
-- 查询分数不小于80分的学生的学号和姓名
SELECT DISTINCT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.studentno = r.studentno
WHERE studentresult >=80
-- 增加科目条件:高等数学-2
SELECT DISTINCT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.studentno = r.studentno
WHERE studentresult >=80
AND subjectno = (
SELECT subjectno
FROM subject
WHERE subjectname = '高等数学-2'
)
方式三:完全子查询(由里及外)
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE studentresult >=80 AND subjectno = (
SELECT subjectno FROM subject WHERE subjectname = '高等数学-2'
)
)
练习:查询 C语言-1 前5名同学的成绩的信息(学号,姓名,分数)
使用子查询
SELECT s.studentno,
s.studentname,
r.studentresult
FROM student s,result r
WHERE
s.studentno = r.studentno
AND r.subjectno = (
SELECT subjectno FROM subject WHERE subjectname ='C语言-1'
)
LIMIT 0,5
总结
- 子查询核心:一个查询嵌套在另一个查询的
where条件中 - 执行顺序:由里及外,先执行子查询得到结果,再执行外层查询
- 适用场景:查询条件需要通过另一个查询获得时使用
- 可以多层嵌套:支持 2层、3层 甚至更多层子查询

浙公网安备 33010602011771号