SQL 別名

摘要:在本教程中,您將學習 SQL 別名,包括表別名和列別名,以使您的查詢更短、更易於理解。

SQL 別名允許您在執行查詢期間為表或列分配一個臨時名稱。SQL 有兩種型別的別名:表別名和列別名。

SQL 列別名 #

在設計資料庫表時,您可能會使用列名的縮寫來保持其簡短。例如:

  • so_no 代表銷售訂單號(sales order number)。
  • qty 代表數量(quantity)。

或者,您可能需要處理一些舊系統,這些系統大量使用縮寫來命名列和表。

例如,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)

如果 ed 分別是 employeesdepartments 表的別名,您可以使用表別名來引用每個表中的 department_id 列,如下所示:

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

在下一篇教程中,您將學習如何使用 join 子句從兩個表中選擇資料,並應用表別名。此外,您還將學習如何使用自連線技術在單個查詢中兩次引用同一個表。在這種情況下,您需要使用表別名。

摘要 #

  • SQL 有兩種型別的別名:列別名和表別名。
  • SELECT 子句之後被求值的子句中引用列別名。
  • 使用表別名來限定列名。

資料庫 #

測驗 #

本教程是否有幫助?
© .