SQL Union & As
1. 定義
慕課解釋:
Union
操作符用于合并兩個或多個Select查詢的結(jié)果集;As
操作符可以給字段或數(shù)據(jù)表指定別名
。
2. 前言
本小節(jié)中,我們將介紹SQL Union
和 SQL As
。
在實際數(shù)據(jù)存儲應(yīng)用中,可能會對某類數(shù)據(jù)進行分表存儲。如:imooc_user 表可能會被拆分成 imooc_user_en 和 imooc_user_zh 兩張表,但二者的結(jié)構(gòu)和字段一致,Union 可以方便在查詢的時候可以直接獲取這兩張表的數(shù)據(jù)。
在書寫 SQL 時,有些字段名,如 username ,表意不夠明確,我們可以通過 As 給該字段取上一個別名 imooc_username,這樣就給SQL閱讀和維護提供了便利。
注意: Union 合并的結(jié)果集,必須擁有相同字段個數(shù),且合并的字段類型必須兼容,如字符類型和整型是不能兼容的。
本小節(jié)測試數(shù)據(jù)如下,請先在數(shù)據(jù)庫中執(zhí)行:
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 查詢的多個結(jié)果集,使用語法如下:
SELECT [col] FROM [table_name1]
UNION
SELECT [col] FROM [table_name2]
其中table_name
代表數(shù)據(jù)表名稱,col
表示字段名稱,數(shù)字 1,2 表示多張表。
3.1 例1 單獨使用 Union
單獨使用 Union 時會默認(rèn)篩選掉結(jié)果集中相同的數(shù)據(jù)。
請書寫 SQL 語句,查詢得到imooc_user_en
和imooc_user_zh
中的所有用戶。
分析:
按照語法使用 Union 即可。
語句:
SELECT username, age FROM imooc_user_en
UNION
SELECT username, age FROM imooc_user_zh;
查詢結(jié)果如下:
+----------+-----+
| username | age |
+----------+-----+
| peter | 18 |
| lucy | 29 |
| pedro | 23 |
+----------+-----+
imooc_user_en 和 imooc_user_zh 表中存在同名且同齡的用戶peter
,Union 在合并兩個結(jié)果集時,默認(rèn)地去掉了重復(fù)值。可有時,我們需要保留重復(fù)的記錄,這時就需要使用 Union All。
3.2 例2 使用 Union All
使用 Union All 會保留結(jié)果集中的所有數(shù)據(jù)。
請書寫 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;
查詢結(jié)果如下:
+----------+-----+
| username | age |
+----------+-----+
| peter | 18 |
| lucy | 29 |
| pedro | 23 |
| peter | 18 |
+----------+-----+
提示: Union 在合并字段時由于會篩選掉重復(fù)記錄,這個過程是較為耗時的,如果非必需情況,請使用 Union All。
4. SQL As
SQL As 主要用于給數(shù)據(jù)表或字段給定別名(Alias)
。
使用語法如下:
SELECT [col] AS [alias1] FROM [table_name] AS [alias2]
其中col
表示字段名稱,table_name
表示表名稱,alias
表示別名,數(shù)字1、2代表多個別名。
4.1 例3 As 作用于表名稱
使用 As 可以為數(shù)據(jù)表指定一個別名。
請書寫 SQL 語句,返回imooc_user_zh
中的所有用戶,并且語句中指定imooc_user_zh
的別名為imooc_user
。
分析:
按照語法使用 As 即可。
語句:
SELECT username, age FROM imooc_user_zh AS imooc_user;
查詢結(jié)果如下:
+----------+-----+
| 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. 小結(jié)
- Union 的使用場景其實不多,但語法簡單,在數(shù)據(jù)聚合相關(guān)的場景中十分有用。
- As 可以給數(shù)據(jù)表和字段指定別名,但其實不使用 As 也是可以指定別名的,但閱讀性相對差了一些。
別名
的使用其實很頻繁,不僅可以提高性能,而且可以提高 SQL 語句的閱讀性。- As 指定別名不僅可以用在 Select 查詢,也可以用在 Update,對于 Delete 有些數(shù)據(jù)庫是不支持使用別名的。