MySQL 别名
在本文中,我们讨论了 MySQL 中的列别名,表别名和派生表别名,以及使用别名来简化 SQL 和提高 SQL 的可读性。
如果在一个 SQL 中涉及到多个表,我们需要使用 table_name.column_name
这样的方式来引用每个表的字段,这有时候会让 SQL 变的臃肿和难以阅读。而使用别名,则可以简化 SQL 和提高 SQL 的可读性。
在 MySQL 中,我们可以使用的别名包括: 列别名,表别名和派生表别名。
列别名
很多时候,一个表的列名的可读性并不好而且难理解。而使用列别名,则可以自定义输出列的名称。
列别名语法
以下展示了列别名的使用方法:
SELECT column_name AS `alias`
FROM table_name;
列别名使用说明:
AS
关键字后面跟的是列的别名alias
- 当别名
alias
中包含空格时,必须使用`
将别名引起来,即`alias`
。 AS
关键字是可选的。- 除了为字段指定别名,还可以为表达式指定别名。例如:
SELECT NOW() `Current Time` FROM dual
列别名实例
在以下实例中,我们使用 Sakila 示例数据库中的 actor
表进行演示。
-
未指定别名查询数据
SELECT first_name, last_name, CONCAT(first_name, ', ', last_name) FROM actor LIMIT 5;
+------------+--------------+-------------------------------------+ | first_name | last_name | CONCAT(first_name, ', ', last_name) | +------------+--------------+-------------------------------------+ | PENELOPE | GUINESS | PENELOPE, GUINESS | | NICK | WAHLBERG | NICK, WAHLBERG | | ED | CHASE | ED, CHASE | | JENNIFER | DAVIS | JENNIFER, DAVIS | | JOHNNY | LOLLOBRIGIDA | JOHNNY, LOLLOBRIGIDA | +------------+--------------+-------------------------------------+ 5 rows in set (0.00 sec)
这样的列名可读性很差并很难理解。
-
指定别名查询数据
SELECT first_name `First Name`, last_name `Last Name`, CONCAT(first_name, ', ', last_name) `Full Name` FROM actor LIMIT 5;
+------------+--------------+----------------------+ | First Name | Last Name | Full Name | +------------+--------------+----------------------+ | PENELOPE | GUINESS | PENELOPE, GUINESS | | NICK | WAHLBERG | NICK, WAHLBERG | | ED | CHASE | ED, CHASE | | JENNIFER | DAVIS | JENNIFER, DAVIS | | JOHNNY | LOLLOBRIGIDA | JOHNNY, LOLLOBRIGIDA | +------------+--------------+----------------------+ 5 rows in set (0.00 sec)
在本例中,我们为以下列指定了别名:
- 指定
first_name
列的别名为First Name
。 - 指定
last_name
列的别名为Last Name
。 - 指定
CONCAT(first_name, ', ', last_name)
表达式的别名为Full Name
。
- 指定
从输出的结果来看,指定别名后,输出数据的可读性更高。因为大多数人不懂 CONCAT(first_name, ', ', last_name)
的具体含义。
表别名
除了为列指定别名,我们还可以为表指定别名,如下:
table_name AS alias
其中 AS
关键字是可选的,因此您可以省略它。
当 SQL 语句中涉及到多个表时,使用表别名相当重要。特别是当多个表含有相同的字段名时。不指定表别名时,为了区分来自不同表的同名字段,只能通过 table_name.column_name
这样的方式来引用每个表的字段。当指定了别名时,则可以通过 alias.column_name
引用字段。
我们来看一个来自 MySQL EXIST
章节的一个例子:
SELECT *
FROM language
WHERE EXISTS(
SELECT *
FROM film
WHERE film.language_id = language.language_id
);
上面的例子中,没有使用表别名,我们使用 film.language_id
和 language.language_id
分别引用 film
和 language
的 language_id
字段。
现在我们使用别名改造这个 SQL,如下:
SELECT *
FROM language l
WHERE EXISTS(
SELECT *
FROM film f
WHERE f.language_id = l.language_id
);
派生表别名
派生表是一个由表达式生成的表,使用派生表就像使用表一样。常见的派生表由子查询产生。例如以下语句:
SELECT
AVG(t.customer_total) customer_avg
FROM
(SELECT
customer_id, SUM(amount) customer_total
FROM
payment
GROUP BY customer_id
HAVING customer_total > 180) t;
+--------------+
| customer_avg |
+--------------+
| 201.585000 |
+--------------+
1 row in set (0.02 sec)
在本例中,我们为派生表:
(SELECT
customer_id, SUM(amount) customer_total
FROM
payment
GROUP BY customer_id
HAVING customer_total > 180)
指定了别名 t
。
使用派生表必须指定别名。因为,FROM
子句中的所有表都必须有一个名字。
结论
在本文中,我们讨论了 MySQL 中的列别名,表别名和派生表别名,以及使用别名来简化 SQL 和提高 SQL 的可读性。以下是本章节的要点:
- 可以通过
AS
关键字指定别名,但是AS
关键字是可选的。 - 当别名中包含空格时,必须使用
`
将别名引起来。 - 除了为字段指定别名,表达式也可以指定别名。
- 当 SQL 中涉及多个表时,使用表别名很重要。
- 派生表必须指定别名。