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_en
和imooc_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_en
和imooc_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 有些資料庫是不支援使用別名的。