-- 子查询
-- 本质:在where语句中嵌套一个子查询语句,最后返回给where里的是一个值
-- 子查询
-- 本质:在where语句中嵌套一个子查询语句,最后返回给where里的是一个值
-- =========where===============
-- 1.查询高等数学-1的所有考试结果(学号,科目编号,成绩),降序排列
SELECT studentno,r.subjectno,studentresult
FROM result r
INNER JOIN `subject` sub
ON r.subjectno=sub.subjectno
WHERE subjectname='高等数学-1'
order by studentresult DESC
-- 方式二:使用子查询(由里及外)
SELECT `studentno`,`subjectno`,`studentresult`
FROM result
WHERE subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname='高等数学-1'
)
-- 查询所有高等数学-1的 学生学号
-- SELECT subjectno FROM `subject` WHERE subjectname='高等数学-1'
-- 练习,查询分数不小于80分的学生的学号和姓名
SELECT 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='高等数学-1')
-- 在这个基础上增加科目,高等数学-2(查询高等数学-2的编号)
-- SELECT subjectno FROM `subject` WHERE subjectname='高等数学-1'
-- 有趣的写法(看懂了证明子查询这一块学会了,不过还是推荐用多表查询)
SELECT studentno,studentname FROM student WHERE studentno in(
SELECT studentno FROM result WHERE studentresult>80 AND subjectno=(
select subjectno FROM `subject` WHERE subjectname='高等数学-1'
)
)
练习
-- 练习:查询c语言-1前3名同学的成绩的信息(学号,姓名,分数)
-- 使用子查询
SELECT studentno,studentname FROM student WHERE studentno in(
SELECT studentno FROM result WHERE (SELECT subjectno FROM `subject` WHERE subjectname='C语言-1' )
order by studentresult DESC
)
LIMIT 0,3
select完整语法
-- select完整语法
SELECT [ALL|DISTINCT]
{*|table *|[table.field1[as a]ias1][,table.field2[as alias2]][.....]}
FROM table_name[as table_alias]
[left|right|inner join table_name2]-- 联合查询
[where....]-- 指定结果须满足的条件
[GROUP BY....]-- 指定结果按照那几个字段来分组
[HAVING]-- 过滤分组记录必须满足的次要条件
[ORDER BY....]-- 指定查询一个记录按一个或者多个排序
[LIMIT 0,3]-- 指定查询记录‘0’为起始位置,‘3’为末尾位置