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