Skip to content

MySQL - 别名

在 SQL 中,别名(Alias)是查询中赋予表或列的临时替代名称。使用别名可以使列名更具可读性,并简化查询,尤其是在处理 JOIN 操作或复杂表达式时。

别名使用 AS 关键字来分配。虽然在 MySQL 中 AS 关键字在技术上是可选的,但使用它是强烈推荐的最佳实践,因为它能使查询的意图更加清晰。

列别名经常用于为结果集中的列提供更具描述性的名称,或者命名从表达式或聚合函数派生的列。

SELECT column_name AS alias_name
FROM table_name;
-- 或使用表达式
SELECT expression AS alias_name
FROM table_name;

让我们使用前面示例中的 customers 表。

SELECT * FROM customers LIMIT 3;
id姓名年龄地址薪资
1Ramesh32Ahmedabad2000.00
2Khilan25Delhi1500.00
3Kaushik23Kota2000.00

在此查询中,我们重命名了输出中的 id 和 name 列。

SELECT id AS customer_id, name AS customer_name
FROM customers;

结果集将包含 customer_id 和 customer_name 作为表头。

一个非常常见的用例是为聚合函数(如 COUNT()、SUM() 或 AVG())的结果命名。

SELECT COUNT(id) AS total_customers, AVG(salary) AS average_salary
FROM customers;

这会产生一个清晰、可读的结果:

total_customersaverage_salary
75000.00

您可以从现有数据创建新的虚拟列并为其指定别名。

SELECT id, CONCAT(name, ' from ', address) AS location_info
FROM customers;
id位置信息
1Ramesh from Ahmedabad
2Khilan from Delhi
等等…

表别名对于编写简洁易读的 JOIN 查询至关重要。在执行自连接(Self-Join)时,它们是强制性的。

现代的、显式的 JOIN 语法比旧的基于逗号的语法更受青睐,因为它能清楚地将连接条件与筛选条件(WHERE 子句)分开。

SELECT t1.column, t2.column
FROM table1 AS t1
JOIN table2 AS t2 ON t1.common_column = t2.common_column;

让我们创建一个 orders 表,并将其与 customers 表连接,以找出谁订购了什么。

CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
amount DECIMAL(10, 2)
);
INSERT INTO orders VALUES
(101, 3, '2023-10-08', 3000.00),
(102, 2, '2023-11-20', 1560.00),
(103, 3, '2023-10-08', 1500.00),
(104, 4, '2023-05-20', 2060.00);

现在,让我们使用简短清晰的别名(c 代表 customers,o 代表 orders)来连接它们。

SELECT c.name, c.address, o.order_date, o.amount
FROM customers AS c
JOIN orders AS o ON c.id = o.customer_id
ORDER BY c.name;

这将产生以下结果:

姓名地址order_dateamount
ChaitaliMumbai2023-05-202060.00
KaushikKota2023-10-083000.00
KaushikKota2023-10-081500.00
KhilanDelhi2023-11-201560.00

自连接是当您将一个表与自身连接时。在这种情况下,表别名不仅有帮助,而且是必需的,以区分同一表的两个实例。

一个经典的例子是 employees 表,其中 manager_id 列引用同一表中另一个员工的 id。我们可以使用自连接来列出每个员工及其经理的姓名。

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', NULL), -- CEO 没有经理
(2, 'Bob', 1),
(3, 'Charlie', 1),
(4, 'David', 2);

在这里,我们将 employees 表与自身连接,将一个实例别名为 e(代表员工),另一个别名为 m(代表经理)。使用 LEFT JOIN 是为了包含没有经理的 CEO。

SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees AS e
LEFT JOIN employees AS m ON e.manager_id = m.id;

上述查询的输出如下:

employee_namemanager_name
Alice
BobAlice
CharlieAlice
DavidBob