先说一个核心判断:SQL 里的 AS 关键字,在列别名和表别名这个场景里,严格来说是可以省略的,功能上完全等效。但事情没这么简单——到了子查询、CTE 以及视图定义这些环节,AS 就成了硬性要求,不写你真会报错。更坑的是,如果你省略了 AS,结果别名里刚好有个空格、跟保留字撞上了,或者混进了什么特殊字符,那就必须用反引号把别名包起来,否则语法解析直接翻车。

先说结论:省略 AS 对查询结果本身没有任何影响。不会改变查询逻辑、执行计划,更不会动到结果集里的数据——变化的纯粹是语法书写方式。你不用纠结“不写会不会让数据库多查几行”,完全不会。
哪些地方能省略 AS?
在主流数据库里——包括 MySQL、PostgreSQL、SQL Server、SQLite——列别名和表别名普遍都支持省略 AS。比如这样写:
SELECT name nickname,就跟SELECT name AS nickname是一回事FROM users u,就等于FROM users AS u- 在 MySQL 里,
(SELECT id FROM logs) sub和(SELECT id FROM logs) AS sub都能正常跑
这几种情况,省略 AS 只是省了三个字符,逻辑和语义没有任何区别。
哪些地方不能省略 AS?
其实严格说,不是语法“不允许省略”,而是省略之后会直接报错——本质问题在别名缺失,不是 AS 本身不能省。具体来说:
- 子查询(派生表)必须有一个别名,但
AS本身可以省略。写成(SELECT ...) sub没问题,但如果写成(SELECT ...)不带任何别名,数据库一定告诉你语法错误。 - CTE 里的情况就不一样了:
WITH子句中AS是强制关键字。比如WITH active_users AS (SELECT ...),你要是漏了AS,直接就解析失败了。 - 视图定义也一样,
CREATE VIEW v AS SELECT ...里的AS也是必需的,不能少。
所以,真正的规则是:别名本身是否需要不是问题,但 AS 在有些地方就是语法结构的一部分,缺了它解析器就认不出来。
省略 AS 容易踩的坑
追根到底,真正让人翻车的从来不是 AS 本身,而是省略之后暴露出来的命名隐患。咱们来看几个经典场景:
- 别名里如果带了空格,比如
SELECT price "total price",表面上看是省略了AS,但在 MySQL 里那双引号默认会被当成字符串字面量处理——结果就是返回一个固定值"total price",而不是你期望的字段计算值。正确的写法应该是SELECT price AS `total price`。 - 别名撞上了保留字,比如
order、group这些。如果你写SELECT status order,数据库直接甩一个语法错误回来。这时候必须用AS加上反引号:SELECT status AS `order`。 - 团队协作的时候,风格不统一也是个问题。有人习惯写
SELECT col alias,有人写SELECT col AS alias,代码可读性会下降。Code Review 的时候,很容易漏掉引号,或者忽略保留字的冲突检查。
最容易被忽略的,其实不是“能不能省略”,而是“省略之后,那个别名还是不是一个合法的标识符”。只要别名本身合规——没有空格、没有保留字、没有特殊字符——省略 AS 就绝对安全。可一旦不合规,你补上 AS 之后还得立刻加上引号。这时候 AS 只是让引号的存在变得更显眼而已,本质问题仍然在别名本身。
所以,省略 AS 不是问题,别名合规才是真正的底线。
