一、为什么使用连接操作?
在关系数据库中,一个表中的属性往往并不能解决所有问题,所以需要我们对多个表进行联动处理问题。 例如: 有student(sno,sname,sage,cno)和course(cno,cname)表,如果我们想获取选修c01数据库课程的学生姓名和课程名称,那么仅仅使用student和course都无法满足,这时就需要对两表进行连接处理。
二、连接操作原理
关系数据库中的操作都是根据关系代数(基于集合)进行操作得到目标结果。 而关系代数也分成基本操作和拓展操作,拓展操作都可以根据基本操作进行复合得到。 基本操作有:
- 并
- 差
- 选择
- 投影
- 笛卡尔积,这便是连接操作的基本实现
笛卡尔积:一个关系中所有元组和另一个关系中所有元组的所有可能得拼接构成的结果集合,基数是两关系基数之积,目是两关系目之和
三、拓展连接法
我们在上面定义可以看到,笛卡尔积非常消耗资源,所以在使用中的查询操作中,我们很少使用笛卡尔积进行直接相乘,我们会对其进行优化。
- theta连接(条件连接): 选择出所有符合条件的笛卡尔积中的元组。可以减少笛卡尔积结果需要的空间和时间
- 自然连接: 选择两个关系中相同属性且属性值相等的元组构成新的集合,是特殊的等值连接,自动删去重复的属性列- 等值连接: 特殊的theta连接,条件是两个属性值相等,保留重复的属性列
四、连接操作优化
- 嵌套循环法: 两个表进行笛卡尔连接就是两个循环,将两个集合进行组合,这里一般选择元组少的作为外循环,可以减少循环次数。
- 索引嵌套循环法: 在进行theta连接时,我们可以在有索引的属性上进行查找,这样可以加快查找,同时减少循环次数。
- 排序合并法: 对两个表连接属性进行排序,采用两个指针,指针一不动,指针二向下扫描,扫描到相同的元素进行连接,扫描到不同的元素,指针二下移
- 散列连接法: 将两个表的连接属性分别散列到一个Hash数组中,然后对散列到同一位置的元素进行连接
|