as用于字段别名时可省略,但推荐显式写出;含空格或特殊字符需加引号(双引号或反引号);where和group by中不可用别名,因执行顺序早于select;order by和子查询表别名中可用别名。

AS 在 SELECT 中给字段起别名的写法
直接在字段后加 AS 别名 即可,AS 关键字可省略,但显式写出更清晰。别名不能用引号包裹(除非含空格或特殊字符,此时需用双引号或方括号,取决于数据库)。
常见错误:把别名写在 WHERE 或 GROUP BY 里直接引用——这些子句执行早于 SELECT,此时别名还没生效。
SELECT name AS user_name, age AS user_age FROM users;-
SELECT name user_name, age user_age FROM users;(AS省略也合法) - 含空格的别名必须加引号:
SELECT COUNT(*) AS "total count" FROM orders;(PostgreSQL/SQL Server 支持双引号;MySQL 用反引号`total count`)
WHERE 和 GROUP BY 中不能用 AS 别名
因为 SQL 执行顺序是 FROM → WHERE → GROUP BY → SELECT → ORDER BY,WHERE 和 GROUP BY 看不到 SELECT 里定义的别名。
典型报错:column "user_name" does not exist(PostgreSQL)或 Unknown column 'user_name' in 'where clause'(MySQL)。
- ❌ 错误写法:
SELECT name AS user_name FROM users WHERE user_name = 'Alice'; - ✅ 正确写法:
SELECT name AS user_name FROM users WHERE name = 'Alice'; - 聚合后想按别名分组?不行——得用原始表达式:
SELECT LENGTH(name) AS name_len FROM users GROUP BY LENGTH(name);
ORDER BY 可以用 AS 别名
ORDER BY 是少数几个能识别 SELECT 别名的子句,因为它在 SELECT 之后执行。
但要注意:如果别名和原始列名冲突,优先匹配别名;若别名未定义,则回退到列名(行为因数据库而异,不建议依赖)。
-
SELECT id, name AS full_name FROM users ORDER BY full_name;✅ 安全可用 -
SELECT id, name FROM users ORDER BY name;和ORDER BY 2;效果相同(数字表示第几个 SELECT 表达式),但可读性差,易出错 - 别名带函数时,
ORDER BY仍支持:SELECT UPPER(name) AS up_name FROM users ORDER BY up_name;
子查询中 AS 的两种用法:字段别名 vs 表别名
同一个 AS 在不同位置含义不同:在字段后是字段别名,在子查询后是表别名(必须有)。漏掉表别名会报错(MySQL 8.0+、PostgreSQL 强制要求)。
容易混淆的是嵌套层级深时,外层 SELECT 引用内层字段要带表别名前缀。
- 字段别名:
SELECT u.name AS user_name FROM users u; - 表别名(必须):
SELECT t.user_name FROM (SELECT name AS user_name FROM users) AS t; - MySQL 5.7 以前允许省略
AS后的表别名,但 8.0+ 报错:SELECT * FROM (SELECT id FROM users) t;✅,SELECT * FROM (SELECT id FROM users);❌
别名看着简单,但跨子句引用、引号规则、数据库差异这三点最容易卡住人。写完先扫一眼执行顺序,再确认当前子句是否“看得见”那个别名。










