摘要:本教程将介绍 SQL 别名,包括表和列别名,以帮助你编写更简洁、更易于理解的查询。
使用 SQL 别名使得你可以在执行查询的时候给表或列分配一个临时名称。SQL 中有两种类型的别名:表别名和列别名。
SQL 列别名
在设计数据库表时,为了保持简洁,你可能会使用列名的缩写。例如
so_no
代表销售订单号。qty
代表数量。
或者你可能不得不使用遗留系统,这些系统在命名列和表方面大量使用了缩写。
例如,SAP ERP 使用缩写(德语)来命名所有列和表,例如,VBELN
用于命名销售单号列。
当你使用 SQL 从这些表中查询数据时,输出并不是显而易见的。要解决此问题,你可以使用列别名,它会在执行查询时给列分配一个临时名称。
以下是用列别名的语法
column_name AS alias_name
Code language: SQL (Structured Query Language) (sql)
在此语法中,你需要在 AS
关键字后面指定列别名,然后是列名。AS
关键字是可选的。因此你可以像这样省略它
column_name alias_name
Code language: SQL (Structured Query Language) (sql)
如果别名包含空格,你需要将其放在单引号(或双引号)中,如下所示
column_name AS 'Alias Name'
Code language: SQL (Structured Query Language) (sql)
以下示例展示了如何使用列别名
SELECT
inv_no AS invoice_no,
amount,
due_date AS 'Due date',
cust_no 'Customer No'
FROM
invoices;
Code language: SQL (Structured Query Language) (sql)
此查询有多个列别名
invoice_no
是inv_no
列的列别名。'Due date'
是due_date
列的列别名。由于别名包含空格,因此你必须将其放在单引号 (') 或双引号 (") 中。'Customer no'
是cust_no
列的别名。请注意,它没有AS
关键字。
表达式的别名
如果查询包含表达式,你可以为表达式分配列别名。例如
SELECT
first_name,
last_name,
salary * 1.1 AS new_salary
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
在此示例中,数据库将使用列别名作为结果集中表达式的标题。
列别名的常见错误
由于你在 SELECT
子句中给列分配别名,因此你只能在执行 SELECT
子句后计算的子句中引用别名。
以下查询将导致错误
SELECT
first_name,
last_name,
salary * 1.1 AS new_salary
FROM
employees
WHERE new_salary > 5000
Code language: SQL (Structured Query Language) (sql)
错误
Unknown column 'new_salary' in 'where clause'
Code language: JavaScript (javascript)
原因是什么?
在此 SELECT
语句中,数据库按以下顺序计算子句
FROM > WHERE > SELECT
Code language: SQL (Structured Query Language) (sql)
数据库在 SELECT
子句之前计算 WHERE
子句。因此,当它计算 WHERE
子句时,数据库没有关于 new_salary
列别名的信息。所以它发出一个错误。
不过,以下查询可以正常运行
SELECT
first_name,
last_name,
salary * 1.1 AS new_salary
FROM
employees
ORDER BY new_salary;
Code language: SQL (Structured Query Language) (sql)
在此示例中,数据库按以下顺序计算查询的子句
FROM > SELECT > ORDER BY
Code language: SQL (Structured Query Language) (sql)
数据库在 ORDER BY
子句之前计算 SELECT
子句。因此,当计算 ORDER BY
子句时,数据库具有 new_salary
别名的信息,该别名是表达式 salary * 1.1
的别名。因此,它按预期执行。
SQL 表别名
像列一样,你可以为表分配别名。这些别名称为表别名。
要为表分配别名,你需要使用以下语法
table_name AS table_alias
Code language: PHP (php)
在此语法中,AS
关键字也是可选的。因此,您可以像以下所示省略它
table_name table_alias
Code language: SQL (Structured Query Language) (sql)
请注意,为表分配别名不会永久重命名该表。它只是在查询执行期间暂时为该表提供了另一个名称。
那么,您为什么要使用表别名?
在 SELECT
子句中指定列名称时,您可以使用以下语法
table_name.column_name
Code language: CSS (css)
在此语法中,列具有完全限定名称,其中包括表名和列名。例如
SELECT
employees.first_name,
employees.last_name
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
在此示例中,该查询从 employees
表的 first_name
和 last_name
列中选择数据。与典型查询不同,我们为 first_name
和 last_name
列指定了完全限定名称。
在 SELECT
子句中,您可以使用 employees
表的表别名,而不是使用 employees
表名称。例如
SELECT
e.first_name,
e.last_name
FROM
employees AS e;
Code language: SQL (Structured Query Language) (sql)
在此示例中,我们在 FROM
子句中为 employees
分配表别名 e
,并在 SELECT
子句中引用它。
但为什么需要为列使用完全限定名称?
请查看来自 示例数据库 的以下 employees
和 departments
表

employees
和 departments
表都具有具有相同名称的列:department_id
。
从两个表中查询数据时,您需要指定 department_id
列所属的准确表。否则,您将收到错误,因为数据库不知道它需要转到哪个表来选择数据。
如果您想从 employees
表中选择数据,则可以在 SELECT
子句中引用它,如下所示
employees.department_id
Code language: SQL (Structured Query Language) (sql)
这同样适用于 departments
表的 department_id
departments.department_id
Code language: SQL (Structured Query Language) (sql)
如果 e
和 d
是 employees
和 departments
表的表别名,则可以使用表别名按如下方式引用每个表中的 department_id
列
e.department_id
d.department_id
Code language: SQL (Structured Query Language) (sql)
在下一个教程中,您将学习如何使用连接子句从两个表中选择数据并应用表别名。此外,您还将学习如何使用 自连接 技术在单个查询中两次引用同一表。在这种情况下,您需要使用表别名。
总结
- SQL 具有两种类型的别名:列别名和表别名。
- 在
SELECT
子句之后计算的子句中引用列别名。 - 使用表别名限定列名称。