摘要:在本教程中,您将学习如何使用MySQL 别名来提高查询的可读性。
MySQL支持两种别名:列别名和表别名。
MySQL 列的别名
有时,列名的技术性很强,使得查询的输出非常难以理解。要为列指定描述性名称,可以使用列别名。
以下语句说明了如何使用列别名:
SELECT
[column_1 | expression] AS descriptive_name
FROM table_name;
Code language: SQL (Structured Query Language) (sql)
要为列分配别名,请使用AS
关键字,后跟别名。如果别名包含空格,则必须将其引用如下:
SELECT
[column_1 | expression] AS `descriptive name`
FROM
table_name;
Code language: SQL (Structured Query Language) (sql)
由于AS
关键字是可选的,因此您可以在语句中省略它。请注意,您还可以为表达式指定别名。
让我们看一下示例数据库中的employees
表。

以下查询选择员工的名字和姓氏。它使用CONCAT_WS()
函数将名字和姓氏连接成全名。
SELECT
CONCAT_WS(', ', lastName, firstname)
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

栏目标题很难读。要解决此问题,您可以为输出的列标题分配列别名,如以下查询所示:
SELECT
CONCAT_WS(', ', lastName, firstname) AS `Full name`
FROM
employees;
Code language: SQL (Structured Query Language) (sql)

在 MySQL 中,您可以在ORDER BY
、 GROUP BY
和HAVING
子句中使用列别名来引用列。
以下查询使用ORDER BY
子句中的列别名按字母顺序对员工的全名进行排序:
SELECT
CONCAT_WS(', ', lastName, firstname) `Full name`
FROM
employees
ORDER BY
`Full name`;
Code language: SQL (Structured Query Language) (sql)

以下语句选择总金额大于 60000 的订单。它在GROUP BY
和HAVING
子句中使用列别名。
SELECT
orderNumber `Order no.`,
SUM(priceEach * quantityOrdered) total
FROM
orderDetails
GROUP BY
`Order no.`
HAVING
total > 60000;
Code language: SQL (Structured Query Language) (sql)

请注意,不能在WHERE
子句中使用列别名。原因是当 MySQL 计算WHERE
子句时, SELECT
子句中指定的列的值尚未计算。
MySQL 表的别名
您可以使用别名为表指定不同的名称。您可以使用AS
关键字为表分配别名,语法如下:
table_name AS table_alias
Code language: SQL (Structured Query Language) (sql)
表的别名称为表别名。与列别名一样, AS
关键字是可选的,因此您可以省略它。
此查询显示如何将employees
表别名指定为 e:
SELECT * FROM employees e;
Code language: SQL (Structured Query Language) (sql)
一旦为表分配了别名,您就可以使用以下语法引用表列:
table_alias.column_name
Code language: SQL (Structured Query Language) (sql)
例如:
SELECT
e.firstName,
e.lastName
FROM
employees e
ORDER BY e.firstName;
Code language: SQL (Structured Query Language) (sql)
表别名通常用在包含INNER JOIN
、 LEFT JOIN
、 RIGHT JOIN
子句的语句以及子查询中。
让我们看一下customers
和orders
表:

两个表具有相同的列名: customerNumber
如果不使用表别名来限定customerNumber
列,您将收到如下错误消息:
Error Code: 1052. Column 'customerNumber' in on clause is ambiguous
Code language: SQL (Structured Query Language) (sql)
为了避免此错误,您可以使用表别名来限定customerNumber
列:
SELECT
customerName,
COUNT(o.orderNumber) total
FROM
customers c
INNER JOIN orders o ON c.customerNumber = o.customerNumber
GROUP BY
customerName
ORDER BY
total DESC;
Code language: SQL (Structured Query Language) (sql)

上面的查询从customers
和orders
表中选择客户名称和订单数量。它使用c
作为customers
表的表别名,使用o
作为orders
表的表别名。 customers
和orders
表中的列通过表别名进行引用。
如果在上面的查询中不使用别名,则必须使用表名来引用其列,这会使查询变得冗长且可读性较差,如下所示:
SELECT
customers.customerName,
COUNT(orders.orderNumber) total
FROM
customers
INNER JOIN orders ON customers.customerNumber = orders.customerNumber
GROUP BY
customerName
ORDER BY
total DESC
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何使用 MySQL 别名,包括列别名和表别名。