在where和having语句中使用别名?

aiqt4smr  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(578)

例子:

SELECT customer_id, address_id as addressID 
FROM customer 
WHERE addressID = 5

但是,使用having子句非常有效。那么为什么别名在where子句中不起作用呢?

gfttwv5a

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 条款
所以你的问题是:

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 .

相关问题