Join的实现步骤  以及连接的概念

我们常说连接有三种,即 交叉连接、内连接、外连接,这三者的概念很容易模糊,现在我们先放下概念,搞清楚完整连接实现的步骤:

一个完整的连接有三个步骤:、做笛卡儿积:

将Table1 和 Table2表中的所有的row 以任意的可能性进行组合,得到新的rows,若Table1中的rows.count
= n,Table2中的row.count=m,这些新的rows共有n*m 行,将这些新的行组成一个虚拟表VT1,将VT1作为参数传到下一步骤。

2、过滤Rows

根据on 过滤器后面的断言“Table1.id=Table2.id ”对rows进行过滤,取得符合条件的行组成一个新的虚拟表VT2,将VT2作为参数传递到下一步骤。

3、添加额外的rows

在join关键字的前面,可能有left、right、full 三种关键字,如果关键字是left,意思是将坐标中的行全部加到虚拟表中,对应的有表处的数据为null,如果关键字是right,那么就是将右边的表加到虚拟表中,如果是full,那么就是都加到虚拟表中。最后返回虚拟表VT3.

如果除了select还有其他的步骤,那么就将VT3继续作为参数向下传递,如果没有,那么就将VT3作为最终的结果输出。

交叉连接、内连接、外连接的概念

1、如果上面提到的三个步骤中,只有第一个步骤——做笛卡儿积,那么我们就说这个连接是交叉连接(cross join),一般情况下我们可以将cross关键字省略掉
2、如果有且只有前两个步骤,那么我们就说这个连接是一个内连接(inner join),
3、如果三个步骤都执行了,那么这个连接就是一个外连接(outer join),当然具体是有left outer join/right outer join /full outer join

最新文章

  1. $.extend()和 $.fn.extend()
  2. linux useradd 命令基本用法
  3. meta标签详解(meta标签的作用)///////////////////////////转
  4. Socket网络编程(3)--两端通信
  5. SQL in查询
  6. 新版本 JSAPI微信支付V3 C# DEMO
  7. linux命令后面常见的>/dev/null 和 2>&1 的含义
  8. [SQL Server]一次执行资料夹内的.sql 指令码
  9. Swift中对计算属性的理解和对之前的补充
  10. 算法导论--python--插入排序
  11. 剑指offer-面试题3.二维数组中的查找
  12. BinarySearchTree-二叉搜索树
  13. 题解 最优的挤奶方案(Optimal Milking)
  14. protobuf转json
  15. 日均数据量千万级,MySQL、TiDB两种存储方案的落地对比
  16. IMDB-二分类问题
  17. 初识C语言(五)
  18. Django--models--多表操作
  19. NowCoder110E Pocky游戏 状压DP
  20. 【iCore1S 双核心板_FPGA】例程六:状态机实验——状态机使用

热门文章

  1. UIView 设置阴影(属性说明)
  2. openstack、kvm CentOS升级内核
  3. JS拖动浮动DIV
  4. jQuery File Upload blueimp with struts2 简单试用
  5. Tilemill + tilestream + mapbox.js 自制地图
  6. BNU 沙漠之旅
  7. 玩转Linux网络namespace-单机自环測试与策略路由
  8. OpenStack导入镜像后Launch不起来的几个问题
  9. ceph存储之ceph客户端
  10. 【JavaScript】双引号问题