为何SQL中WHERE子句不能使用别名而GROUP BY子句可以?
关于SQL中WHERE子句不能使用别名但GROUP BY可以的疑问
我一直好奇为什么SQL里WHERE子句无法使用列别名,而GROUP BY子句却可以。我查阅过MySQL官方文档,其中给出的解释是:
标准SQL不允许在WHERE子句中引用列别名。该限制的原因是,当WHERE子句被求值时,列值可能尚未确定。
但这个解释并不能让我信服。如果别名不是同时完成定义的,那下面这条语句应该合法才对,但它在MySQL中是无效的:
-- MySQL中无效 SELECT id AS k, k + 1 FROM t;
按照文档的逻辑,count(*)的值是在聚合操作完成后才确定的,那它的别名也不应该被GROUP BY使用;而且多个字段的别名应该是同时定义的,GROUP BY也不该能引用其他字段的别名,但实际情况恰恰相反,下面这条语句在MySQL中是有效的:
-- MySQL中有效 SELECT id AS k, count(*) AS ans FROM t GROUP BY k;
这明显存在矛盾。我认为背后的原因仅仅是SQL解析器的执行顺序:先解析WHERE子句,再处理SELECT的字段列表,最后才解析GROUP BY子句。我的这个观点是否正确?
内容的提问来源于stack exchange,提问作者ihnfsa
相关产品推荐
相关产品推荐

