MySQL 8.4 Release Notes
B.3.4.4 列别名问题
别名可以在查询的选择列表中使用,以给列指定一个不同的名称。您可以在GROUP BY
、ORDER BY
或HAVING
子句中使用别名,以引用列:
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
子句中的行,但是它引用了列别名的值,这个值直到行被选择和分组后才确定。
在查询的选择列表中,可以使用标识符或字符串引号指定带引号的列别名:
SELECT 1 AS `one`, 2 AS 'two';
在语句的其他地方,引用别名必须使用标识符引号或将其视为字符串字面量。例如,这个语句将根据列id
的值分组,并使用别名`a`
:
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
GROUP BY `a`;
这个语句将根据字面字符串'a'
分组,不会按照您可能期望的方式工作:
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
GROUP BY 'a';