写在前面

连接是数据库算法的一个重要内容,但数据库的知识有些忘了,最近刚好需要,就又看着笔记重新整理了一遍。

一、笛卡儿积

先来从笛卡儿积开始说起。笛卡儿积是集合的一种基本运算。假设有两个表 R R R和 S S S,则笛卡儿积的定义如下:

R × S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S } R\times S=\{\widehat{t_{r}t_{s}}|t_r\in R \wedge t_s\in S \} R×S={tr​ts​ ​∣tr​∈R∧ts​∈S}

简单点说,就是 R R R表中每一行(即一个元组 t r t_r tr​)和 S S S表中每一行(即一个元组 t s t_s ts​)进行两两组合,并把组合的结果作为一个新的大表。

  • 一个例子如下:假设给定的 R R R表(3个元组)和 S S S表(4个元组)为:

  • 则 R × S R\times S R×S的结果为(3*4=12个元组):

二、连接

连接的定义式如下:

R ⋈ A θ B S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R\bowtie_{A\theta B} S=\{\widehat{t_{r}t_{s}}|t_r\in R \wedge t_s\in S \wedge t_r[A] \theta t_s[B]\} R⋈AθB​S={tr​ts​ ​∣tr​∈R∧ts​∈S∧tr​[A]θts​[B]}

其中, θ \theta θ是一个运算符,可以是 > \gt >, ≥ \ge ≥, < \lt <, ≤ \le ≤, ≠ \ne ​=等; A A A和 B B B是列数相等且同域的属性组。

简单点说,连接实际上是从笛卡儿积的结果中选择某些元组作为一个新表。

  • 一个例子如下, R R R表和 S S S表同上:

三、等值连接

等值连接的定义如下:

R ⋈ A = B S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] = t s [ B ] } R\bowtie_{A= B} S=\{\widehat{t_{r}t_{s}}|t_r\in R \wedge t_s\in S \wedge t_r[A] = t_s[B]\} R⋈A=B​S={tr​ts​ ​∣tr​∈R∧ts​∈S∧tr​[A]=ts​[B]}

简单点说,等值连接是特殊的连接,特殊就特殊在它把原来的任意 θ \theta θ运算符固定为 = = =,这也是它之所以被叫做等值连接的原因。

  • 一个例子如下, R R R表和 S S S表同上:

四、自然连接

自然连接的定义式如下:

R ⋈ S = { t r t s ^ [ U − B ] ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ B ] = t s [ B ] } R\bowtie S=\{\widehat{t_{r}t_{s}}[U-B]|t_r\in R \wedge t_s\in S \wedge t_r[B] = t_s[B]\} R⋈S={tr​ts​ ​[U−B]∣tr​∈R∧ts​∈S∧tr​[B]=ts​[B]}

其中, U U U是所有属性组, B B B是比较的属性组,要求两个表均有 B B B(即属性组同名且同域)。

简单点说,自然连接就是特殊的等值连接。它的特殊之处有两个:1.它不需要指定比较的属性,它会自动比较两个表的同名同域属性,只有这些属性对应的值均相等,元组才会被从两个表中选择出来进行连接。2.二是它能够删除连接结果中的重复属性列(就是 [ U − B ] [U-B] [U−B]的操作),这个是等值连接没有的。

  • 一个例子如下, R R R表和 S S S表同上:

五、外连接

外连接是针对自然连接而言的。因为自然连接会丢失原表的信息,所以用外连接来选择保留原表中没有连接的元组(即悬浮元组)。但实际上,这种思路也可以用在普通的连接上。上面提到的连接、等值连接和自然连接均可视为内连接,因为它们均没有保留悬浮元组。外连接的方式有三种:

  • 全外连接:两边的悬浮元组都保留,其他属性填空值

  • 左外连接:左边的悬浮元组保留。

  • 右外连接:右边的悬浮元组保留

六、嵌套循环连接

这是一种连接的算法,并不影响连接的结果,它针对的是连接的过程。

简单点说,就是用两个(如果是多表连接就是多个)循环,依次顺序比较两个(或者多个)表的每个元组,看它们是否满足连接条件。如果满足,就提取出来连接并组成结果。

时间复杂度是 O ( N r × N s ) O(N_r\times N_s) O(Nr​×Ns​)。

  • 一个例子如下, R R R表和 S S S表同上:

注意,该方法对任意表均适用,但效率最低。另外,通常用小表作为外表。

七、排序合并连接

这也是一种连接的算法,并不影响连接的结果,它针对的是连接的过程。

两个表均排序好,扫描的时候均从上往下扫描,但对外层表的每一个元组,内层表并不是从头开始扫描,而是接着上次扫描终止的地方开始扫描,相当于交替扫描遍历。

时间复杂度是 O ( N r + N s ) O(N_r + N_s) O(Nr​+Ns​)。

  • 一个例子如下, R R R表和 S S S表同上:

注意,该方法效率较高,但是要求两个表均已排序。

八、索引连接

这也是一种连接的算法,并不影响连接的结果,它针对的是连接的过程。

简单点说,就是在较大表中建立对小表的索引,查找的时候不是顺序查找,而是通过索引来查找。

注意,该方法要求较大表中有对应属性的索引,且只能做等值连接。

九、哈希连接

这也是一种连接的算法,并不影响连接的结果,它针对的是连接的过程。

简单点说,是先用哈希函数将两个表分类后在遍历进行连接。此时遍历也不需要全表遍历,只需要在相同哈希值的元组中遍历即可。

注意,该方法要求较小的表能够全部放入内存(因为是遍历大表来在小表中查找相同哈希值的元组,所以小表及其对应哈希值应该要全部放入内存中),且只能做等值连接。

数据库:笛卡儿积、连接、等值连接、自然连接、外连接、嵌套循环连接、排序合并连接、索引连接和哈希连接相关推荐

  1. MySQL数据库(四):多表查询、视图、事务、索引、函数、Go连接MySQL

    MySQL数据库:视图.事务.索引.函数.Go连接MySQL 1.1 目录 文章目录 1.1 目录 1.2 多表查询分类 1.2.1 内连接[inner join] 1.2.2 左外连接[left j ...

  2. SQL连接的理解和使用(内连接:自然连接等值连接,外连接:左连接右连接全外连接)

    目录 一.连接的介绍 连接是什么? 连接分几种? 条件连接 等值连接 自然连接 二.连接的使用 内连接 INNER JOIN 内连接与等值连接区别 内连接与自然连接区别 外连接 OUTER JOIN ...

  3. 数据库 连接(自然连接,内连接,外连接)

    1.自然连接(natural join) 自然连接是一种特殊的等值连接,他要求两个关系表中进行连接的必须是相同的属性列(名字相同),无须添加连接条件,并且在结果中消除重复的属性列. select * ...

  4. 数据库中的内连接、自然连接和外连接的区别

    数据中的连接join分为内连接.自然连接.外连接,外连接又分为左外连接.右外连接.全外连接 当然,这些分类都是在连接的基础上,是从两个表中记录的笛卡尔积中选取满足连接的记录.笛卡尔积简单的说就是一个表 ...

  5. 数据库 -- 内连接、外连接和自然连接

    自然连接   自然连接作用于两个关系(也可理解为两个表),并产生一个关系作为结果.   相比于笛卡尔积,它会将第一个关系和第二个关系的所有出现的元组(即数据表的行)都进行连接.而自然连接只考虑哪些在两 ...

  6. MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接

    该篇文章基于以下三个表进行解析 student表 DROP TABLE IFEXISTS `student`;CREATE TABLE student (`sid` INT NOT NULL AUTO ...

  7. oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)

    永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! oracle连接总结(内连接.外连接.自然连接,交叉连接,自连接) 1.简述  1) 两个表的连接,是通过将一个表中的一列或者多列同另一 ...

  8. 连接查询(交叉连接,内连接,外连接,自然连接)

    创建一个学生表和一个课程表.先放出实验的表结构: create table student( id int, name varchar(15), gender varchar(15), cid int ...

  9. mysql a左外连接b b左外连接c_数据库中的 内连接,外连接(左连接,左外连接,右连接,右外连接),全连接,交叉连接...

    数据库的连接类型:内连接,外连接,全连接 ,交叉连接 作用:连接是关系数据库的特点,数据的关联查询用到 多表连接 提高查询效率 前段时间面试被问到数据库的内连接和外连接的问题,进过一番周折的无师自通, ...

最新文章

  1. IOS自定义表格UITableViewCell
  2. python并发编程之多进程理论部分
  3. php swiper 下拉刷新,SwipeRefreshLayout的使用(下拉刷新)
  4. 大型数据中心蓄电池规划与应用中的痛点及展望
  5. Sps的content menu 和 smart-tag的问题
  6. 深入java虚拟机(二) 对象的创建
  7. py2exe使用方法
  8. JAVA分页查询实现
  9. 计算机函数怎么向下填充,excel快速填充公式_Excel向左向右向上向下自动填充公式的方法步骤_excel公式填充...
  10. 计算机二进制中的原码,反码,补码
  11. opencv的core组件——像素,ROI,图像混合(3)
  12. SparkSQL和HiveSql的对比
  13. panabit之Web认证
  14. PTA7-4 考试周
  15. 珍贵的人生格言81条和诸位分享
  16. C#生成word压缩下载
  17. 视频帧数(图片)和音频提取及保存方法图片合成视频方法---ffmpeg
  18. Trac使用之 — Ticket
  19. ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
  20. 网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0;

热门文章

  1. 白帽子-高端信息安全培训
  2. python基础之元组,列表
  3. Windows7 IE8华大K宝登入农行网银方法
  4. “真顺风车”旗帜能让去IPO的嘀嗒引重致远吗?
  5. XY-MBD07A无线蓝牙模块设置
  6. console for sinatra
  7. 2012年度十大杰出IT博客之 罗升阳
  8. SSM之Mybatis Plus day01
  9. 阿里云挂载数据盘CentOS7
  10. mkfs.ubifs/hashtable/hashtable_itr.c:42:1: error: redefinition of ‘hashtable_iterator_key’