ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
本节将学习如何使用集合运算符(包括:`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 "排序")