SQL笔记四:order by 和group by
1.order by 排序
使用场景:对查询的数据结果做一个排序
语法:select 字段A,字段B,...,字段N from...order by 字段A asc(desc),字段Basc(desc),...,字段Nasc(desc)
注意事项:1.需要制定排序规则 asc升序,desc降序,默认为升序;2.多个排序字段的用法是,先按第一个排序字段排序,如果出现数据相同时按照第二个字段排序。
实例:查询所有学生的数学成绩,显示学生姓名name, 分数, 由高到低
分析过程:
1.查询涉及到的表:student,grade
2.查询字段信息:student.name,grade.score
3.关联条件:student.id=grade.id
4.过滤条件:grade.kemu='数学' order by score desc
所以最终得到的sql如下:
select
a.name,b.score
from
student a,grade b
where
a.id=b.id
and
kemu='数学'
order by
score desc
2.group by 分组查询
使用场景:根据什么来分组,一般是根据一个或者多个字段来分组,必须有聚合函数(即对一组执行计算并返回单一值的函数)来配合才能使用。
语法:select 字段A,字段B,...,字段N,聚合函数 from...group by 字段A,字段B,...,字段N
注意事项:1.查询信息里必须有聚合函数,常见的聚合函数有:sum()、count()、avg()、min()、max()等
实例1:统计学生表男女生分别多少人
分析过程:
1.查询涉及到的表:student
2.查询字段信息:按男女分组来看多少人,则必须要显示出:sex和count(*)
3.关联条件:只需查一个表,无关联
4.过滤条件:group by sex
所以最终得到的sql如下:
select
sex,count(*)
from
student
group by
sex
实例2:统计每个年级的学生人数(显示年级名称,年级id)
分析过程:
1.查询涉及到的表:student|,class,grade
2.查询字段信息:grade.id,grade.name,count(*)
3.关联条件:student.class_id=class.id and class.grade_id=grade.id
4.过滤条件:group by grade.id
所以最终得到的sql如下:
select
grade.id,grade.name,count(*)
from
student|,class,grade
where
student.class_id=class.id and class.grade_id=grade.id
group by
grade_id
3.一起使用。
使用场景:统计某个或某些个类别分组下的排序
语法:select 字段A,字段B,...,字段N,聚合函数 from...group by 字段A,字段B,...,字段N,order by 字段A asc(desc),字段Basc(desc),...,字段Nasc(desc)
注意事项:1.GROUP BY 和 ORDER BY一起使用时,ORDER BY要在GROUP BY的后面
实例1:统计每个学生的总成绩并排序(由于学生可能有重复名字),显示字段:学生id,姓名,总成绩
分析过程:
1.查询涉及到的表:student a,grade b
还有一个总成绩的学生表,这里需要查询得到:select b.id,sum(b.score) from grade b group by id
2.查询字段信息:a.id,a.name,sum(b.score)
3.关联条件:a.id=c.id
4.过滤条件:order by sum(b.score) desc
所以最终得到的sql如下:
select
a.id,a.name,c.sum(b.score)
from
student a,grade b,(select b.id,sum(b.score) from grade b group by id) c
where
a.id=c.id
order by
c.sum(b.score) desc