摘要:在本教程中,您將學習 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_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 > 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_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_idCode language: SQL (Structured Query Language) (sql)departments 表的 department_id 也同樣適用:
departments.department_idCode language: SQL (Structured Query Language) (sql)如果 e 和 d 分別是 employees 和 departments 表的別名,您可以使用表別名來引用每個表中的 department_id 列,如下所示:
e.department_id
d.department_idCode language: SQL (Structured Query Language) (sql)在下一篇教程中,您將學習如何使用 join 子句從兩個表中選擇資料,並應用表別名。此外,您還將學習如何使用自連線技術在單個查詢中兩次引用同一個表。在這種情況下,您需要使用表別名。
摘要 #
- SQL 有兩種型別的別名:列別名和表別名。
- 在
SELECT子句之後被求值的子句中引用列別名。 - 使用表別名來限定列名。