今天聊聊 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查询》,这本书中有关于集合论的具体阐述。
总结
集合是我们数据处理过程中的理论基础,可以通过集合的观点去很好的理解不同的查询语句。每一个物理表就是一个集合,当我们要对表进行操作的时候,将它们看成对集合的操作就很好理解了。
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
相关文章
- 【MyBatis】 动态SQL——模糊查询 LIKE
- SQL删除多表关联数据的三种方法
- 什么是pl/sql语句_过程化SQL有三种循环结构
- SQL优化技巧指南
- SQL Server数据库定时自动备份
- SQL Server附加数据库报错无法打开物理文件,操作系统错误5的图文解决教程
- Oracle数据库:精通基础SQL(oracle基础sql)
- MSSQL导出SQL文件的简易方法(mssql导出sql文件)
- MongoDB实现“SQL NoSQL”合一(mongodb支持sql)
- 从零开始:Oracle建库的SQL指南(oracle建库sql)
- 清理使用SQL Server数据库:实现高效的日志清理(sqlserver数据库日志)
- 如何使用 MySQL 导入 SQL 文件?(mysql导入sql文件)
- 虚拟主机配置支持Microsoft SQL Server吗?(虚拟主机支持mssql吗)
- MySQL与Microsoft SQL Server之间的对比(数据库名称mssql)
- 优化SQL Server迁移与优化:实现跨越技术边界的突破(sqlserver迁移和)
- SQL Server添加多列,提升处理能力(sqlserver添加多个列)
- 字掌握 SQL Server,调出实力!(sqlserver关键)
- 查询使用MSSQL对多表进行复杂SQL查询(sql mssql 多表)
- sql 注入MSSQL防止SQL注入:强力防护的关键步骤(mssql阻止)
- Oracle SQL跟踪工具介绍及使用技巧(oracle跟踪sql工具)
- MySQL中实现动态SQL的方法与技巧(mysql中动态sql)
- 循环善用Oracle嵌套循环让你更有效地运行SQL语句(oracle为什么要嵌套)
- 使用SQL快速将数据导入Redis(sql导入redis)
- SQL与Redis实现数据的迅速存取(sql与redis)
- Oracle也用SQL有没有别的区别(oracle也是sql吗)
- Oracle SQL编程从入门到精通(oracle sql编译)
- Oracle SQL小试牛刀踏上编程之路(oracle sql练手)
- 籍学习Oracle SQL让你全面了解向数据库说话(oracle sql的书)
- Oracle SQL 空虚一片,尽头何处寻(oracle sql为空)
- 允许远程用户访问mysql服务sql语句