在 SQL Server 2019 中,AS 是设置列别名最清晰、最兼容、最推荐的方式;含空格或中文的别名必须用方括号包裹,不可用双引号;虽可省略 AS,但显式写出可避免歧义和解析错误;计算字段和子查询结果必须用 AS 命名;别名可在 ORDER BY 中使用,但不能在 WHERE 中使用。

直接结论:在 SQL Server 2019 中,AS 是设置列别名最清晰、最兼容、最推荐的方式;对含空格或中文的别名,必须用方括号 [ ] 包裹,不能用双引号。
列别名必须用 AS 吗?
不是必须,但强烈建议显式写出 AS。SQL Server 允许省略(如 salary annual_salary),但这种写法容易引发歧义——尤其当列名本身含空格或关键字时,解析器可能误判为语法错误。显式写 salary AS annual_salary 能避免多数意外解析失败,也更利于团队协作和代码审查。
含中文或空格的别名怎么写才不报错?
SQL Server 不接受双引号包裹的别名(如 "年 龄"),那是 PostgreSQL/MySQL 的习惯;在 SQL Server 中,必须使用方括号:[年 龄] 或 [用户 ID]。否则会报错 Incorrect syntax near '年' 或类似提示。
SELECT name AS [姓名], salary * 12 AS [年收入] FROM employees;- 错误写法:
SELECT name AS "姓名"(触发解析错误) - 错误写法:
SELECT name AS 姓名(若“姓名”是保留字或含空格,也可能失败)
计算字段和子查询结果能用 AS 吗?
可以,而且必须。所有非原始列名的表达式(包括函数、运算、子查询)都需用 AS 明确命名,否则结果集列名为无意义的 Expr1000 类似编号,不利于下游消费(如报表工具、应用层映射)。
SELECT LEN(name) AS name_length, GETDATE() AS query_time FROM users;SELECT (SELECT COUNT(*) FROM orders WHERE user_id = u.id) AS order_count FROM users u;- 注意:子查询作为列时,别名不能省略,否则报错
Msg 8155, Level 16
AS 别名在 WHERE 和 ORDER BY 中能直接用吗?
不能在 WHERE 中用,可以在 ORDER BY 中用。因为 SQL 执行顺序是 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY,WHERE 发生在 SELECT 之前,此时别名还没生成;而 ORDER BY 在 SELECT 之后,所以支持别名排序。
- ✅ 正确:
SELECT salary * 12 AS annual_salary FROM employees ORDER BY annual_salary; - ❌ 错误:
SELECT salary * 12 AS annual_salary FROM employees WHERE annual_salary > 50000;(报错Invalid column name 'annual_salary') - ✅ 替代写法:
WHERE salary * 12 > 50000或用子查询/CTE 提前定义
真正容易被忽略的是:别名作用域仅限当前查询层级。嵌套子查询里定义的别名,在外层无法引用;CTE 中的别名也不能被后续 CTE 直接当作列名使用——这些边界比语法本身更常导致运行时错误。

















