1.分页和排序
1.1 排序
语法 : ORDER BY
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照ASC升序对记录进行排序。
如果希望按照降序对记录进行排序,可以使用 DESC 关键字。
-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC
1.2分页
语法 : SELECT 字段 FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)
推导:
第一页 : limit 0,10 初始值(初始值可以累加)**,**此页显示的条数
第二页 : limit 10,10
第三页 : limit 20,10
…
第N页 : limit (pageNo-1)*pageSzie,pageSzie
[pageNo:页码,pageSize:单页面显示条数]
-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10
2.子查询 三种方法
子查询我感觉比连表查询更容易优化
子查询是在where 中条件的补充,因为引用某一些条件需要一定的前提 where xxx( …条件的前提)
-- 方式一:使用联级查询
SELECT `studentname`,s.`studentno`,`studentresult`
FROM student s INNER JOIN result r
ON s.`studentno` =r.`studentno`
INNER JOIN SUBJECT sub
ON r.`subjectno`=sub.`subjectno`
WHERE subjectname='数据库结构-1'
ORDER BY studentresult DESC
-- 方式二: 子查询()
-- 查询分数不小于80分学生的学号和姓名
SELECT DISTINCT studentno,studentname,studentresult
FROM student s INNER JOIN result r
ON s.`studentno`=r.`studentno`
WHERE r.`studentresult`>=80
-- 后来 我们突然想查询学生对应的科目,只需要在where后面and
SELECT DISTINCT s.studentno,studentname,studentresult
FROM student s INNER JOIN result r
ON s.`studentno`=r.`studentno`
WHERE r.`studentresult`>=80 AND /* 补充的部分*/ subjectno =(
SELECT subjectno FROM SUBJECT
WHERE subjectname ='高等数学-2'
)
--查询分数不小于80分学生的学号和姓名,后面在此基础上再查询
-- 方式二加强 嵌套查询,一直套娃
ELECT DISTINCT s.studentno,studentname,studentresult
FROM student s INNER JOIN result r
ON s.`studentno`=r.`studentno`
WHERE r.`studentresult`>=80 AND /* 补充的部分*/ subjectno =(
SELECT subjectno FROM SUBJECT
WHERE subjectname ='高等数学-2' AND /* 补充的部分*/ xxx =(
..........
)
)