数据库的交、并、差、笛卡尔积运算(代码实现)

前言

关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积。
他们的图示可以表示为:
在这里插入图片描述

但是这样看可能不好理解,下面举例说明一下这些运算的用途。
**注:**这些运算都是对关系进行运算,就是离散中的关系表示为<a , b>,表示 a 关系 b ,关系是严格有序的,即<a , b>和<b , a>是不同的关系。所有运算的对象必须有相同的结构(先记忆,举例时说明)。

1. 并运算(UNION)

和离散中的并运算含义相同,即返回所有至少符合一个查询条件的部分。
在这里插入图片描述
下面举例说明:
学生表1
在这里插入图片描述

它可以对多个表进行查询也可以对单个表进行查询。
例如

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男' and 年龄 = 20)
 UNION
(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '女' and 年龄 = 19)

这段代码的含义是:在表(学生表1)中查询所有20岁的男生和所有19岁的女生的学号和姓名。
结果应如下:
在这里插入图片描述
它也可以对多个表查询。

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  性别 = '男')

这段代码的含义是:查出两个表(学生表1,学生表2)中所有的男生。
结果应如下:
在这里插入图片描述
它也可以多个语句进行交运算。
例如:

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  年龄 = 18 and 性别 = '女')

同理,这个结果应为上次的结果加上(学生表2)中18岁的女生,这里就不画图了。感兴趣可以自己用DBMS软件调试。

2. 交运算(INTERSECT)

返回同时满足所有条件的结果。
在这里插入图片描述
它也是可以对多个表进行查询也可以对单个表进行查询。
还是用上个图举例
对单个表查询:

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
INTERSECT
(SELECT  学号, 姓名 FROM 学生表1 WHERE  年龄 = 18)

这段代码的含义是:查询表(学生表1)中所有18岁的男生的学号和姓名。
结果应如下:
在这里插入图片描述
对两个表查询:

(SELECT  年龄 FROM 学生表1 WHERE  性别 = '男')
INTERSECT
(SELECT  年龄 FROM 学生表2 WHERE  性别 = '女')

由于两个表中没有相交的学号和姓名,故查询年龄代替,含义为:表1中男生的年龄和表2中女生的年龄有哪些重叠的。
结果为下:
在这里插入图片描述
(测试环境:SQL server 2008 R2)

3. 差运算(EXCEPT)

查询在第一个条件里面但是不在后面的条件里面。
在这里插入图片描述
在这里插入图片描述
它也是可以对多个表进行查询也可以对单个表进行查询。


一个小插曲
在这里插入图片描述
在实验代码的时候发现minus一直报错,找了好久才知道minus是Oracle里面的语法,SQL server 应用 EXCEPT。


他也可以多语句同时使用,举例:

SELECT  学号 FROM 学生表1 WHERE  性别 = '男'
except
SELECT  学号 FROM 学生表1 WHERE  年龄 = 17
except
SELECT  学号 FROM 学生表1 WHERE  年龄 = 18

结果:
在这里插入图片描述

4. 笛卡尔积运算

笛卡尔积运算就是把两个集合中的元素重组一个大的一一对应的集合。
在这里插入图片描述
例如,A={a,b}, B={0,1,2},则

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

代码我暂时还不会写。多举两个例子助理解吧:
l表:

lidname
101北京
102太原
101NULL
102NULL

II表:

matidqtylidmname
100111101北京
200121102太原
100111102太原
100111102太原

结果:

lidnamematidqtylidmname
101北京100111101北京
102太原100111101北京
101NULL100111101北京
102NULL100111101北京
101北京200121102太原
102太原200121102太原
101NULL200121102太原
102NULL200121102太原
101北京100111102太原
102太原100111102太原
101NULL100111102太原
102NULL100111102太原
101北京100111102太原
102太原100111102太原
101NULL100111102太原
102NULL100111102太原
  • 23
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值