MySQL ANY_VALUE 函数的作用
所属分类 mysql
浏览量 8
一、核心作用
绕过 ONLY_FULL_GROUP_BY 严格校验告诉数据库:
这个字段不参与分组、也不用聚合,随便取组内任意一条数据的值就行,不用报错。
GROUP BY 只分组了部分字段,但 SELECT 里多查了没分组、也没聚合的字段 report_type_name。
加上 ANY_VALUE() 直接搞定:
sql
SELECT
t4.id,
t4.xxx,
ANY_VALUE(t4.report_type_name) AS report_type_name
FROM springreport.t4
GROUP BY t4.id, t4.xxx;
MySQL 宽松模式下允许 GROUP BY 不包含所有非聚合字段,
但 TiDB 默认开启了 sql_mode=ONLY_FULL_GROUP_BY(严格模式),
要求 SELECT 中的所有非聚合列,必须全部出现在 GROUP BY 子句中。
二、底层原理
开启 ONLY_FULL_GROUP_BY 后:
SELECT 列 必须 在 GROUP BY 里
或 必须用聚合函数(MAX/MIN/COUNT/SUM)
ANY_VALUE(列) 相当于伪聚合函数:
不做求和、求最大最小
直接返回分组内任意一行的该列值
三、适用场景
关联表名称、字典名称、类型名称这类同分组内值完全一样的字段;
老项目迁移 MySQL→TiDB,不想改 GROUP BY 分组逻辑,快速兼容;
分组依据是主键 / 唯一键,其他附属字段值天然唯一。
四、注意点
如果同一个分组内该字段有多个不同值,ANY_VALUE 会随机取一条,结果不可控;
能规范改 SQL(把字段加到 GROUP BY)优先改 SQL,ANY_VALUE 适合临时兼容老系统。
五、等价替代
不想用 ANY_VALUE 也可以用:
MAX(report_type_name)
MIN(report_type_name)
效果基本一样,也是取一个固定值绕过校验。
上一篇
下一篇
《大国博弈六百年》笔记
走路低头的危害
麦哲伦环球航行记录
历史 地理 地缘政治 科技 文明 精选书单