sql组通过与独特
当查询中没有完成聚合时,为什么有人会使用一个组而不使用一个组?
另外,有人知道在MySQL和SQL Server中,不同的性能考虑。 我猜SQL Server有一个更好的优化器,他们可能接近于同等的地位,但在MySQL中,我期望明显的性能优势。
我对dba的答案感兴趣。
编辑:
比尔的post很有趣,但不适用。 让我更具体的…
select a, b, c from table x group by a, b,c
与
select distinct a,b,c from table x
从MS SQL Server的一些(非常less)经验数据,从我们的数据库的随机表几个。
对于模式:
SELECT col1, col2 FROM table GROUP BY col1, col2
和
SELECT DISTINCT col1, col2 FROM table
当查询没有覆盖索引时,两种方式都产生了以下查询计划:
|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC)) |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))
当有覆盖指数时,两者都产生了:
|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2])) |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)
所以从这个非常小的样本SQL Server当然对待都是一样的。
GROUP BY
将行的GROUP BY
映射到一行,对于特定列中的不同值,甚至不一定必须位于select列表中。
SELECT b, c, d FROM table1 GROUP BY a;
这个查询是合法的SQL( 更正:只在MySQL中;实际上它不是标准的SQL,并且不被其他品牌支持)。 MySQL接受它,它相信你知道你在做什么,以明确的方式selectb
, c
和d
,因为它们是a的函数依赖关系 。
但是,Microsoft SQL Server和其他品牌不允许此查询,因为它无法轻松确定function依赖关系。 编辑:相反,标准SQL要求您遵循单值规则 ,即select列表中的每个列都必须在GROUP BY
子句中命名,否则将作为set函数的参数。
DISTINCT
始终查看select列表中的所有列,而只查看这些列。 DISTINCT
允许您指定列是一个常见的误解:
SELECT DISTINCT(a), b, c FROM table1;
尽pipe括号使DISTINCT
看起来像函数调用,但事实并非如此。 这是一个查询选项,并且在select列表的三个字段中的任何一个中的不同值将导致查询结果中的不同行。 其中一个expression式在这个select列表中有括号,但是这不会影响结果。
在MySQL中,我发现使用GROUP BY通常比DISTINCT更好。
做一个“EXPLAIN SELECT DISTINCT”显示“Using where; Using temporary”MySQL会创build一个临时表。
vs a“EXPLAIN SELECT a,b,c from T1,T2 where T2.A = T1.A GROUP BY a just shows”Using where“
两者都将在MS SQL Server中生成相同的查询计划….如果您有MS SQL Server,则只需启用实际执行计划即可查看哪一个更适合您的需求…
请看看这些post:
http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html
如果你真的在寻找不同的值,这个独特的特性使得源代码更具可读性(就好像它是存储过程的一部分一样)如果我正在写特定的查询,我通常会以group开始,即使我有没有聚合,因为我会经常最终把他们。