本节将学习如何使用集合运算符(包括:`union`,`intersect`和`except`)来组合输入查询中的多个结果集
![](https://img.kancloud.cn/87/45/8745c64a2c5e7014e1ff9858c84fbae4_841x441.png)
这几个集合操作符的详细说明和用法,可通过以下链接学习:
>[danger] ## UNION - 将两个或多个查询的结果集合并到一个结果集中。
## SQL Server UNION简介
SQL Server `UNION`是一组集合操作,用于将两个SELECT语句的结果组合到一个结果集中,该结果集包括属于`union`中`SELECT`语句的所有行。
以下是SQL Server `UNION`的语法:
~~~sql
query_1
UNION
query_2
~~~
以下是上述语法中的查询要求:
* 两个查询中列的数量和顺序必须相同。
* 相应列的数据类型必须相同或兼容。
下面图中说明了`T1`表的结果集如何与`T2`表的结果集联合:
![联合](https://www.yiibai.com/uploads/article/2019/02/22/090006_96847.png "联合")
**UNION 与 UNION ALL**
默认情况下,`UNION`运算符从结果集中删除所有重复的行。 但是,如果要保留重复的行,则需要明确指定`ALL`关键字,如下所示:
~~~sql
query_1
UNION ALL
query_2
~~~
换句话说,`UNION`运算符删除重复行,而`UNION ALL`运算符在最终结果集中包含重复行。
**UNION 与 JOIN**
INNER JOIN或LEFT JOIN等连接组合了两个表中的列,而`UNION`组合了两个查询中的行。
换句话说,`join`会水平附加结果集,而`union`会垂直附加结果集。
下图说明了`UNION`和`JOIN`之间的主要区别:
![UNION与JOIN主要区别](https://www.yiibai.com/uploads/article/2019/02/22/090518_14278.png)
## SQL Server UNION示例
请参阅[示例数据库](https://www.yiibai.com/sqlserver/sql-server-sample-database.html "示例数据库")中的`staff`和`customers`表,它们的结构和关系如下所示:
![表结构](https://www.yiibai.com/uploads/article/2019/02/22/090633_23238.png "表结构")
#### 1\. UNION和UNION ALL示例
以下示例将员工和客户的名称合并到一个列表中:
~~~sql
SELECT
first_name,
last_name
FROM
sales.staffs
UNION
SELECT
first_name,
last_name
FROM
sales.customers;
~~~
执行上面查询语句,得到以下结果:
![](https://www.yiibai.com/uploads/article/2019/02/22/090820_49570.png)
如上图中,它返回了`1454`行。
`staffs`表有`10`行,`customers`表有`1445`行,如以下查询说明所示:
~~~sql
SELECT
COUNT (*)
FROM
sales.staffs;
-- 10
SELECT
COUNT (*)
FROM
sales.customers;
-- 1454
~~~
因为`union`的结果集只返回`1454`行,这意味着删除了一个重复行。要包含重复行,请使用`UNION ALL`,如以下查询中所示:
~~~sql
SELECT
first_name,
last_name
FROM
sales.staffs
UNION ALL
SELECT
first_name,
last_name
FROM
sales.customers;
~~~
执行上面查询语句,得到以下结果:
![UNION ALL](https://www.yiibai.com/uploads/article/2019/02/22/091155_34906.png)
查询按预期返回`1455`行。
#### 2\. UNION和ORDER BY示例
要对`UNION`运算符返回的结果集进行排序,请将`ORDER BY`子句放在最后一个查询中,如下所示:
~~~sql
SELECT
select_list
FROM
table_1
UNION
SELECT
select_list
FROM
table_2
ORDER BY
order_list;
~~~
例如,要对客户和员工的名字(`first_name`)和姓氏(`last_name`)进行排序,请使用以下查询语句:
~~~sql
SELECT
first_name,
last_name
FROM
sales.staffs
UNION ALL
SELECT
first_name,
last_name
FROM
sales.customers
ORDER BY
first_name,
last_name;
~~~
执行上面查询语句,得到以下结果:
![排序](https://www.yiibai.com/uploads/article/2019/02/22/091448_65576.png "排序")
- 第三章-数据库
- 3.1 SQL Server简介及安装
- 3.2 SQL Server示例数据库
- 3.3 SQL Server 加载示例
- 3.3 SQL Server 中的数据类型
- 3.4 SQL Server 数据定义语言DDL
- 3.5 SQL Server 修改数据
- 3.6 SQL Server 查询数据
- 3.7 SQL Server 连表
- 3.8 SQL Server 数据分组
- 3.9 SQL Server 子查询
- 3.10.1 SQL Server 集合操作符
- 3.10.2 SQL Server聚合函数
- 3.10.3 SQL Server 日期函数
- 3.10.4 SQL Server 字符串函数