SQL中,group by 跟order by有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中,group by 跟order by有什么区别?相关的知识,希望对你有一定的参考价值。
参考技术A groupby
是按。。。分组的意思,order
by
是按。。。排序的意思
group
by
单词就是将表按单词分成几个组
order
by
A,B,C
就是
先按A排序,再按B排序,再按C排序 参考技术B order
by
是按表中某字段排列表中数据
group
by
是按某些字段分类。
例如按
1.按年龄排序表中的记录
select
*
from
users
order
by
age
2.按年龄分类表中数据
(就是求各个年龄的人数)
select
age,count(*)
as
number1
from
users
group
by
age 参考技术C GROUP
BY
是分组,主要用于统计,合计等SQL中使用
比如:
select
userid,count(*)
as
cnt
from
usercount
group
by
userid;
order
by
是排序,即按什么字段来排序,顺序或倒序。
在group
by
中可以使用order
by
如:
select
userid,count(*)
as
cnt
from
usercount
group
by
userid
order
by
cnt
(倒序时添加
desc)
sql语句执行顺序之group by、order by
参考技术A 1、先执行group by后执行order by,如果相同id的记录只获取id大的一条记录,使用子查询(先排序后分组):select * from (select * from table1 order by id desc limit 9999) a group by type_id;
PS:group by需要和limit配合使用,不使用limit语句会自动被优化掉group by无效。
2、字段值为0的记录不分组,字段值大于0的记录进行分组:
方法1:使用union all
SELECT * FROM `table1` WHERE name='0' UNION ALL SELECT * FROM `table1` WHERE name!='0' group by name;
方法2:使用case when :select的时候判断id是否等于0,等于0的话则赋值,然后再使用group by分组
select * from (select o.add_time,og.id,(CASE WHEN og.product_id<1 THEN o.add_time ELSE og.product_id END) as product_id from order as o left join order_goods as og on o.order_id=og.order_id order by o.add_time desc limit 9999) table1 group by product_id order by add_time desc
拓展:(使用上面sql)如果product_id不为空,需要加上判断只获取开启展示状态的product数据:
select * from (select o.add_time,og.id,(CASE WHEN og.product_id>1 THEN (select id from product where product.id=og.product_id and product.is_show=1) ELSE o.add_time END) as product_id from order as o left join order_goods as og on o.order_id=og.order_id order by o.add_time desc limit 9999) table1 where product_id is not null group by product_id order by add_time desc
方法3:使用isfull()函数 ,思路和方法2一样,都是判断字段值是否为空,若是空值先赋一个临时值后分组
需要注意的是,isfull只能用于判断是否为null,若值是0无效(见图3 图4)
以上是关于SQL中,group by 跟order by有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?