繁体   English   中英

MySQL的group by子句具有多个选择

[英]Mysql group by clause with multiple selects

我的产品表中有2列-名称和品牌,鉴于数据,

NAME               BRAND
'Ruby Axe Guitar', 'Guitar''s & Co'
'TV'             , 'LG' 

当我尝试执行此查询时,

select name,brand, sum(1000) as sum,'Test' as name1
from products
group by name,brand

但是即使我没有在group by子句中包含brand,查询还是可以正常工作的。

select name,brand, sum(1000) as sum,'Test' as name1
from products
group by name

有人可以解释吗?

如果没有聚合功能,则无法选择未分组的行-MySQL将为您提供随机值。 我想您第二次查询很幸运

由于NAME在您的数据中已经是唯一的,因此GROUP BY NAMEGROUP BY NAME, OTHER_FIELD

NAME是唯一的,因此与任何其他列的组合也是唯一的。

MySQL的严格程度要低于恕我直言。 根据实际的SQL规范,任何未分组的列在包含GROUP BY子句的查询中都需要一个聚合函数

MySQL将允许在没有此类聚合函数的情况下检索未分组的列,并返回任意值。 他们在文档中对此选择进行了解释

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。 这意味着前面的查询在MySQL中是合法的。 您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。 但是,这主要在每个未聚合列中未在GROUP BY中命名的所有值对于每个组都相同时才有用。 服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。

我相信它的意图是忽略的监督。 通常,您将需要将任何非聚合的列包括在“ GROUP BY”子句中。 但是,MySQL基本上会获取该列的第一个条目,而不是它遇到的聚合的一部分。

这可能是可以的,例如,对一个表/列执行查询,无论相应的group by中有多少条记录,该表/列都不会改变。 例如。 您需要客户及其总订单的列表。 订单表具有加入该客户表的客户ID。 因此,您可以执行SUM(Orders.Amount),但仍获得客户ID,名称,地址,电话。 由于联接位于客户ID上,因此相应的名称,地址等将永远不会更改,因此在分组依据中并不重要。 只需按客户ID分组即可。

因此,如果您无意中忽略了专栏,MySQL不会扼杀您...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM