您现在的位置是:首页 >技术交流 >sql_mode的ONLY_FULL_GROUP_BY和any_value()函数网站首页技术交流

sql_mode的ONLY_FULL_GROUP_BY和any_value()函数

半桶水专家 2024-08-19 12:01:03
简介sql_mode的ONLY_FULL_GROUP_BY和any_value()函数

ONLY_FULL_GROUP_BY 是 MySQL 中的一个 SQL mode,它会强制对 GROUP BY 语句进行更严格的限制。在启用 ONLY_FULL_GROUP_BY 模式之后,如果一个列被 SELECT 子句中没有出现,并且它不是聚合函数的参数,则不能出现在 GROUP BY 子句中。这样可以确保每个非聚合列都与一个明确定义的聚合列相关联。

例如,考虑下面的 “orders” 表:

idcustomer_idtotal
110010
210015
310120

假设我们使用以下查询来获取每个客户的总销售额:

 

sql复制代码

SELECT customer_id, SUM(total) FROM orders GROUP BY customer_id;

这个查询将返回以下结果:

customer_idSUM(total)
10025
10120

但是,如果我们尝试添加一列“id”,并且同时禁用 ONLY_FULL_GROUP_BY 模式,则查询可以编写如下:

 

sql复制代码

SELECT id, customer_id, SUM(total) FROM orders GROUP BY customer_id;

这个查询将返回以下结果:

idcustomer_idSUM(total)
110025
310120

这个查询是错误的,因为在 GROUP BY 子句中没有包含“id”列,同时“id”列也不是聚合函数的参数。启用 ONLY_FULL_GROUP_BY 模式后,将无法编写这样的查询。

any_value() 函数是 MySQL 中的一个聚合函数,它返回一个组中任意一行的某个列的值。这个函数通常与 GROUP BY 结合使用,以消除非聚合列的错误,并确保每个非聚合列都与一个明确定义的聚合列相关联。例如,以下查询可以使用 any_value() 函数:

 

sql复制代码

SELECT customer_id, any_value(id), SUM(total) FROM orders GROUP BY customer_id;

这个查询将返回以下结果:

customer_idany_value(id)SUM(total)
100125
101320

在这个查询中,“id”列被包含在了 any_value() 函数中,这样就避免了 ONLY_FULL_GROUP_BY 模式的错误。由于我们只需要一个唯一的“id”值来标识每个客户的销售总额,所以使用 any_value() 函数是安全和合适的。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。