数据库的交、并、差、笛卡尔积运算(代码实现)
前言
关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积。
他们的图示可以表示为:
但是这样看可能不好理解,下面举例说明一下这些运算的用途。
**注:**这些运算都是对关系进行运算,就是离散中的关系表示为<a , b>,表示 a 关系 b ,关系是严格有序的,即<a , b>和<b , a>是不同的关系。所有运算的对象必须有相同的结构(先记忆,举例时说明)。
1. 并运算(UNION)
和离散中的并运算含义相同,即返回所有至少符合一个查询条件的部分。
下面举例说明:
它可以对多个表进行查询也可以对单个表进行查询。
例如
(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表:
lid | name |
---|---|
101 | 北京 |
102 | 太原 |
101 | NULL |
102 | NULL |
II表:
matid | qty | lid | mname |
---|---|---|---|
10011 | 1 | 101 | 北京 |
20012 | 1 | 102 | 太原 |
10011 | 1 | 102 | 太原 |
10011 | 1 | 102 | 太原 |
结果:
lid | name | matid | qty | lid | mname |
---|---|---|---|---|---|
101 | 北京 | 10011 | 1 | 101 | 北京 |
102 | 太原 | 10011 | 1 | 101 | 北京 |
101 | NULL | 10011 | 1 | 101 | 北京 |
102 | NULL | 10011 | 1 | 101 | 北京 |
101 | 北京 | 20012 | 1 | 102 | 太原 |
102 | 太原 | 20012 | 1 | 102 | 太原 |
101 | NULL | 20012 | 1 | 102 | 太原 |
102 | NULL | 20012 | 1 | 102 | 太原 |
101 | 北京 | 10011 | 1 | 102 | 太原 |
102 | 太原 | 10011 | 1 | 102 | 太原 |
101 | NULL | 10011 | 1 | 102 | 太原 |
102 | NULL | 10011 | 1 | 102 | 太原 |
101 | 北京 | 10011 | 1 | 102 | 太原 |
102 | 太原 | 10011 | 1 | 102 | 太原 |
101 | NULL | 10011 | 1 | 102 | 太原 |
102 | NULL | 10011 | 1 | 102 | 太原 |
数据库的交、并、差、笛卡尔积运算(代码实现)相关推荐
- 传统的集合运算(并,差,交和笛卡尔积运算)
传统的集合运算(并,差,交和笛卡尔积运算) (1)并 关系R和关系S的所有元组合并,再删去重复的元组,组成一个新的关系,记为RUS,例子如下 (2)差 由属于关系R而不属于关系S的所有元组组成的集合, ...
- php数组笛卡尔积,PHP实现数组的笛卡尔积运算示例
本文实例讲述了PHP实现数组的笛卡尔积运算.分享给大家供大家参考,具体如下: 数组的笛卡尔积在实际中还是挺有用处的,比如计算商品的规格时就经常用到,下面写一种实现方式,如下代码 $arr = arra ...
- sql中的并、交、差
⑸ 集合运算连接 有时候,用户希望在SQL查询中利用关系代数中的集合运算(并.交.差)来组合关系,SQL为此提供了相应的运算符:UNION.INTERSECT.EXCEPT(oracle的minus? ...
- js日期加减一天_JS日期加减,日期运算代码
这篇文章主要介绍了JS日期加减,日期运算代码,需要的朋友可以参考下 一.日期减去天数等于第二个日期 function cc(dd,dadd){ //可以加上错误处理 var a = new Date( ...
- 用c语言实现交并差算法,C语言实现集合的交,并,差
C语言实现集合的交,并,差 作者:Raining_C 来源:http://blog.csdn.net/Raining_CN [问题描述] 编制一个能演示执行集合的并.交和差运算的程序 [基本 ...
- 笛卡尔积 php,详解PHP实现数组的笛卡尔积运算
本文主要介绍了PHP实现数组的笛卡尔积运算,结合实例形式分析了php数组的笛卡尔积运算相关实现与使用技巧,需要的朋友可以参考下,希望能帮助到大家. 数组的笛卡尔积在实际中还是挺有用处的,比如计算商品的 ...
- 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...
java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...
- java 树状数据算法_使用递归算法结合数据库解析成Java树形结构的代码解析
这篇文章主要介绍了使用递归算法结合数据库解析成Java树形结构的代码解析的相关资料,需要的朋友可以参考下 1.准备表结构及对应的表数据 a.表结构:create table TB_TREE ( CID ...
- MySQL中实现并、交、差
简介 sql叫做结构化查询语言,本质利用的就是关系代数中的操作,比如常用的并.交.差.投影.选择等操作. 其中并.交.差是常用的操作,本文就看看MySQL中的sql语言是怎么提供对应的关系代数操作的. ...
最新文章
- java线程 yield_Java线程中yield与join方法的区别
- mysql 读写分离中间层
- arcgis 地图_ArcGIS超详细入门操作:ArcGIS矢量化地图详细步骤
- 工业机器人电柜布线_沙湾附近回收工业锅炉“本信息长期有效”
- 两个子集pom互相调用_声明式服务调用组件Feign
- maven安装过程以及手动添加jar包到本地仓库
- 5G + 云网融合,加速万物互联
- 5.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- Kong 的配置详解
- MySQL呕血汇总--从基础到毕业【收藏篇】
- gitlab 数据同步
- 关于消灭冲击波的蠕虫
- net share命令删除共享
- 推荐一些北京的景点(1简单版)
- linux rtl8723bu 蓝牙,RTL8723BU(wifi Bluetooth) 移植
- Python学习指南(看完不迷路)
- Linux下轻量级数据库-SQLite3(嵌入式设备)
- Hutool包下使用PinyinUtil获取汉字的拼音报错cn.hutool.extra.pinyin.PinyinException: No pinyin jar found! Please ...
- VS对文件编码格式的转换方法
- 基于Python的名片管理系统
- 无向图生成树计数 -- Kirchhoff 矩阵法模板