列的顺序在group by子句中是否重要?


85

如果我有两列,一列具有非常高的基数,而另一列具有非常低的基数(值的唯一数目),那么按哪个顺序分组是否重要?

这是一个例子:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

在某些情况下重要吗?


2
另请参阅相关文章:MYSQL5分组依据...
trcarden 2011年

Answers:


74

不,顺序对于GROUP BY子句无关紧要。

MySQL和SQLite是我所知道的仅有的数据库,它允许您选择按组方式(非标准,不可移植)从组中省略的列,但是顺序也不重要。


27

SQL是声明性的。

在这种情况下,您已经告诉优化器如何对数据进行分组以及如何进行数据分组。

它不会逐行评估(过程性的),而是先查看一列

列的主要顺序是索引。col1, col2与相同col2, col1。完全没有


15
对于ORDER BY也很重要。
文森特·麦克纳伯

12

Microsoft SQL Server有一个旧的非标准功能,称为ROLLUP。ROLLUP是GROUP BY语法的扩展,当使用GROUP BY列时,ROUP BY列的顺序确定应在结果中对哪些列进行分组。然而,不推荐使用ROLLUP。标准的SQL替代方法是使用分组集,SQL Server 2008和更高版本支持该分组集。


10

由于这里没有提到。上面的答案是正确的,即“ group by”子句之后的列顺序不会影响查询的正确性(即总金额)。

但是,要检索的行的顺序将根据在“ group by”子句之后指定的列的顺序而变化。例如,考虑A具有以下行的表:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1将检索Col2按升序排列的行。

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

现在,将分组依据中的列顺序更改为Col1, Col2。检索到的行按升序排列Col1

select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

注意:总和(即查询的正确性)保持完全相同。


7
但是,除非使用“ ORDER BY”,否则选择结果的行顺序始终是不确定的,不是吗?因此,即使根本不使用GROUP BY,也永远不要依赖任何特定的行顺序。
avl_sweden

同意@avl_sweden,我认为响应至少应该表明此行为是特定于实现的。无法保证较新(甚至相同)的SQL Server版本不会产生不同的顺序。
没人噩梦

2

如果我有两列,一列具有非常高的基数,而另一列具有非常低的基数(值的唯一数目),那么按哪个顺序分组是否重要?

查询1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

查询2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

两者相等,在group by子句中顺序无效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.