当前位置:  开发笔记 > 后端 > 正文

sql group by vs. distinct

如何解决《sqlgroupbyvs.distinct》经验,为你挑选了2个好方法。

当查询中没有聚合时,为什么有人会使用group by而不是?

此外,是否有人知道该组与MySQL和SQL Server中的不同性能注意事项.我猜测SQL Server有一个更好的优化器,它们可能接近等价,但在MySQL中,我期望显着的性能优势.

我对dba的答案感兴趣.

编辑:

比尔的帖子很有趣,但不适用.让我更具体一点......

select a, b, c 
from table x
group by a, b,c

select distinct a,b,c
from table x

Bill Karwin.. 29

GROUP BY将行组映射到一行,每个特定列中的不同值,这些列甚至不一定必须在选择列表中.

SELECT b, c, d FROM table1 GROUP BY a;

此查询是合法的SQL(更正:仅在MySQL中;实际上它不是标准SQL,不受其他品牌支持).MySQL的接受它,并相信,你知道你在做什么,选择b,cd以明确的方式,因为他们是函数依赖的a.

但是,Microsoft SQL Server和其他品牌不允许此查询,因为它无法轻松确定功能依赖性. 编辑:相反,标准SQL要求您遵循单值规则,即select-list中的每一列必须在GROUP BY子句中命名,否则是set函数的参数.

DISTINCT始终查看选择列表中的所有列,并且只查看那些列.这是一个常见的误解,DISTINCT允许您指定列:

SELECT DISTINCT(a), b, c FROM table1;

尽管括号DISTINCT看起来像函数调用,但事实并非如此.它是一个查询选项,并且select-list的三个字段中的任何一个中的不同值将导致查询结果中的不同行.此选择列表中的一个表达式有围绕它的括号,但这不会影响结果.



1> Bill Karwin..:

GROUP BY将行组映射到一行,每个特定列中的不同值,这些列甚至不一定必须在选择列表中.

SELECT b, c, d FROM table1 GROUP BY a;

此查询是合法的SQL(更正:仅在MySQL中;实际上它不是标准SQL,不受其他品牌支持).MySQL的接受它,并相信,你知道你在做什么,选择b,cd以明确的方式,因为他们是函数依赖的a.

但是,Microsoft SQL Server和其他品牌不允许此查询,因为它无法轻松确定功能依赖性. 编辑:相反,标准SQL要求您遵循单值规则,即select-list中的每一列必须在GROUP BY子句中命名,否则是set函数的参数.

DISTINCT始终查看选择列表中的所有列,并且只查看那些列.这是一个常见的误解,DISTINCT允许您指定列:

SELECT DISTINCT(a), b, c FROM table1;

尽管括号DISTINCT看起来像函数调用,但事实并非如此.它是一个查询选项,并且select-list的三个字段中的任何一个中的不同值将导致查询结果中的不同行.此选择列表中的一个表达式有围绕它的括号,但这不会影响结果.



2> Cowan..:

来自MS SQL Server的一些(非常小的)经验数据,来自我们数据库的几个随机表.

对于模式:

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肯定对待两者.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有