Mysql 在WHERE和HAVING语句中使用别名?

Mysql 在WHERE和HAVING语句中使用别名?,mysql,sql,where-clause,having-clause,Mysql,Sql,Where Clause,Having Clause,例如: SELECT customer_id, address_id as addressID FROM customer WHERE addressID = 5 但是,使用HAVING子句非常有效。那么为什么别名在where子句中不起作用呢?只有MySQL允许在中使用alisehaving,它不是标准的SQL(请参见此处:)请注意,没有其他主要的RDBMS允许在where或HAVING中使用别名 不能在中使用别名的原因是选择实际上是在大多数其他子条款之后计算的: SELECT查询在概念

例如:

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

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

只有MySQL允许在
中使用alisehaving
,它不是标准的SQL(请参见此处:)请注意,没有其他主要的RDBMS允许在
where
HAVING
中使用别名

不能在
中使用别名的原因是
选择
实际上是在大多数其他子条款之后计算的:

SELECT
查询在概念上按以下顺序进行计算:

  • FROM
  • 子句中的
    
    
  • WHERE
    子句
  • 分组依据
    子句
  • 具有
  • 子句的
    
    
  • SELECT
    子句
  • orderby
    子句
  • 所以你的问题是:

    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\u id
    ,则查询执行引擎会抱怨,因为
    addressID
    在该点未定义

    MySQL确实允许在
    HAVING
    中引用(正常)别名,方法是执行一个(非标准)整洁的技巧,在它评估
    HAVING
    之前部分评估
    SELECT
    ,因为MySQL具有别名处理,这意味着评估引擎可以确保别名有效(这就是为什么大多数其他RDBMS引擎不允许在
    have
    中使用别名,否则它们应该能够使用)。但不能在
    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在其手册中对此进行了解释:

    标准SQL不允许在
    WHERE
    子句中引用列别名。施加此限制是因为在计算
    WHERE
    子句时,可能尚未确定列值

    WHERE
    子句确定哪些行应包括在
    GROUP BY
    子句中,但它指的是列值的别名,该列值在选择行之后才为人所知,并按
    GROUP BY
    进行分组


    只有MySQL允许alises在
    中具有
    ,它不是标准的SQL(请参见此处:)请注意,没有其他主要的RDBMS允许在
    中使用别名,其中
    具有

    不能在
    中使用别名的原因是
    选择
    实际上是在大多数其他子条款之后计算的:

    SELECT
    查询在概念上按以下顺序进行计算:

  • FROM
  • 子句中的
    
    
  • WHERE
    子句
  • 分组依据
    子句
  • 具有
  • 子句的
    
    
  • SELECT
    子句
  • orderby
    子句
  • 所以你的问题是:

    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\u id
    ,则查询执行引擎会抱怨,因为
    addressID
    在该点未定义

    MySQL确实允许在
    HAVING
    中引用(正常)别名,方法是执行一个(非标准)整洁的技巧,在它评估
    HAVING
    之前部分评估
    SELECT
    ,因为MySQL具有别名处理,这意味着评估引擎可以确保别名有效(这就是为什么大多数其他RDBMS引擎不允许在
    have
    中使用别名,否则它们应该能够使用)。但不能在
    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在其手册中对此进行了解释:

    标准SQL不允许在
    WHERE
    子句中引用列别名。施加此限制是因为在计算
    WHERE
    子句时,可能尚未确定列值

    WHERE
    子句确定哪些行应包括在
    GROUP BY
    子句中,但它指的是列值的别名,该列值在选择行之后才为人所知,并按
    GROUP BY
    进行分组


    这是一个问题吗?因为这就是SQL语言的定义。这是一个问题吗?因为这就是SQL语言的定义。这只是一个非常全面的回答。谢谢!谢谢你的描述性回答!这只是一个非常全面的回答。谢谢!谢谢你的描述性回答!