8)排序分组
Posted xuan01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8)排序分组相关的知识,希望对你有一定的参考价值。
1、排序 order by:
order by:按照给定的字段或字段列表对结果集进行排序;asc是默认缺省值,升序排列;desc表示降序排序;
order by col_name | expr | position [asc] | desc [,col_name | expr | position [asc] | desc,...]
1)单列排序:
select * from choose order by score desc;
其中,null按最小值处理;
select stu_no,exam_score,regular_score, exam_score*0.8+regular_score*0.2 total_score from exam order by total_score desc;
可以看到按总分降序排列;上述也可以写成,将 结果集的第四列的total_score 写成 4:
select stu_no,exam_score,regular_score,exam_score*0.8+regular_score*0.2 total_score from exam order by 4 desc;
2)多列排序:
将 table_schema 升序排列,table_name 按降序排列;
select table_schema,table_name from information_schema.tables order by table_schema,table_name desc;
2、组函数:
1)组函数对null值会忽略掉;
select count(*),count(class_no) from student;
select count(score),avg(score) from choose; select max(choose_time),min(choose_time) from choose;
2)组函数参数使用distinct修饰;
select count(*), count(class_no),count(distinct class_no) from student;
select count(table_schema),count(distinct table_schema) from information_schema.tables;
3、分组:
group by子句将查询结果按照某个字段进行分组,字段值相同的作为一个分组,通常与聚合函数一起使用;
group by 字段列表[ having 条件表达式]
1)单列分组:
将每个学生的均分显示出来;
select student_no,avg(score) from choose group by student_no;
select table_schema, count(*) cnt from information_schema.tables group by table_schema;
2)多列分组:
将每个学生及其对应的名字分组;
select s.student_no,s.student_name,sum(score) 总分, avg(score) 平均分 from student s,choose c where s.student_no = c.student_no group by s.student_no,s.student_name;
select table_schema,table_type, count(*) cnt from information_schema.tables group by table_schema,table_type;
此处我们若是想进一步筛选计数值,可能会想到where子句来进行筛选;
我们可以看到:where子句中不能使用字段或表达式的别名,也不能使用组函数;
4)having 子句:
在group by筛选的基础上,若想进一步筛选,则需要用到having 子句;
having 条件表达式
select table_schema,table_type,count(*) cnt from information_schema.tables group by table_schema, table_type having cnt >= 60;
select table_schema,table_type,count(*) cnt from information_schema.tables group by table_schema, table_type having count(*) >= 60 order by cnt desc;
5)总结:
#语法顺序: select from where group by having order by #执行顺序: from where select group by having by order by
说明:
一旦有别名,那么所有字段都必须使用别名了,from 一定是最先执行的,没有from,就没有表,别名也是在这儿命名的;因此它是第一个执行的;
接着where 子句不能使用字段或表达式的别名,也不能使用组函数;因此它第二个执行;
select 字段是第三个执行,我们需要筛选的字段;
group by是筛选的基础上进一步分组;
having by 一定是在group by 的基础上有的;
最后是order by;
mysql 查询排序分组问题
参考技术A 这里想要实现的是的查询不通works_id里面sort最小的老师记录首先需要做的是sort排序,之后再按照works_id分组解决问题
之前陷入了思维困局,总是想要用min(sort)这种方式去查询,换了思路
复杂的问题需要简单的去做不能说一下子就要搞一个复杂的问题,一个个简单的sql完成复杂的问题
如下:
SELECT aaa.teacher_id AS teacher_id, aaa.works_id FROM ( SELECT * FROM works_teacher ORDER BY sort ) aaa GROUP BY works_id
以上是关于8)排序分组的主要内容,如果未能解决你的问题,请参考以下文章
java 8 streamlambda表达式对list操作分组过滤求和最值排序去重
java 8 streamlambda表达式对list操作分组过滤求和最值排序去重
iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。