SQLyog基本操作(六)-排序、分页、子查询与嵌套查询、分组过滤、select小结
4.6 排序 order by
SELECT `SubjectNo`,`ClassHour` FROM `subject` -- 从subject表中选择哪些字段进行显示
-- 排序:ORDER BY,其中,ASC表示升序,DESC表示降序
ORDER BY `ClassHour` ASC -- 根据ClassHour进行升序显示
-- ORDER BY `ClassHour` DESC -- 根据ClassHour进行降序显示
输出结果:
(1)升序结果
(2)降序结果
4.7 分页 limit
-- 为什么要分页?缓解数据库压力,给人更好的体验,瀑布流需要不断加载
SELECT `SubjectNo`,`ClassHour` FROM `subject`
ORDER BY `ClassHour` ASC
-- 语法:limit 起始值 页面的大小
-- 每页只显示5条数据
limit 0,5 -- 1-5条数据,下标从零开始,表示第1条数据 表示第1页
-- limit 1,5 -- 2-6条数据
-- limit 5,5 -- 6-10条数据 表示第2页
-- limit 10,5 -- 11-15条数据 表示第3页
-- LIMIT (n-1)*5,5 -- (n-1)*5+1-(n-1)*5+5条数据 表示第n页
-- 详细语法:LIMIT (n-1)*pageSize,pageSize,其中,pageSize表示页面大小,(n-1)*pageSize表示起始值,n表示当前页,总页数=数据总数/页面大小
语法:
LIMIT (n-1)×pageSize,pageSize,pageSize表示页面大小,其中,(n-1)*pageSize表示起始值,n表示当前页,总页数=数据总数/页面大小
输出结果:
(1)第1页
(2)第2页
练习题:
查询JAVA第一学年课程成绩排名前十的同学,并且分数要大于80的学生信息,输出:学号、姓名、课程名称、分数。
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM `student` s
INNER JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE `SubjectName`= 'JAVA第一学年' AND `StudentResult`>=80
ORDER BY `StudentResult` DESC
LIMIT 0,10
4.8 子查询与嵌套查询
之前我们在写sql,查询条件中的值都是固定的,如果将条件中的值换成计算出来的话,就是子查询了。
本质:在where条件下嵌套一个查询语句
-- 1.查询“数据库结构-1”的所有考试结果,输出:学号、科目编号、成绩,降序排列
-- 方式1:使用连接查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM `result` r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectName`
WHERE `SubjectName`='数据库结构-1'
ORDER BY `StudentResult` DESC
-- 方式2:使用子查询(由里及外)
-- 查询所有“数据库结构-1”的学生学号
SELECT `StudentNo`,`SubjectNo`,`StudentResult`
FROM `result`
WHERE `SubjectNo`= ANY(
SELECT `SubjectNo` FROM `subject`
WHERE `SubjectName` = '数据库结构-1'
)
ORDER BY `StudentResult` DESC
-- Subquery returns more than 1 row:表示子查询返回了多行数据
-- 解决方法:在()前加ANY
-- 2.查询不小于80分的学生的学号和姓名
SELECT DISTINCT s.`StudentNo`,`StudentName`
FROM `student` s
INNER JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`
WHERE `StudentResult`>80
-- 3.在2的基础上,增加一个科目:高等数学-2
-- 查询“高等数学-2”的编号
SELECT DISTINCT s.`StudentNo`,`StudentName`
FROM `student` s
INNER JOIN `result` r
ON s.`StudentNo`=s.`StudentNo`
WHERE `StudentResult`>80 AND `SubjectNo`=(
SELECT `SubjectNo` FROM `subject`
WHERE `StudentName`='高等数学-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'
)
)
-- 用连接查询实现
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 `SubjectName`='高等数学-2' AND `StudentResult`>=80
-- 练习:使用子查询查询“C语言-1”前5名同学的成绩信息:学号、姓名、分数
SELECT DISTINCT s.`StudentNo`,`StudentName`,`StudentResult`
FROM `student` s
INNER JOIN