只有mysql允许alises进入 HAVING ,它不是标准sql(请参见此处:https://dba.stackexchange.com/questions/50391/why-does-mysql-allow-having-to-use-select-aliases )请注意,没有其他主要的rdbms允许在中使用别名 WHERE 或者 HAVING . 不能在中使用别名的原因 WHERE (和 HAVING )是因为 SELECT 实际上是在大多数其他子条款之后评估的:https://stackoverflow.com/a/21693272/159145 一 SELECT 从概念上讲,查询的计算顺序如下: 这个 FROM 条款 这个 WHERE 条款 这个 GROUP BY 条款 这个 HAVING 条款 这个 SELECT 条款 这个 ORDER BY 条款 所以你的问题是:
SELECT
customer_id,
address_id AS addressID
FROM
customer
WHERE
addressID = 5
按以下顺序计算:
1: FROM
customer
2: WHERE
address_id = 5
3: SELECT
customer_id,
address_id AS addressID
如你所见,如果 WHERE 引用的零件 addressID 而不是 address_id 查询执行引擎会抱怨,因为 addressID 在那一点上没有定义。 mysql确实允许引用中的(普通)别名 HAVING 通过执行一个(非标准的)整洁的技巧,其中它部分地评估 SELECT 在评估之前 HAVING -因为mysql有一个别名处理,这意味着评估引擎可以确保别名是有效的(这就是为什么大多数其他rdbms引擎不允许使用别名的原因) HAVING 否则他们应该能够)。但是你不能用别名 WHERE 因为如果有 GROUP BY 那么它可能会使别名变得毫无意义,请考虑:
SELECT
SUM( foo ) AS baz,
created
FROM
foo
WHERE
baz > 5 -- Meaningless: the GROUP BY hasn't been evaluated yet, so `baz` is unavailable
GROUP BY
created
mysql在其手册中对此进行了解释:https://dev.mysql.com/doc/refman/5.7/en/problems-with-alias.html 标准sql不允许引用 WHERE 条款。实施此限制是因为 WHERE 子句,列值可能尚未确定。 这个 WHERE 子句确定哪些行应包含在 GROUP BY 子句,但它指的是列值的别名,在选定行并按 GROUP BY .
1条答案
按热度按时间gfttwv5a1#
只有mysql允许alises进入
HAVING
,它不是标准sql(请参见此处:https://dba.stackexchange.com/questions/50391/why-does-mysql-allow-having-to-use-select-aliases )请注意,没有其他主要的rdbms允许在中使用别名WHERE
或者HAVING
.不能在中使用别名的原因
WHERE
(和HAVING
)是因为SELECT
实际上是在大多数其他子条款之后评估的:https://stackoverflow.com/a/21693272/159145一
SELECT
从概念上讲,查询的计算顺序如下:这个
FROM
条款这个
WHERE
条款这个
GROUP BY
条款这个
HAVING
条款这个
SELECT
条款这个
ORDER BY
条款所以你的问题是:
按以下顺序计算:
如你所见,如果
WHERE
引用的零件addressID
而不是address_id
查询执行引擎会抱怨,因为addressID
在那一点上没有定义。mysql确实允许引用中的(普通)别名
HAVING
通过执行一个(非标准的)整洁的技巧,其中它部分地评估SELECT
在评估之前HAVING
-因为mysql有一个别名处理,这意味着评估引擎可以确保别名是有效的(这就是为什么大多数其他rdbms引擎不允许使用别名的原因)HAVING
否则他们应该能够)。但是你不能用别名WHERE
因为如果有GROUP BY
那么它可能会使别名变得毫无意义,请考虑:mysql在其手册中对此进行了解释:https://dev.mysql.com/doc/refman/5.7/en/problems-with-alias.html
标准sql不允许引用
WHERE
条款。实施此限制是因为WHERE
子句,列值可能尚未确定。这个
WHERE
子句确定哪些行应包含在GROUP BY
子句,但它指的是列值的别名,在选定行并按GROUP BY
.