B.4.4.4 列别名问题

可以在查询选择列 table 中使用别名来为列指定其他名称。您可以在GROUP BYORDER BYHAVING子句中使用别名来引用该列:

SELECT SQRT(a*b) AS root FROM tbl_name
  GROUP BY root HAVING root > 0;
SELECT id, COUNT(*) AS cnt FROM tbl_name
  GROUP BY id HAVING cnt > 0;
SELECT id AS 'Customer identity' FROM tbl_name;

标准 SQL 不允许在WHERE子句中引用列别名。之所以施加此限制,是因为在评估WHERE子句时,可能尚未确定列值。例如,以下查询是非法的:

SELECT id, COUNT(*) AS cnt FROM tbl_name
  WHERE cnt > 0 GROUP BY id;

WHERE子句确定应在GROUP BY子句中包括哪些行,但它引用的是列值的别名,该别名直到选择了行并由GROUP BY分组后才知道。

在查询的选择列 table 中,可以使用标识符或字符串引号指定带引号的列别名:

SELECT 1 AS `one`, 2 AS 'two';

在语句的其他地方,带引号的别名引用必须使用标识符引号,否则该引用将被视为字符串 Literals。例如,此语句按使用别名```+22+``+21+`列中的值进行分组:

SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY `a`;

但是此语句按 Literals 字符串'a'分组,因此无法按预期工作:

SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY 'a';