首页
学习
活动
专区
工具
TVP
发布

SQL语句多表数据查询之第3篇:子集、补集和差集

前两篇文章已经分别说了多表数据查询的交集、并集与合集,现在接着再来看多表数据查询的子集、补集和差集。

对于任何一个单独的表,只要在select语句中使用where条件就能获取其中的任何一个子集,对条件取反就能得到该子集的补集。如下图所示。

在上图中,A是子集,S是除了A之外的补集。

现仍以具体的数据表为例:

例如,在订单表中,要获取“产品ID”等于“P01”的记录,select语句如下:

select * from 订单 where 产品id = 'p01'

相对于订单表的全部数据而言,该语句得到的查询结果就是子集。如果对上述语句中的where条件取反,例如:

select * from where 产品id'p01'

这样得到的结果就是相对于原有条件的补集。

差集仅在多表查询中才会存在。例如,当订单表和客户表连接时,如果要获取订单表在客户表中不存在对应“客户ID”的记录,写法如下:

select * from 订单 A left join 客户 B on A.客户id = B.客户id where B.客户id is null

这样就将仅仅得到如下图所示的第五条记录,最终的记录数量为1条:

如果要获取客户表在订单表中不存在对应“客户ID”的记录,写法如下:

select * from 订单 A right join 客户 B on A.客户id = B.客户id where A.客户id is null

这样就将仅仅得到如下图所示的前面两条记录,最终的记录数量为2条:

如果要获取两个表全部的差集,可以简单的将上述两个带条件的select语句用union连接起来即可。或者,先获取它们的并集,然后将这个并集用()分割为一个整体,再使用select语句对这个结果进行查询。此时,这个查询结果就类似于一个数据表了。SQL语句如下:

select * from

(select * from 订单 A left join 客户 B on A.客户id = B.客户id

union

select * from 订单 A right join 客户 B on A.客户id = B.客户id)

where A.客户id is null or B.客户id is null

上述语句中用括号包起来的部分,就是上一篇文章所用过的并集语句,简单的说,就是先左连、再右连、最后再合并起来。这个生成并集的语句是Access中的写法,如果用的是SQLServer数据库,可以简单写为:

select * from

(select * from 订单 A full join 客户 B on A.客户id = B.客户id)

where A.客户id is null or B.客户id is null

上述语句执行后,得到的就是下图所示的前面两条及最后一条记录,最终的记录数量为3条:

如果以示意图来表示,这样得到的差集其实就是下图中的阴影部分:

很显然,两个表重叠的白色区域部分就是它们的交集。因此,我们也可以采用下面的方法来获取两个表的差集:

并集 - 交集 = 差集

那么,如何在并集中减去交集呢?这就需要用到“子查询”方面的知识,那就等到下一篇文章再来接着说。本系列文章全部是小编原创,码字不容易,喜欢的话就关注或点个赞吧,谢谢!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180212A0CBXC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券