Mysql group by子句有多个选择

时间:2012-10-03 10:58:23

标签: mysql

我的产品表中有两列-name和brand,Given是数据,

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子句中没有包含品牌查询工作正常,我也感到惊讶。

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

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:0)

如果没有聚合函数,你不能选择未分组的行--MySQL会给你随机值。我想你很幸运第二个问题

答案 1 :(得分:0)

由于NAME对您的数据已经是唯一的,因此GROUP BY NAMEGROUP BY NAME, OTHER_FIELD相同。

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

答案 2 :(得分:0)

MySQL比恕我直言的严格要严格得多。根据实际的SQL规范,任何未分组的列在包含GROUP BY子句的查询中都需要aggregate function

MySQL将允许在没有此类聚合函数的情况下检索未分组的列,并返回任意值。他们的文档中有explanation这个选择:

  

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

答案 3 :(得分:0)

我认为这是一个被忽视的疏忽。通常,您需要将任何非聚合列包含在“GROUP BY”子句中。但是,MySQL基本上抓住了列的第一个条目,而不是它遇到的聚合的一部分。

这可能没问题,比如对一个你知道不会改变的表/列进行查询,无论相应组中有多少条记录。例如。您需要一个客户列表及其总订单。 orders表具有连接到customer表的客户ID。因此,您可以执行SUM(Orders.Amount),但仍然可以获取客户ID,名称,地址,电话。由于联接是在客户ID上,因此相应的名称,地址等永远不会改变,因此在组内不重要。只需按客户ID分组。

所以,如果你无意中遗漏了一个专栏,MySQL就不会窒息......