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

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

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

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

customer_idSUM(total)
10025
10120

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

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() 函数:

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() 函数是安全和合适的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值