13

我在查询编写方面并不专业,但从我开始使用 MySQL 时就写了很多。最近我注意到没有必要AS在名称别名中输入关键字。

SELECT name AS n

等于

SELECT name n

但是我知道这种能力在几年前就已经消失了。关于这个主题,我有 2 个问题:

  1. 关键字是AS多余的吗?
  2. 有时,当我在一个没有别名的网站上遇到一个自定义查询时AS,它的执行导致 MySQL 服务停止,我通过添加关键字更改了名称别名的方式,AS这个小改动使它起作用了!

    这里有什么问题?

4

1 回答 1

24

对于 1) 的答案,mysql 文档http://dev.mysql.com/doc/refman/5.0/en/select.html

可以使用 AS alias_name 为 select_expr 指定别名。别名用作表达式的列名,可用于GROUP BYORDER BYHAVING子句。例如:

SELECT CONCAT(last_name,', ',first_name) AS full_name   FROM mytable
ORDER BY full_name;

当使用标识符为 select_expr 起别名时,AS 关键字是可选的。前面的例子可以这样写:

SELECT CONCAT(last_name,', ',first_name) full_name   FROM mytable
ORDER BY full_name;

但是,因为 AS 是可选的,如果您忘记了两个 select_expr 表达式之间的逗号,可能会出现一个微妙的问题:MySQL 将第二个解释为别名。例如,在以下语句中, columnb 被视为别名:

SELECT columna columnb FROM mytable;

因此,在指定列别名时,养成明确使用 AS 的习惯是一种很好的做法。

不允许在 WHERE 子句中引用列别名,因为在执行 WHERE 子句时可能尚未确定列值。请参见第 C.5.5.4 节,“列别名问题”。

这在表的语法上也非常相似:

表引用可以使用 tbl_name AS alias_name 或 tbl_name alias_name 来别名:

SELECT t1.name, t2.salary FROM employee AS t1, info AS t2   WHERE
t1.name = t2.name;

SELECT t1.name, t2.salary FROM employee t1, info t2   WHERE t1.name =
t2.name;

对于 2) 的答案,我认为如果没有软件版本的完整描述、正在运行的查询和收到的错误消息,您无论如何都无法判断。

于 2013-10-24T13:49:34.607 回答