子查询

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

总结

  1. 子查询核心:一个查询嵌套在另一个查询的 where 条件中
  2. 执行顺序由里及外,先执行子查询得到结果,再执行外层查询
  3. 适用场景:查询条件需要通过另一个查询获得时使用
  4. 可以多层嵌套:支持 2层、3层 甚至更多层子查询
posted @ 2026-04-13 20:44  果子同志  阅读(9)  评论(0)    收藏  举报