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语言的定义。这只是一个非常全面的回答。谢谢!谢谢你的描述性回答!这只是一个非常全面的回答。谢谢!谢谢你的描述性回答!