请问,GROUP BY多列分组原理 第一句 SELECT 供货商,货品 FROM 订货单 GROUP BY 供货商,货品 供货商 货品 小张 洗衣粉 小王 饼干 丽丽 醋 熊俊 饼干 熊俊 纯净水 第二句 SELECT 供货商,货品 FROM 订货单 GROUP BY 货品,供货商 供货商 货品 小张 洗衣粉 小王 饼干 熊俊 饼干 丽丽 醋 熊俊 纯净水 问题: 上面2句SQL语句,只变化了GROUP BY后面的分组顺序,输出结果就不一样,请问,在多列分组的时候,是按照什么规则分组的?从上面的句子看起来,最后好像都是按照最前面的分组来显示的哦 ------解决方案-------------------------------------------------------- GROUP BY A,B,C的排序与ORDER BY A,B,C的排序一样, 即先按A排,如果A一样,则再按B排,以此类推 ------解决方案-------------------------------------------------------- 是按group by 后面的字段先后排优先级的 group by A,B 即先按照A进行分组,A相同的,按B分组 group by B,A 即先按照B进行分组,B相同的,按A分组 ------解决方案-------------------------------------------------------- 默认情况下,排序所有GROUP BY col1,col2,....。查询的方法如同在查询 中指定ORDER BY col1,col2,...。如果显式包括一个包含相同的列的ORDER BY 子句,可以毫不减速地对它进行优化,尽管仍然进行排序 ------解决方案-------------------------------------------------------- 正解 ------解决方案-------------------------------------------------------- ------解决方案-------------------------------------------------------- 顶叶子的,输出的结果完全是一样的,只是没有排序。 ------解决方案-------------------------------------------------------- 查看一下执行计划,会发现,先执行排序,然后才是分组 ------解决方案-------------------------------------------------------- group by 后面的字段顺序 只是影响了结果的顺序 不会影响结果的值 如果是 group by a,b 那么就是按照 order by a,b 的顺序分组,因为分组是需要先排序的 反之 group by b,a 就是按照b,a的顺序分组 ------解决方案--------------------------------------------------------
--> 测试数据:[tb] IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] GO CREATE TABLE [tb]([col1] INT,[col2] INT,[col3] INT) INSERT [tb] SELECT 1,3,5 UNION ALL SELECT 1,3,5 UNION ALL SELECT 2,1,8 UNION ALL SELECT 2,1,8 UNION ALL SELECT 3,2,3 UNION ALL SELECT 3,2,3 UNION ALL SELECT 4,0,NULL UNION ALL SELECT 4,0,NULL --------------开始查询-------------------------- SELECT * FROM [tb] GROUP BY [col1] ,[col2] ,[col3] SELECT * FROM [tb] GROUP BY [col3] ,[col2] ,[col1] SELECT * FROM [tb] GROUP BY [col2] ,[col3] ,[col1] SELECT * FROM [tb] GROUP BY [col1] ,[col2] ,[col3] ORDER BY [col1] ,[col2] ,[col3] SELECT * FROM [tb] GROUP BY [col3] ,[col2] ,[col1] ORDER BY [col1] ,[col2] ,[col3] SELECT * FROM [tb] GROUP BY [col2] ,[col3] ,[col1] ORDER BY [col1] ,[col2] ,[col3] /* col1 col2 col3 ----------- ----------- ----------- 1 3 5 2 1 8 3 2 3 4 0 NULL (4 行受影响) col1 col2 col3 ----------- ----------- ----------- 4 0 NULL 3 2 3 1 3 5 2 1 8 (4 行受影响) col1 col2 col3 ----------- ----------- ----------- 4 0 NULL 2 1 8 3 2 3 1 3 5 (4 行受影响) col1 col2 col3 ----------- ----------- ----------- 1 3 5 2 1 8 3 2 3 4 0 NULL (4 行受影响) col1 col2 col3 ----------- ----------- ----------- 1 3 5 2 1 8 3 2 3 4 0 NULL (4 行受影响) col1 col2 col3 ----------- ----------- ----------- 1 3 5 2 1 8 3 2 3 4 0 NULL (4 行受影响) */ |
|
来自: yufengerdai > 《我的图书馆》