您现在的位置是:首页 >技术交流 >sql_mode的ONLY_FULL_GROUP_BY和any_value()函数网站首页技术交流
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” 表:
| id | customer_id | total |
|---|---|---|
| 1 | 100 | 10 |
| 2 | 100 | 15 |
| 3 | 101 | 20 |
假设我们使用以下查询来获取每个客户的总销售额:
sql复制代码
SELECT customer_id, SUM(total) FROM orders GROUP BY customer_id;
这个查询将返回以下结果:
| customer_id | SUM(total) |
|---|---|
| 100 | 25 |
| 101 | 20 |
但是,如果我们尝试添加一列“id”,并且同时禁用 ONLY_FULL_GROUP_BY 模式,则查询可以编写如下:
sql复制代码
SELECT id, customer_id, SUM(total) FROM orders GROUP BY customer_id;
这个查询将返回以下结果:
| id | customer_id | SUM(total) |
|---|---|---|
| 1 | 100 | 25 |
| 3 | 101 | 20 |
这个查询是错误的,因为在 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_id | any_value(id) | SUM(total) |
|---|---|---|
| 100 | 1 | 25 |
| 101 | 3 | 20 |
在这个查询中,“id”列被包含在了 any_value() 函数中,这样就避免了 ONLY_FULL_GROUP_BY 模式的错误。由于我们只需要一个唯一的“id”值来标识每个客户的销售总额,所以使用 any_value() 函数是安全和合适的。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结