AS是标准且兼容性最好的列别名写法,显式使用更易读、防歧义;含空格或保留字的别名须加双引号,如SELECT name AS "full name";别名不能在WHERE/GROUP BY中直接引用,因执行顺序在SELECT之后。

SELECT 中用 AS 给列起别名最直接的写法
想让查询结果里的列名更清晰或更短,AS 是标准且兼容性最好的方式。它不是可选关键字(在多数数据库中可省略),但显式写出更易读、不易歧义。
常见错误是把别名写成含空格或特殊字符却没加引号,导致语法报错:ERROR: syntax error at or near "order"——因为 order 是保留字,直接写 order AS status 会失败。
- 别名含空格:必须用双引号包裹,如
SELECT name AS "full name" - 别名是保留字:同样需双引号,如
SELECT status AS "order" - 别名不含空格且非保留字:引号可省,
SELECT id AS user_id完全合法 - MySQL 默认不区分大小写,但 PostgreSQL 区分双引号内的大小写,
"UserId"和"userid"是两个不同别名
FROM 子句里给表起别名能大幅简化 JOIN 写法
多表关联时,不加表别名会导致列名重复、SQL 冗长难维护,比如 SELECT users.name, orders.name 直接报错——数据库不知道哪个 name 来自哪张表。
用 AS(或省略)给表起简短别名后,所有列引用都带前缀,语义明确:
SELECT u.name, o.total FROM users AS u JOIN orders AS o ON u.id = o.user_id;
注意点:
- 表别名在整条
SELECT语句中生效,包括WHERE、ORDER BY等子句 - CTE(
WITH子句)中定义的临时表也支持别名,但作用域仅限该 CTE 内部 - 某些旧版 SQLite 不支持
AS用于表别名,只能写FROM users u,省略AS
别名不能在 WHERE 或 GROUP BY 里直接使用
这是新手最容易踩的坑:SELECT price * 1.1 AS final_price FROM products WHERE final_price > 100 会报错,因为 WHERE 执行顺序在 SELECT 之前,此时 final_price 还不存在。
正确做法是重复表达式,或改用子查询 / CTE:
- 重复表达式:
WHERE price * 1.1 > 100 - 子查询:
SELECT * FROM (SELECT price * 1.1 AS final_price FROM products) t WHERE t.final_price > 100 - CTE 更清晰:
WITH priced AS (SELECT price * 1.1 AS final_price FROM products) SELECT * FROM priced WHERE final_price > 100 -
GROUP BY同理,不能直接用AS别名,除非该别名来自SELECT中的列名(非计算字段)
ORDER BY 可以用列别名,但有兼容性差异
ORDER BY 是少数允许直接使用 SELECT 中定义的别名的位置,因为它的执行在 SELECT 之后。但行为因数据库而异:
- PostgreSQL、SQL Server、MySQL 8.0+ 支持
ORDER BY final_price(对应SELECT price * 1.1 AS final_price) - SQLite 支持,但要求别名不能是数字或纯符号开头
- 旧版 MySQL(5.7 及更早)默认不支持,需开启
sql_mode中的ONLY_FULL_GROUP_BY外其他选项,或直接用序号(如ORDER BY 2表示第二列) - 为求稳妥,生产环境建议在
ORDER BY中优先使用原始列名或表达式,而非依赖别名
别名看着简单,真正用稳的关键在于理解 SQL 各子句的执行顺序——FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。在这个链条里,AS 生效的位置和可用范围就一清二楚了。










