Sql 如果可以使用GROUP BY,为什么不使用DISTINCT?

Sql 如果可以使用GROUP BY,为什么不使用DISTINCT?,sql,mysql,Sql,Mysql,根据MySQL performance wiki: 当您已经或可能使用分组方式时,不要使用DISTINCT 是否有人可以发布查询示例,其中可以使用GROUPBY而不是DISTINCT SELECT Code FROM YourTable GROUP BY Code vs 如果您知道结果中的两列始终直接相关,则执行此操作的速度较慢: SELECT DISTINCT CustomerId, CustomerName FROM (...) 除此之外: SELECT CustomerId, Cust

根据MySQL performance wiki:

当您已经或可能使用分组方式时,不要使用DISTINCT

是否有人可以发布查询示例,其中可以使用GROUPBY而不是DISTINCT

SELECT Code
FROM YourTable
GROUP BY Code
vs


如果您知道结果中的两列始终直接相关,则执行此操作的速度较慢:

SELECT DISTINCT CustomerId, CustomerName FROM (...)
除此之外:

SELECT CustomerId, CustomerName FROM (...) GROUP BY CustomerId

因为在第二种情况下,它只需要比较id,但在第一种情况下,它必须比较两个字段。这是MySQL特有的技巧。它不适用于其他数据库。

基本规则:将SELECT子句中的所有列放入GROUPBY子句中

所以

变成

SELECT a,b,c FROM D GROUP BY a,b,c
例如

关系customerssnum、名称、zipcode、地址PKssnum。ssnum是社会保险号码

SQL:

此SQL语句为zipcode为1234的客户返回唯一记录。最后,结果按名称分组

这里没有必要。因为您选择的ssnum已经是唯一的,因为ssnun是主键。两个人不能有相同的ssnum

在这种情况下,从customer中选择ssnum,其中zipcode=1234按名称分组将提供比。。。独特的


DISTINCT在DBMS中是一种昂贵的操作

这两个查询不一样,是吗?在第二个选项中,您只选择不同的ID,而不选择不同的名称。这对任何其他t-SQL都不起作用,或者对任何其他t-SQL都不会更快?第二个选项不起作用!!!GROUPBY子句中未包含的任何列都需要聚合函数。克雷格·杨:真的吗?MySQL扩展了GROUP BY的使用,因此您可以在SELECT列表中使用GROUP BY子句中未出现的非聚集列或计算。您使用的是什么版本的MySQL?也许您已关闭此功能?如果启用了SQL模式下的唯一完整组,则此扩展不适用。@CraigYoung:我认为关键点是“直接相关”,这意味着它只有在存在函数依赖项CustomerID时才能可靠工作⟶ CustomerName,而您的示例根据定义没有等效的函数依赖关系。如果没有函数依赖关系,您是正确的。AFAICT MySQL实际上不关心也不知道?功能依赖是否存在;它只是假设它会这样做,并“随机”为给定的按列分组的列提取匹配值。如果我错了,请纠正我。基本规则不应该是,将SELECT子句中的所有非聚合列都放在GROUPBY子句中吗?当有GROUPBY和没有GROUPBY时,答案有什么区别?当你有清晰的答案和没有清晰的答案有什么区别是“模糊的”??在AICS中,所有的查询都会产生相同的结果集给定或获取顺序,这并不重要,尽管不一定都以相同的速度进行。这是对q的回答吗?我错过什么了吗?
SELECT DISTINCT a,b,c FROM D
SELECT a,b,c FROM D GROUP BY a,b,c
 Select DISTINCT ssnum from customer where zipcode=1234 group by name