SQL 别名

摘要:本教程将介绍 SQL 别名,包括表和列别名,以帮助你编写更简洁、更易于理解的查询。

使用 SQL 别名使得你可以在执行查询的时候给表或列分配一个临时名称。SQL 中有两种类型的别名:表别名和列别名。

SQL 列别名

在设计数据库表时,为了保持简洁,你可能会使用列名的缩写。例如

  • so_no 代表销售订单号。
  • qty 代表数量。

或者你可能不得不使用遗留系统,这些系统在命名列和表方面大量使用了缩写。

例如,SAP ERP 使用缩写(德语)来命名所有列和表,例如,VBELN 用于命名销售单号列。

当你使用 SQL 从这些表中查询数据时,输出并不是显而易见的。要解决此问题,你可以使用列别名,它会在执行查询时给列分配一个临时名称。

以下是用列别名的语法

column_name AS alias_nameCode language: SQL (Structured Query Language) (sql)

在此语法中,你需要在 AS 关键字后面指定列别名,然后是列名。AS 关键字是可选的。因此你可以像这样省略它

column_name alias_nameCode 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_noinv_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 > 5000Code language: SQL (Structured Query Language) (sql)

错误

Unknown column 'new_salary' in 'where clause'Code language: JavaScript (javascript)

原因是什么?

在此 SELECT 语句中,数据库按以下顺序计算子句

FROM > WHERE > SELECTCode 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 BYCode language: SQL (Structured Query Language) (sql)

数据库在 ORDER BY 子句之前计算 SELECT 子句。因此,当计算 ORDER BY 子句时,数据库具有 new_salary 别名的信息,该别名是表达式 salary * 1.1 的别名。因此,它按预期执行。

SQL 表别名

像列一样,你可以为表分配别名。这些别名称为表别名。

要为表分配别名,你需要使用以下语法

table_name AS table_aliasCode language: PHP (php)

在此语法中,AS 关键字也是可选的。因此,您可以像以下所示省略它

table_name table_aliasCode language: SQL (Structured Query Language) (sql)

请注意,为表分配别名不会永久重命名该表。它只是在查询执行期间暂时为该表提供了另一个名称。

那么,您为什么要使用表别名?

SELECT 子句中指定列名称时,您可以使用以下语法

table_name.column_nameCode language: CSS (css)

在此语法中,列具有完全限定名称,其中包括表名和列名。例如

SELECT 
    employees.first_name, 
    employees.last_name
FROM
    employees;Code language: SQL (Structured Query Language) (sql)

在此示例中,该查询从 employees 表的 first_namelast_name 列中选择数据。与典型查询不同,我们为 first_namelast_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 子句中引用它。

但为什么需要为列使用完全限定名称?

请查看来自 示例数据库 的以下 employeesdepartments

Employees & Departments Tables

employeesdepartments 表都具有具有相同名称的列:department_id

从两个表中查询数据时,您需要指定 department_id 列所属的准确表。否则,您将收到错误,因为数据库不知道它需要转到哪个表来选择数据。

如果您想从 employees 表中选择数据,则可以在 SELECT 子句中引用它,如下所示

employees.department_idCode language: SQL (Structured Query Language) (sql)

这同样适用于 departments 表的 department_id

departments.department_idCode language: SQL (Structured Query Language) (sql)

如果 edemployeesdepartments 表的表别名,则可以使用表别名按如下方式引用每个表中的 department_id

e.department_id
d.department_idCode language: SQL (Structured Query Language) (sql)

在下一个教程中,您将学习如何使用连接子句从两个表中选择数据并应用表别名。此外,您还将学习如何使用 自连接 技术在单个查询中两次引用同一表。在这种情况下,您需要使用表别名。

总结

  • SQL 具有两种类型的别名:列别名和表别名。
  • SELECT 子句之后计算的子句中引用列别名。
  • 使用表别名限定列名称。
本教程是否有帮助?