我的产品表中有两列-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
有人可以解释一下吗?
答案 0 :(得分:0)
如果没有聚合函数,你不能选择未分组的行--MySQL会给你随机值。我想你很幸运第二个问题
答案 1 :(得分:0)
由于NAME
对您的数据已经是唯一的,因此GROUP BY NAME
与GROUP 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就不会窒息......