当前课程知识点:数据库概论 > 第二章 关系运算 > 2.3 自然关系运算2 > 自然关系运算2
各位同学大家好
我是来自云南大学软件学院的张璇
接下来
我们要介绍自然关系运算中的连接运算
不过
我前面在集合运算中提到过乘积运算
而且
我还强调
乘积运算本质就是连接运算
那么在介绍自然关系运算之前
我们先看个例子
看看为什么我们还需要有连接运算
在这个示例中我们要连接数据表
但还没有学自然关系运算的连接运算
那么就要看看怎么用乘积运算来解决
假设我们的目标是要检索
所有的销售代理商对
每一对代理商在同一个城市
而且都有超过6%
或至少等于6%的佣金
首先
要找销售代理商对
那就是要把两个销售代理商
连接到一个结果数据表中
这里我们可以使用乘积运算
其次
代理商的佣金都要超过6%或者至少6%
并且在同一个城市
那就要用到where运算
好的
下面我们这么写运算式
首先找出佣金超过6%的代理商
那么这么写
AGENT where percent>=6
另外
要在同一个城市
要在同一个城市
这个条件就没有办法
写在单个代理商的条件中
而是要把数据表连接起来
才可以增加这个条件
于是
先做乘积运算
为了方便区分
代理商对的两个不同代理商
我们把佣金大于等于6%的代理商结果数据表
先分别保存到L表和M表中
这样写
第一个代理商
AGENT where percent>=6
我们把它输入到L表中
第二个同样条件的代理商
我们把它输入到M表中
然后
我们用乘积运算连接它们
那么就是L乘上M
我们前面介绍乘积运算时说过
乘积运算会把连接的两个数据表中的记录行
一一对应连接起来
因此我们这里用乘积运算就可以得到
所有佣金大于等于6%的代理商对
但还有一个条件是他们要在同一个城市
所以
乘积运算结果我们再增加
选择运算where条件
设置为
L.city等于M.city
这样就得到了同一个城市的代理商对
不过需要注意
代理商自己和自己肯定在一个城市
要把这些自己和自己配对的代理商排除掉
我们就增加一个条件
L.aid不等于M.aid
这里aid是代理商的一个编号
于是
我们就得到了我们要的结果
看看结果
Smith和Gray
这两个销售代理商都在纽约
并且佣金都是6%
下面
我们来看看自然关系运算中的
连接运算
来比较一下集合运算中的乘积运算
连接运算会把两个数据表连接起来
和乘积运算不同的是
连接运算会基于两个表中
已有的相同属性列中的相同数据
进行连接
我们来看看抽象数据表
R和S的连接运算
由于R和S中有相同的B1B2列
连接运算就按照B1B2
下面相同的数据进行连接
例如
它们都有b1b1数据
那么
连接运算的结果就会有
a1b1b1c1
a1b1b1和c2两个记录行
另外
还有b1b2是相同的
那么就会有连接结果a2b1b2c3
那为什么我们需要把数据表
使用连接运算连接起来呢
我们举个简单的例子
我们的CAP数据库中
有顾客表和订单表
如果我们想要知道顾客的详细信息
和顾客购买商品的详细数据
我们就必须要把这两个表连接起来
因为在顾客表中有顾客的详细数据
但顾客的订单数据又在订单表中
接下来又有一个问题
如果连接运算连接的两个数据表
没有相同列
是否可以做连接运算呢
答案是可以
这时候的连接运算就相当于乘积运算
所以
我们说乘积运算也是完成连接运算的
那么
如果连接运算两个数据表是兼容数据表
是否可以做连接运算呢
答案是当然可以
不过
本质上
此时的连接运算相当于
集合运算中的交运算
好
我们大致介绍了连接运算的概念
当然必须举个例子
假设我们要找出
订购了商品p01的所有顾客姓名
那么这么做
订购数据在ORDERS表中
首先找出商品p01的订购数据
就是ORDERS where pid等于p01
ORDERS表中还有
订购了p01商品的顾客的id号
只不过
我们要找的是顾客姓名
而这个姓名在顾客表中
那么就要连接这两个数据表
用连接运算
那么在这里
CUSTOMERS JOIN ORDERS
就是把两个关系表连接起来
ORDERS表后面带的where条件
是把商品p01选取出来
最后
只要加上顾客姓名
就投影cname就完成了
到此
连接运算还没有讲完
因为连接运算还有一种外连接形式
外连接又细分为四种形式
这里我们介绍三种形式
它们是外连接
左外连接和右外连接
它们的符号是在
原外连接符号右下角增加O
LO和RO
或者用OUTER
LOUTERJ
ROUTERJ
分别表示外连接
左外连接和右外连接
为了讲清楚外连接的作用
我们用举例的方式给大家做介绍
这里
我们在CAP数据库中
增加一个数据表SALES
记录各个销售代理商的销售总额
例如
a01代理商销售总额850
a02代理商销售总额为400
为了显示外连接的作用
我们特别增加了这样的假设
AGENTS表中的a04代理商
是新加入代理商
还没有销售记录
因此
在SALES表中没有它的销售总额数据
而在SALES表中有个a07代理商
因为失误
其基本数据在AGENTS表中丢失了
好
我们先来看看外连接
如果AGENTS和SALES进行外连接
并且将连接结果投影出
代理商名称aname
它的编号和销售的总额total
结果是这样的
我们按照代理商编号id
进行AGENTS和SALES数据表的连接
a01 a02 a03 a05和a06
都是连接的结果
但由于是外连接
连接表中没有对应数据的记录
也连接到了结果中
于是
a04和a07的记录也在结果中
只不过
a04没有销售总额total的数据
显示为空null值
而a07的基本数据丢失
没有其名称
显示为空null值
因此
可以看出连接运算和外连接运算的关系了
外连接运算除了完成
基本连接运算的连接功能外
对于连接表中没有对应连接数据的记录
也返回到结果中
对于缺失的数据项
显示为空null值
而左外连接和右外连接
也就不难理解了
看看左外连接
结果是代理商表中有a04代理商
虽然它没有销售记录
但左外连接把它返回到结果中
其销售总额显示为空null值
右外连接应该就不需要我多解释了
a07返回到结果中
缺失的名称处显示为空null值
到此为止
我们介绍了所有关系代数运算
这里我们简单总结一下
关系代数运用数学的表达方式
严谨的描述对关系数据库的查询操作
集合运算和自然关系运算
是关系代数的两大类运算
集合运算包含
并交差
和乘积运算
其中并交和差运算
需要参与运算的数据表
是兼容表
乘积运算把参与运算的数据表连接起来
自然关系运算包含投影
选择
连接和除运算
其中投影运算选择出我们需要使用的属性列
选择运算帮助我们设置查询条件
而连接运算我们详细介绍了
它和乘积运算的关系
目标就是连接数据表完成查询操作
以上是所有关系代数运算的介绍
非常感谢大家
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video