1. 程式人生 > SQL入門教學 >17 SQL Union & As

17 SQL Union & As

1. 定義

解釋:Union操作符用於合併兩個或多個Select查詢的結果集;As操作符可以給欄位或資料表指定別名

2. 前言

本小節中,我們將介紹SQL Union和 SQL As

在實際資料儲存應用中,可能會對某類資料進行分表儲存。如:imooc_user 表可能會被拆分成 imooc_user_en 和 imooc_user_zh 兩張表,但二者的結構和欄位一致,Union 可以方便在查詢的時候可以直接獲取這兩張表的資料。

在書寫 SQL 時,有些欄位名,如 username ,表意不夠明確,我們可以通過 As 給該欄位取上一個別名 imooc_username,這樣就給SQL閱讀和維護提供了便利。

注意: Union 合併的結果集,必須擁有相同欄位個數,且合併的欄位型別必須相容,如字元型別和整型是不能相容的。

本小節測試資料如下,請先在資料庫中執行:

DROP TABLE IF EXISTS imooc_user_en;
CREATE TABLE imooc_user_en
(
  username varchar(20),
  age int
);
INSERT INTO imooc_user_en(username,age) VALUES ('peter', 18), ('lucy', 29);

DROP TABLE IF EXISTS imooc_user_zh;
CREATE
TABLE imooc_user_zh ( username varchar(20), age int ); INSERT INTO imooc_user_zh(username,age) VALUES ('pedro', 23), ('peter', 18);

3. SQL Union

SQL Union 用於合併 Select 查詢的多個結果集,使用語法如下:

SELECT [col] FROM [table_name1]
UNION
SELECT [col] FROM [table_name2]

其中table_name代表資料表名稱,col表示欄位名稱,數字 1,2 表示多張表。

3.1 例1 單獨使用 Union

單獨使用 Union 時會預設篩選掉結果集中相同的資料。

請書寫 SQL 語句,查詢得到imooc_user_enimooc_user_zh中的所有使用者。

分析:

按照語法使用 Union 即可。

語句:

SELECT username, age FROM imooc_user_en
UNION
SELECT username, age FROM imooc_user_zh;

查詢結果如下:

+----------+-----+
| username | age |
+----------+-----+
| peter    | 18  |
| lucy     | 29  |
| pedro    | 23  |
+----------+-----+

imooc_user_en 和 imooc_user_zh 表中存在同名且同齡的使用者peter,Union 在合併兩個結果集時,預設地去掉了重複值。可有時,我們需要保留重複的記錄,這時就需要使用 Union All。

3.2 例2 使用 Union All

使用 Union All 會保留結果集中的所有資料。

請書寫 SQL 語句,返回imooc_user_enimooc_user_zh中的所有使用者。

分析:

按照語法使用 Union All 即可。

語句:

SELECT username, age FROM imooc_user_en
UNION ALL
SELECT username, age FROM imooc_user_zh;

查詢結果如下:

+----------+-----+
| username | age |
+----------+-----+
| peter    | 18  |
| lucy     | 29  |
| pedro    | 23  |
| peter    | 18  |
+----------+-----+

提示: Union 在合併欄位時由於會篩選掉重複記錄,這個過程是較為耗時的,如果非必需情況,請使用 Union All。

4. SQL As

SQL As 主要用於給資料表或欄位給定別名(Alias)

使用語法如下:

SELECT [col] AS [alias1] FROM [table_name] AS [alias2]

其中col表示欄位名稱,table_name表示表名稱,alias表示別名,數字1、2代表多個別名。

4.1 例3 As 作用於表名稱

使用 As 可以為資料表指定一個別名。

請書寫 SQL 語句,返回imooc_user_zh中的所有使用者,並且語句中指定imooc_user_zh的別名為imooc_user

分析:

按照語法使用 As 即可。

語句:

SELECT username, age FROM imooc_user_zh AS imooc_user;

查詢結果如下:

+----------+-----+
| username | age |
+----------+-----+
| pedro    | 23  |
| peter    | 18  |
+----------+-----+

4.2 例4 As 作用於欄位名稱

使用 As 還可以為欄位指定一個別名。

請書寫 SQL 語句,返回imooc_user_zh中的所有使用者,並且語句中指定username的別名為imooc_user_name

分析:

按照語法使用 As 即可。

語句:

SELECT username AS imooc_user_name, age FROM imooc_user_zh;
+-----------------+-----+
| imooc_user_name | age |
+-----------------+-----+
| pedro           | 23  |
| peter           | 18  |
+-----------------+-----+

5. 小結

  • Union 的使用場景其實不多,但語法簡單,在資料聚合相關的場景中十分有用。
  • As 可以給資料表和欄位指定別名,但其實不使用 As 也是可以指定別名的,但閱讀性相對差了一些。
  • 別名的使用其實很頻繁,不僅可以提高效能,而且可以提高 SQL 語句的閱讀性。
  • As 指定別名不僅可以用在 Select 查詢,也可以用在 Update,對於 Delete 有些資料庫是不支援使用別名的。