表别名与列别名是什么
别名(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;另外别名只在当前查询层有效,外层引用内层派生表的别名时必须用它,不能用原始表名。