sql中orderby和groupby的区别

sql中orderby和groupby的区别
order by 和 group by 的区别:
1,order by 从英⽂⾥理解就是⾏的排序⽅式,默认的为升序。 order by 后⾯必须列出排序的字段名,可以是多个字段名。
2,group by 从英⽂⾥理解就是分组。必须有“聚合函数”来配合才能使⽤,使⽤时⾄少需要⼀个分组标志字段。
3,在使⽤group by的语句中,只能select⽤于分类的列(表达式),或聚合函数。where条件⽤于group by之前,having⽤于group by 之后对结果进⾏筛选。
扩展资料:
⼀、order by⽤法:排序查询、asc升序、desc降序
⽰例:
1.select * from 学⽣表
3.查询学⽣表信息、按年龄的升序(默认、可缺省、从低到⾼)排列显⽰也可以多条件排序、⽐如 order by 年龄,成绩 desc
4.按年龄升序排列后、再按成绩降序排列。⼆、group by⽤法:分组查询、having 只能⽤于group by⼦句、作⽤于组内,having条件⼦句可以直接跟函数表达式。使⽤group by ⼦句的查询语句需要使⽤聚合函数。
⽰例:
1.select 学号,SUM(成绩) from 选课表 group by 学号按学号分组、查询每个学号的总成绩
2.select 学号,AVG(成绩) from 选课表
4.having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号='001')
6.查询平均成绩⼤于001课程平均成绩的学号、并按平均成绩的降序排列。
1、解释不同
order by是SQL语句中的关键字,⽤于对查询结果的排序。ORDER BY 语句⽤于对结果集进⾏排序,默认的为升序。
group by语句从英⽂的字⾯意义上理解就是“根据(by)⼀定的规则进⾏分组(Group)”。它的作⽤是通过⼀定的规则将⼀个数据集划分成若⼲个⼩的区域,然后针对若⼲个⼩区域进⾏数据处理。
2、字段不同
order by是按字段排序,后⾯必须列出排序的字段名,可以是多个字段名。
group by是按字段分类,必须有“聚合函数”来配合才能使⽤,使⽤时⾄少需要⼀个分组标志字段。
3、sql命令格式优先顺序不同
group By关键字先对指定的分组条件将筛选得到的视图进⾏分组,将分组视图后不满⾜条件的记录筛选掉。
order By语句最后对视图进⾏排序,最终的结果就产⽣了。
扩展资料
order by和group by的⽤法⽰例
1、select * from 学⽣表 order by 年龄
查询学⽣表信息、按年龄的升序(默认、可缺省、从低到⾼)排列显⽰。
2、select 学号,SUM(成绩) from 选课表 group by 学号
按学号分组、查询每个学号的总成绩。
3、select 学号,AVG(成绩) from 选课表  group by 学号 having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号='001') order by AVG(成绩) desc
查询平均成绩⼤于001课程平均成绩的学号、并按平均成绩的降序排列。
经常见sql语句中order by 1或者order der by N,有时候很莫名其妙.其实1表⽰第⼀个栏位,2表⽰第⼆栏位; 依此类推,当表中只有2个栏位时,oder by 3就会出错,这个跟order by 列名没有什么区别,
不过在特殊情况下还是很有⽤的.
珠钢例如table1(p_code int,issue_date datetime,issue_num int)
p_code      issue_date                              issue_num
101    2016-12-01 00:00:00.000          45
102    2016-12-01 00:00:00.000        89
102    2016-12-03 00:00:00.000        44
103    2016-12-03 00:00:00.000        44
101    2016-12-02 00:00:00.000        44
101    2016-12-03 00:00:00.000        44
101    2016-12-03 00:00:00.000        45
101    2016-12-03 00:00:00.000        44
氨基丙酸
101    2016-12-03 00:00:00.000        44
102    2016-12-03 00:00:00.000        47
101    2016-12-03 00:00:00.000        48
104    2016-12-03 00:00:00.000        86
101    2016-12-03 00:00:00.000        56
101    2016-12-03 00:00:00.000        29
101    2016-12-11 00:00:00.000        11
我想获取某个p_code过去(不含当天)10次的issue_num平均值,
可能我们会这么写
鬼窝select top 10 p_code, avg(issue_num) as avgissue from table1
我不是一个坏女孩where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by issue_date desc
但是以上写法是错误,的,会提⽰ Column "table1.issue_date" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.必须要求issue_date在group by中.
所以我们改成
select top 10 p_code, avg(issue_num) as avgissue from table1
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code,issue_date新安琪儿
order by issue_date desc
但是得到的结果却是(今天是2016.12.11)上海染料化工厂
p_code avgissue
101 44
101 44
101 45
显然以上不是我们想要的结果.
那么该如何结果这种问题呢,当然你可以再次进⾏avg()聚合运算,但是这⾥我们既然说oder by N,那么就⽤这个知识来解决.
语句如下.
select top 10 p_code, avg(issue_num) as avgissue from table1
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by 2 desc
结果如下(今天是2016.12.11)
p_code avgissue
101 44
是不是很神奇呢!
当然作为码农,我们尽量⽤列名来解决,以便增加代码的可读性和易维护性.

本文发布于:2024-09-21 12:43:49,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/40695.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:分组   排序   查询   学号   条件   聚合   结果   成绩
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议