SQL 别名:使用 AS 重命名列
第 2.5 课 · 阅读时间:约 5 分钟 · 练习题 ↓
SQL 列别名是使用 AS 关键字为查询结果中的列指定的临时名称。在本课中,你将学习别名的语法、如何编写带空格的别名、为什么计算列需要别名,以及别名可以在查询的哪些部分使用。
在前面的课程中,你按照列在表中的原始名称来选择列。列名通常比较技术化,例如 rental_rate 或 replacement_cost,而像 length / 60 这样的计算值根本没有合适的名称。别名可以让你控制结果的列标题。
什么是列别名?
列别名为 SELECT 查询结果中的列指定一个临时名称。它不会修改表中的列:别名只存在于本次查询的输出中。
基本语法
SELECT column_name AS alias_name
FROM table_name;
AS 关键字是可选的,所以 SELECT column_name alias_name 也可以运行。显式写出 AS 能让查询更易读,因为别名看起来不会像第二个列。
重命名列
SELECT title AS film_title,
rental_rate AS price
FROM film;
结果:所有电影,两列名称为 film_title 和 price,而不是 title 和 rental_rate。
带空格的别名
如果别名包含空格或特殊字符,请用双引号将其括起来:
SELECT first_name AS "Given Name",
last_name AS "Surname"
FROM actor;
结果:演员列表,列标题为“Given Name”和“Surname”。
双引号是 SQL 标准。MySQL 和 MariaDB 也接受反引号(`Given Name`),SQL Server 接受方括号([Given Name])。实际工作中,不带空格的短名称(例如 given_name)在查询的后续部分更方便使用。
计算列的别名
当一列由表达式计算得出时,数据库会用表达式的文本生成列标题,例如 length / 60。别名可以为它提供一个合适的名称:
SELECT title,
length AS length_minutes,
length / 60 AS length_hours,
rental_rate * rental_duration AS full_rental_cost
FROM film;
结果:每部电影的时长(分钟和小时),以及整个租期的租赁费用。
计算列是使用别名最常见的原因:没有别名,结果难以阅读,而按列名读取结果的应用程序也找不到对应的值。
别名可以在哪里使用
别名是在 SELECT 列表中创建的,因此只能在 SELECT 之后处理的查询部分中使用:
| 子句 | 能否使用列别名? |
|---|---|
ORDER BY | 可以,所有主流数据库都支持 |
WHERE | 不可以:WHERE 在 SELECT 之前处理 |
GROUP BY、HAVING | 取决于数据库(MySQL 和 PostgreSQL 允许在 GROUP BY 中使用) |
SELECT title, rental_rate * rental_duration AS full_rental_cost
FROM film
ORDER BY full_rental_cost DESC;
结果:电影按完整租期费用从高到低排序。
如果查询需要在多种数据库中运行,请在 WHERE、GROUP BY 和 HAVING 中重复写出表达式,而不是使用别名。关于处理顺序的更多内容见第 2.7 课。
要点:
- 列别名是查询结果中列的临时名称;表本身不会改变。
- 使用
AS编写别名:SELECT title AS film_title。关键字是可选的,但能提高可读性。 - 带空格的别名请用双引号括起来:
AS "Given Name"。 - 为每个计算列指定别名。
- 别名可以在
ORDER BY中使用,但不能在WHERE中使用。
常见问题
SQL 中的别名必须使用 AS 关键字吗?
不必须。SELECT title film_title 与 SELECT title AS film_title 的效果相同。建议使用 AS,因为它能清楚地表明列在哪里结束、别名从哪里开始。
为什么不能在 WHERE 中使用列别名?
WHERE 在 SELECT 之前处理,因此在过滤行时别名还不存在。请在 WHERE 中重复写出表达式,或者在 SELECT 之后处理的 ORDER BY 中使用别名。
别名会重命名表中的列吗?
不会。别名只影响当前查询的结果。要重命名表本身的列,请使用 ALTER TABLE ... RENAME COLUMN。