首页/数据/数据库速查/表别名与列别名
SQL 语法52 条

表别名与列别名

用 AS 或空格给表列起短别名,让多表查询更清晰;别名还常用于自连接区分同一张表的两份引用。

数据库速查数据更新于 2026-10-13

表别名与列别名是什么

别名(Alias)是给表或列起的临时短名字,只在当前这条 SELECT 内有效,不改变真实结构。它的作用有两个:一是多表连接时写起来短、读起来清楚,二是解决歧义——自连接时同一张表出现两次,没有别名数据库无法判断是哪一份引用。派生表(FROM 里的子查询)在 MySQL 中必须带别名,否则直接报错。

基本信息

适用版本MySQL 5.7 / 8.0 全系列
语法SELECT 列 [AS] 别名 FROM 表 [AS] 别名
表别名作用域整条查询的 FROM/ON/WHERE/GROUP BY/ORDER BY 都可引用
列别名作用域GROUP BY、HAVING、ORDER BY 可用,WHERE 不可用
必须使用的场景派生表、自连接、同名列共存

典型使用场景

  • 多表连接:orders 与 users 写成 o、u,ON 条件与 SELECT 列表一眼看懂归属
  • 自连接区分同一张表的两份引用:员工表连两次得到「员工-经理」对照
  • 派生表与子查询必须起名,否则报 Every derived table must have its own alias
  • 列名冲突消歧:两张表都有 created_at 时,输出列必须显式指定来源
  • 为报表输出重命名列:SELECT COUNT(*) AS 订单数,前端直接消费

基础用法

基础用法
-- 表别名 + 列别名,AS 可以省略
SELECT o.id AS order_id, o.amount, u.name AS customer
FROM orders AS o
JOIN users AS u ON u.id = o.user_id
WHERE o.created_at >= '2026-01-01'   -- 这里的条件只能用表别名
ORDER BY order_id DESC;              -- 排序列可以用列别名

自连接中的别名

自连接中的别名
-- 同一张表两次引用,必须用两个不同的别名
SELECT e.name AS emp, m.name AS mgr
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id
WHERE e.status = 'active';   -- 只筛员工侧,别把 e 写成 m

别名在不同位置可用性

位置表别名列别名
SELECT 列表可用,用于限定列来源定义处
FROM / JOIN / ON可用不可用(此时还没算出来)
WHERE可用不可用,报 Unknown column
GROUP BY / HAVING可用MySQL 允许(标准 SQL 不允许)
ORDER BY可用可用,最常用于重命名后的排序
别名加反引号可以包含空格或关键字,但不同客户端对反引号与转义的转译规则不一致,团队规范里通常直接禁止特殊字符,只用字母数字和下划线。
别名与原表名重名会造成歧义,MySQL 会报 Column 'xxx' in field list is ambiguous;另外别名只在当前查询层有效,外层引用内层派生表的别名时必须用它,不能用原始表名。

易错点

  • 把列别名写进 WHERE:报 Unknown column,正确做法是重复写表达式或改用 HAVING
  • 自连接两个引用用了同一个别名或忘了别名:报 Not unique table/alias,语句直接不执行
  • 派生表忘记起别名:MySQL 对 FROM 子查询强制要求别名,写惯了其他数据库会连踩
  • 在子查询里用外层别名(相关子查询方向写反),得到的结果集与预期不符且不报错
  • 输出列用了重复别名,应用侧按字段名取值时拿到后一个覆盖前一个,排查成本很高

数据来源与参考

  • MySQL 8.0 Reference Manual: SELECT - Aliases

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌