讲解

别名给列或表起一个临时名字,只在当前查询里生效。列别名最常见的用途是让结果更好读:SELECT price * 0.8 AS sale_price FROM courses,结果列就叫 sale_price 而不是 price * 0.8。写报表、对接程序时,给表达式和聚合结果起别名几乎是必须的,AS price * 0.8 这种原始表达式名在代码里取起来很麻烦。

表别名在多表连接和自我连接里不可或缺:FROM students s JOIN orders o ON s.id = o.student_id,用 s、o 这种短别名代替反复出现的表名,查询紧凑很多。别名里如果包含空格或中文,要用双引号(标准)或反引号(MySQL)包起来,比如 AS "订单总额";不过跨数据库一致性考虑,更推荐只用字母数字下划线的别名。

AS 关键字在大多数数据库里可以省略,写 SELECT name 姓名 也能工作,但建议显式写 AS——可读性更好,也避免「列名后面跟个词到底是别名还是语法错误」的困惑。表别名在标准 SQL 里同样可以省 AS,但 MySQL 不允许表别名用 AS 之外的某些形式……各库细节不一,统一写上 AS(列)或直接空格(表)是常见团队约定,本教程列别名一律写 AS。

示例

给计算列起别名,结果一目了然:

SELECT title AS course_name, price AS original_price, price * 0.8 AS sale_price FROM courses;

聚合结果起别名:

SELECT COUNT(*) AS order_count, SUM(amount) AS total_amount FROM orders WHERE status = 'paid';

表别名让连接查询更紧凑(下一章正式讲 JOIN,这里先感受别名的作用):

SELECT s.name, o.amount, o.status FROM students AS s JOIN orders AS o ON s.id = o.student_id WHERE s.city = '北京';

常见坑

  • 在 WHERE 里引用列别名:SELECT price * 0.8 AS sale_price FROM courses WHERE sale_price > 50 会报错——逻辑执行顺序上 WHERE 先于 SELECT,别名此刻还不存在。ORDER BY 和 GROUP BY(多数数据库)里可以用别名,WHERE 和 HAVING(部分数据库支持)里不行。
  • 别名与列名冲突:给表达式起名 price 而表里本来就有 price 列,后续引用时会歧义。别名要起能区分来源的名字。
  • 依赖可省略的 AS:SELECT name age FROM students 这种写法一旦列名后面少写了逗号(SELECT name age, city),age 就被当成别名悄悄吞掉一列。显式写 AS 能避免这类事故。
  • 用关键字当别名:AS order、AS select 这类保留字别名在不少数据库里直接报错或行为怪异,避开保留字。

小结

AS 给列和表起别名:列别名让表达式结果可读,表别名让多表查询紧凑;WHERE 里不能用列别名。下一节进入数据分析的核心:聚合函数。