MySQL中HAVING引用SELECT的SUBSTRING函数报未知列错误的原因
问题核心原因
首先先修正示例中存在的笔误:两个语句GROUP BY子句里的SUBSTSRING是拼写错误,正确应为SUBSTRING,否则两条语句都会触发函数不存在的报错。
两条问题语句(已修正拼写)
- 触发未知列错误的语句:
SELECT SUBSTRING(column, ..) FROM someTable GROUP BY SUBSTRING(column, ..) HAVING SUBSTRING(column, ..) IS NULL;
- 正常执行的语句:
SELECT SUBSTRING(column, ..) AS otherName FROM someTable GROUP BY SUBSTRING(column, ..) HAVING otherName IS NULL;
差异根本原因
造成两条语句执行结果差异的核心是MySQL独有的SQL执行顺序扩展规则:
- 标准SQL的逻辑执行顺序是
FROM→WHERE→GROUP BY→ 聚合计算 →HAVING→SELECT→ 排序/分页,按照这个规则,HAVING执行在SELECT之前,本来是无法引用SELECT里定义的列别名的。 - MySQL对标准SQL做了自定义扩展,允许
HAVING、GROUP BY直接引用SELECT列表中声明的别名,这就是第二条语句引用otherName别名可以正常执行的原因。
第一个语句报错的原因是:你没有给SELECT里的SUBSTRING计算结果声明别名,HAVING子句中重复写的SUBSTRING(column, ..)会被MySQL判定为一个新的非分组列,尤其是在ONLY_FULL_GROUP_BY模式开启的状态下,只有这个表达式和GROUP BY里的表达式参数完全一致时才会被识别,但凡省略的SUBSTRING参数在GROUP BY和HAVING里有细微差异,就会直接被判定为未分组的未知列,触发报错。
内容的提问来源于stack exchange,提问作者newbieeyo
相关产品推荐
相关产品推荐

