2

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

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

有人可以解释吗?

4

4 回答 4

0

MySQL 比恕我直言要严格得多。根据实际的 SQL 规范,任何非分组列都需要在包含子句的查询中使用聚合函数。GROUP BY

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

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

于 2012-10-03T11:05:55.400 回答
0

你不能选择没有聚合函数的未分组行 - MySQL 会给你随机值。我猜你对第二个查询很幸运

于 2012-10-03T11:01:50.277 回答
0

因为NAME您的数据已经是唯一的,所以GROUP BY NAMEGROUP BY NAME, OTHER_FIELD.

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

于 2012-10-03T11:03:45.527 回答
0

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

这可能没问题,例如对您知道的表/列进行查询,无论相应组中有多少记录都不会改变。例如。您需要一份客户列表及其总订单。订单表有一个连接到客户表的客户 ID。因此,您可以进行 SUM(Orders.Amount),但仍然可以获得客户 ID、姓名、地址、电话。由于加入是在客户 ID 上的,因此相应的名称、地址等将永远不会改变,因此在 group by 中并不重要。只需按客户 ID 分组。

因此,如果您无意中遗漏了一列,MySQL 不会让您窒息...

于 2012-10-03T11:09:42.800 回答