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 (NULL, 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 (NULL, 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 有些数据库是不支持使用别名的。