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_idlanguage.language_id 分别引用 filmlanguagelanguage_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 中涉及多个表时,使用表别名很重要。
  • 派生表必须指定别名。