列的顺序是否按照分组来划分?
如果我有两列,一个基数很高,一个基数很低(唯一的值),那么按照哪个顺序分组呢?
这是一个例子:
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
有什么情况下重要吗?
不,订单对GROUP BY子句无关紧要。
MySQL和SQLite是我所知道的唯一的数据库,允许你select从组中省略的列(非标准的,不可移植的),但是命令也不重要。
SQL是声明式的。
在这种情况下,您已经告诉优化器您想如何分组数据,以及如何实现。
它不会逐行评估(程序)并首先查看一列
主要的地方列顺序很重要的是索引。 col1, col2
与col2, col1
。 完全一样。
Microsoft SQL Server有一个传统的非标准function叫做ROLLUP。 ROLLUP是GROUP BY语法的扩展,当使用GROUP BY列的顺序决定哪些列应该在结果中进行分组。 ROLLUP已弃用。 标准的SQL替代方法是使用SQL Server 2008及更高版本支持的分组集。
因为这里没有提到。 上面的答案是正确的,即“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
sorting的行。
Col1 Col2 Col3 sum(Col3) 2 abc 200 200 1 xyz 100 100 3 xyz 300 700
现在将组中列的顺序改为Col1, Col2
。 检索到的行按Col1
sorting。
即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
注:总和数量(即查询的正确性)保持完全相同。
如果我有两列,一个基数很高,一个基数很低(唯一的值),那么按照哪个顺序分组呢?
查询-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;
两者都是平等的,秩序并不在条款中工作。