关注公众号:SQL数据库开发,了解更多SQL高级知识

集合的定义

集合是由一个和多个元素构成的整体,在SQL Server中的表就代表着事实集合,而其中的查询就是在集合的基础上生成的结果集。SQL Server的集合包括交集(INTERSECT),并集(UNION),差集(EXCEPT)。

交集INTERSECT

可以对两个或多个结果集进行连接,形成“交集”。返回左边结果集和右边结果集中都有的记录,且结果不重复(这也是集合的主要特性)

交集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

交集示例

我们用以下两个表中的数据作为示例

取以上两个表的交集,我们可以这样写SQL

SELECT * FROM  City1
INTERSECT
SELECT * FROM  City2

结果如下:

其中北京和上海是上面两个表共有的结果集。

这和我们的内连接(INNER JOIN)有点类似,以上SQL也可以这样写

SELECT c1.* FROM City1 c1
INNER JOIN City2 c2
ON c1.Cno=c2.Cno AND c1.Name=c2.Name

结果与上面结果相同。

并集UNION

可以对两个或多个结果集进行连接,形成“并集”。子结果集所有的记录组合在一起形成新的结果集。其中使用UNION可以得到不重复(去重)的结果集,使用UNION ALL可能会得到重复(不去重)的结果集。

并集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

UNION示例

还是以上面的City1和City2为例,取两个表的并集,我们可以这样写SQL:

SELECT * FROM  City1
UNION
SELECT * FROM  City2

结果如下:

我们看到,北京和上海去掉了重复的记录,只保留了一次

UNION ALL示例

我们再看看使用UNION ALL会怎么样?

SELECT * FROM  City1
UNION ALL
SELECT * FROM  City2

结果如下:

与上面的UNION相比,UNION ALL仅仅是对两个表作了拼接而已,北京和上海依然在下面重复出现了,而且细心的读着应该发现了,UNION还会对结果进行排序,而UNION ALL不会。

差集EXCEPT

可以对两个或多个结果集进行连接,形成“差集”。返回左边结果集合中已经有的记录,而右边结果集中没有的记录。

差集限制条件

  • 子结果集要具有相同的结构。
  • 子结果集的列数必须相同
  • 子结果集对应的数据类型必须可以兼容。
  • 每个子结果集不能包含order by 和 compute子句。

差集示例

以City1和City2为例,我们想取City1(左表)和City2(右表)的差集,可以这样写SQL:

SELECT * FROM  City1
EXCEPT
SELECT * FROM  City2

结果如下:

我们看到,因为北京和上海在两个表都存在,差集为了只显示左表中有的,而右表中没有的,就把这两个给过滤掉了。

此外我们常说的关联条件其实也是集合的一种,是通过子表的笛卡尔积按不同的关联条件过滤之后得到的结果集。有兴趣的同学可以阅读一下《Microsoft SQL SERVER 2008技术内幕 T-SQL查询》,这本书中有关于集合论的具体阐述。

批注

集合是我们数据处理过程中的理论基础,可以通过集合的观点去很好的理解不同的查询语句。每一个物理表就是一个集合,当我们要对表进行操作的时候,将它们看成对集合的操作就很好理解了。

两个集合根据属性取差集_SQL高级知识——集合相关推荐

  1. java8 stream 两个不同对象list取差集

    @Data public class QwWxUserModel {@Idprivate String unionid;/*** 企微qwUserId*/private String qwUserid ...

  2. sql取整数_SQL高级功能

    1.窗口函数 窗口函数用于日常工作中,经常会遇到的需要在每组内排名的问题,比如: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 此时需要使用sql的高级功能窗口函数 ...

  3. sql两个聚合列相同怎么区分_SQL高级查询(终)

    SQL的介绍也接近尾声了,让我们来继续领略数据库的魅力. 1 窗口函数 窗口函数,是可以实现OLAP功能的一种函数.OLAP,是Online Analytical Processing的首字母缩写,意 ...

  4. 同一张表两方各字段相同_SQL高级知识——派生表

    派生表的定义 派生表是在外部查询的FROM子句中定义的,只要外部查询一结束,派生表也就不存在了. 派生表的作用 派生表可以简化查询,避免使用临时表.相比手动生成临时表性能更优越.派生表与其他表一样出现 ...

  5. declare sql语句_SQL高级知识——动态SQL

    在介绍动态SQL前我们先看看什么是静态SQL 静态SQL 静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的.静 ...

  6. case when else 默认随机_SQL高级知识——CASE的用法

    CASE函数的类型 CASE具有两种格式,简单CASE函数和CASE搜索函数.这两种方式,大部分情况下可以实现相同的功能. 简单CASE函数 语法 CASE column WHEN THEN valu ...

  7. pb 执行存储过程带参数_SQL高级知识——存储过程

    存储过程的定义 存储过程其实就是已预编译为可执行过程的一个或多个SQL语句. 通过调用和传递参数即可完成该存储过程的功能. 创建存储过程语法 CREATE PROC | PROCEDURE proce ...

  8. php二维数组取交集,php array交集 PHP二维数组取差集操作方法 - 非主流娱乐网

    php array交集 PHP二维数组取差集操作方法 2019-07-11 23:14:16 来源: 非主流娱乐网责任编辑:小s0条评论 一.需求 PHP 中对二维数组取差集操作. 例如: $arr1 ...

  9. 关于MYSQL两个表取差集

    今天在做一个小功能的时候,遇到了需要取两个表的差集,本来可以直接通过两次查表然后通过代码去处理. 由于我个人比较喜欢减少数据库交互,所以在网上查了下关于mysql两个表取差集的方案.但是发现很多的 差 ...

  10. mysql如何两个表取差集_mysql 查询两张表的差集

    今天在做一个小功能的时候,遇到了需要取两个表的差集,本来可以直接通过两次查表然后通过代码去处理. 由于我个人比较喜欢减少数据库交互,所以在网上查了下关于mysql两个表取差集的方案.但是发现很多的 差 ...

最新文章

  1. AIX中一些常用的命令汇总
  2. 将英文man替换为中文man最简单的方法
  3. unique函数详解
  4. 数组中两数相加等于特定值,以字符串的形式输出两数角标
  5. 奇妙的安全旅行之国密算法
  6. oracle存在于A不存在于B,Oracle试题
  7. Python算法、经典面试常见案例题大分享!!!
  8. 常用软件写网页html,新手用什么软件写html网页比较靠谱
  9. Java11完全兼容Java8吗_Java11正式发布,要不要升级请看这里!
  10. 符号---Alt+数字键
  11. 首次适应算法 动态分区分配方式的模拟 C语言——课程设计实习
  12. jmeter插件之Dummy Sampler
  13. Trading on Sentiment
  14. getElementById(‘divid‘).innerHTML赋值【js基础】
  15. (十四)覆盖率类型、覆盖率组
  16. 【观察】致敬开发者,华为云最新地铁广告释放了哪些信号?
  17. ReportStudio入门教程(七十一) - 显示时间进度(文字版)
  18. Tensorflow③ Keras的LSTM和TF的LSTM实现的源码剖析
  19. java鼠标各按键单击和左键击双击
  20. 基于java的学生宿舍公寓管理系统

热门文章

  1. win7 mysql 未响应_求助啊 WIN7下安装mysql出问题 老是说未响应~!!
  2. 恢复系统管理员密码的五大奇招
  3. linux双机热备份
  4. facade层,service 层,domain层,dao 层设计
  5. linux高级技巧:rsync同步(二)
  6. TortoiseGit 添加ssh key
  7. java 判断两个时间相差的天数
  8. 数组及引用类型内存分配
  9. java 动态代理 jdk为何比cglib效率低 原理总结
  10. JVM监控及诊断工具GUI篇之JProfiler