分享小知识:善用Group By排序

中国风
博客专家认证
2017-03-09 02:32:29
加精
善用Group By排序,减少用Order By

大家都了解Group By分组有排序,有没有去了解规律?

在执行前猜一猜排序是(ID/ID2 两列)优先排序顺序

以下列举了公用表/临时表/聚合函数三个因素为例子(覆盖索引因素除外,有利用此类索引都会以索引顺序)
--公用表表达式
--1、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
)
SELECT ID,ID2 FROM CTE GROUP BY ID,ID2;

--2、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID,ID2;

--3、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
)
SELECT ID,ID2 FROM CTE GROUP BY ID2,ID;

--4、
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
)
SELECT ID,ID2,COUNT(*) FROM CTE GROUP BY ID2,ID;


--临时表
IF OBJECT_ID('Tempdb..#CTE') IS NOT NULL
DROP TABLE #CTE;
SELECT 1 AS ID,2 AS ID2 INTO #CTE
UNION ALL
SELECT 2 AS ID,1 AS ID2
--5、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID,ID2;
--6、
SELECT ID,ID2 FROM #CTE GROUP BY ID,ID2;
--7、
SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID2,ID;
--8、
SELECT ID,ID2 FROM #CTE GROUP BY ID2,ID;

...全文
7958 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33668523 2017-04-04
  • 打赏
  • 举报
回复
谢谢楼主分享,十分感谢
中国风 2017-04-02
  • 打赏
  • 举报
回复
贴个测试例子结果,结贴 http://www.cnblogs.com/Roy_88/p/6567269.html
  • 打赏
  • 举报
回复
谢谢您的分享,用group by
  • 打赏
  • 举报
回复
谢谢您的分享,用group by
xiaozhu12371237 2017-03-24
  • 打赏
  • 举报
回复
学习一下
zhujinqiang 2017-03-22
  • 打赏
  • 举报
回复
学习一下。
gw6328 2017-03-17
  • 打赏
  • 举报
回复
引用 32 楼 roy_88 的回复:
[quote=引用 31 楼 jinfengyiye 的回复:] 表有效果。cte没有变化。
兄弟,在#29有规律,已回复过了 为什么不在发贴时就提供规律结论,就是让大家多动手才能理解加深印象,浪费我良苦用心啊[/quote] 明白,我确实动手跑了一下。版主辛苦了!
中国风 2017-03-17
  • 打赏
  • 举报
回复
引用 31 楼 jinfengyiye 的回复:
表有效果。cte没有变化。
兄弟,在#29有规律,已回复过了 为什么不在发贴时就提供规律结论,就是让大家多动手才能理解加深印象,浪费我良苦用心啊
gw6328 2017-03-17
  • 打赏
  • 举报
回复
表有效果。cte没有变化。
gw6328 2017-03-17
  • 打赏
  • 举报
回复
--3、 ;WITH CTE AS ( SELECT 1 AS ID,2 AS ID2 UNION ALL SELECT 2 AS ID,1 AS ID2 ) SELECT ID,ID2 FROM CTE GROUP BY ID2,ID; /* ID ID2 ----------- ----------- 1 2 2 1 */ 这里正常吗
中国风 2017-03-17
  • 打赏
  • 举报
回复
掌握规律就行了,主要体现在表联接

表按分组列(group by 后)顺序没聚合函数时 从左到右,非则反之。特殊情况CTE时按存储结果集默认显示列(SELECT)顺序从左到右
--这一部份
;WITH CTE
AS
(
SELECT 1 AS ID,2 AS ID2
UNION ALL
SELECT 2 AS ID,1 AS ID2
)

---从左到右
gw6328 2017-03-17
  • 打赏
  • 举报
回复
是不是 在表的情况下,只有group by 有排序效果。如果有聚合函数则没有效果。 cte下面没有效果。
gw6328 2017-03-17
  • 打赏
  • 举报
回复
引用 26 楼 roy_88 的回复:
[quote=引用 25 楼 jinfengyiye 的回复:] 为什么我这里不会排序呢? 原来是什么顺序还是什么顺序。
你应该是用自己的数据库表,没用例子吧? 同版本无关,查看执行计划,应该是用到了某一个覆盖索引蔌用了主健分组用到聚集索引[/quote] 我没搞懂意思,麻烦看下我这个结果,我感觉是乱的呢。 --临时表 IF OBJECT_ID('Tempdb..#CTE') IS NOT NULL DROP TABLE #CTE; SELECT 1 AS ID,2 AS ID2 INTO #CTE UNION ALL SELECT 2 AS ID,1 AS ID2 --5、 SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID,ID2; --6、 SELECT ID,ID2 FROM #CTE GROUP BY ID,ID2; --7、 SELECT ID,ID2,COUNT(*) FROM #CTE GROUP BY ID2,ID; --8、 SELECT ID,ID2 FROM #CTE GROUP BY ID2,ID; /* (2 行受影响) ID ID2 ----------- ----------- ----------- 2 1 1 1 2 1 (2 行受影响) ID ID2 ----------- ----------- 1 2 2 1 (2 行受影响) ID ID2 ----------- ----------- ----------- 1 2 1 2 1 1 (2 行受影响) ID ID2 ----------- ----------- 2 1 1 2 (2 行受影响) */
中国风 2017-03-17
  • 打赏
  • 举报
回复
引用 25 楼 jinfengyiye 的回复:
为什么我这里不会排序呢? 原来是什么顺序还是什么顺序。
你应该是用自己的数据库表,没用例子吧? 同版本无关,查看执行计划,应该是用到了某一个覆盖索引蔌用了主健分组用到聚集索引
gw6328 2017-03-17
  • 打赏
  • 举报
回复
为什么我这里不会排序呢? Microsoft SQL Server 2012 (SP1) - 11.0.3156.0 (X64) May 4 2015 18:48:09 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 原来是什么顺序还是什么顺序。
xiaozhu12371237 2017-03-15
  • 打赏
  • 举报
回复
0与1之间 2017-03-14
  • 打赏
  • 举报
回复
学习了.................
我就是小石头 2017-03-14
  • 打赏
  • 举报
回复
利用了MSSQL的特性,实用!
qq6022 2017-03-13
  • 打赏
  • 举报
回复
感谢分享啊1
weixin_37862976 2017-03-12
  • 打赏
  • 举报
回复
加载更多回复(19)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧