T-SQL的联接分三种类型:

交叉联接 ( cross join )

内部联接    (inner join)

外部联接    (outer join)

每种联接在逻辑上经历不同的阶段,分为笛卡尔乘积、筛选、添加外部行,如图:

联接类型

阶段

交叉联接

笛卡儿乘积

内部联接

笛卡尔乘积、筛选

外部联接

笛卡儿乘积、筛选、添加外部行

接下来将以例子逐个讲解三种联接,假设有一张表a, 如下:

id
--
1
2
3
4

和一张表b ,如下:

id
--
3
4
5
6

1、交叉联接是最简单的联接,它只进行笛卡儿乘积。如果表a有x条记录,表b有y条记录,cross join 之后会生成 x*y条记录。

select a.id as aId,b.id as bId from a cross join b 

aId bId
--- ---
1 3
2 3
3 3
4 3
1 4
2 4
3 4
4 4
1 5
2 5
3 5
4 5
1 6
2 6
3 6
4 6

2、内联接进行了笛卡儿乘积筛选两个阶段。在写法上,inner join 的 inner是可选的,并且在on 后面指定筛选的条件(条件可以相等也可以不相等)。

select a.id as aId, b.id as bId from a

  inner join b on a.id=b.id

aId bId
--- ---
3 3
4 4

select a.id as aId,b.id as bId from a

 join b on a.id>b.id

aId bId
--- ---
4 3

如上结果,on指定的条件把不符合的记录给过滤掉了。

3、外部联接是指左外联接(left outer join)、右外联接(right outer join)、全外联接(full outer join)。写法上,outer 是可选的。

外联接进行了笛卡尔乘积筛选、和添加外部行三个阶段。相对于内联接,外联接多了一个添加外部行的阶段,也就是说在进行完筛选后,把该保留的记录添加回输出表中。

1) 所谓左外联接就是保留左侧表的所有记录,如有不匹配列的记录,则用null 填充

select a.id as aId,b.id as bId from a 

   left outer join b on a.id=b.id 

aId bId 

--- ------
1 (null)
2 (null)
3 3
4 4

2) 右外联接就是保留右侧表的所有记录,如有不匹配列的记录,则用null 填充

select a.id as aId,b.id as bId from a 

   right join b on a.id=b.id 

aId bId
------ ---
3 3
4 4
(null) 5
(null) 6

3) 全外联接就是保留两侧表的所有记录,如有不匹配列的记录,则用null 填充

select a.id as aId,b.id as bId from a 

   full join b on a.id=b.id 

aId bId
------ ------
1 (null)
2 (null)
3 3
4 4
(null) 5  
(null) 6

注:以上例子讲的都是两张表的联接。如是多表联接,则从左侧开始,每个联接所生成的输出表是下一个联接的左侧表。

转载于:https://www.cnblogs.com/victorguan/p/6480050.html

详解T-SQL的联接机制相关推荐

  1. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  2. android增加内置存储分区,详解Android10的分区存储机制(Scoped Storage)适配教程

    1. 简介 大家应该都有过这样的体会,手机用着用着里面就充斥着各种不懂的文件夹和文件.甚至是连已经删除的软件的文件夹还存在. 为什么会发生的这样的问题呢? 因为google的缺席,导致android生 ...

  3. AngularJS 详解Directive(指令)机制

    AngularJS  5个实例详解Directive(指令)机制 大漠穷秋  http://damoqiongqiu.iteye.com/blog/1917971 1.一点小说明 指令的作用:实现语义 ...

  4. Mybatis的特性详解——动态SQL

    Mybatis的特性详解--动态SQL 前言 一.动态sql的元素 1.MyBatis if标签:条件判断 2.MyBatis choose.when和otherwise标签 3.MyBatis wh ...

  5. linux沙盒机制6,详解Android应用沙盒机制

    前言 Android使用沙盒来保护用户不受恶意应用的侵害,同时也将应用隔离开来,防止他们互相访问其数据,本文主要对Android应用沙盒中的几种技术做简要的总结. 一.Android应用DAC沙盒 稍 ...

  6. MaxCompute SQL函数详解 ODPS SQL函数详解---之日期相关函数

    MaxCompute SQL函数详解 ODPS SQL函数详解 日期函数 to_date函数 返回类型:datetime 语法:to_date(类型 参数1,类型 参数2);to_date(strin ...

  7. java阴阳师抽卡算法_阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单

    原标题:阴阳师详解新的抽卡机制 全图鉴和SP获取更加简单 阴阳师随着大岳丸活动的临近,马上大家就要再次进入抽卡的热潮中了,而这次的新SSR大岳丸的获取,又一次更新了新的抽卡机制,本次就带来新抽卡机制详 ...

  8. MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数

    MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数 MaxCompute/ODPS SQL常用数学运算相关函数 ABS函数-计算绝对值 sql:select A ...

  9. 【Python全栈100天学习笔记】Day37MySQL详解(sql语句基本操作含索引、视图、存储过程)

    SQL详解 基本操作 我们通常可以将SQL分为三类:DDL(数据定义语言).DML(数据操作语言)和DCL(数据控制语言).DDL主要用于创建(create).删除(drop).修改(alter)数据 ...

  10. 详解keras中的Mask机制

    文章目录 一. Mask背景 1.2 例子1 1.2 例子2 二. 原理 三. 方式 3.1 配置keras.layers.Embedding 层 3.2 添加keras.layers.Masking ...

最新文章

  1. 三层架构—实践篇(.Net登录实例)
  2. MyBatis二级缓存的关闭
  3. win10下cmd ping不通虚拟机,xshell连不上虚拟机【如果实在想不出来原因,就看看吧】
  4. 深入理解C++ 虚函数表
  5. 【Vue】—创建组件
  6. ubuntu安装atom
  7. 【Java集合源代码剖析】TreeMap源代码剖析
  8. DE13 Finding Particular Solutions to Inhomogeneous ODEs
  9. R:应用时间序列分析--基于R(1)第一章 时间序列分析简介
  10. 一款很好用的软还原卡
  11. 什么是TOC? 论文不通过?TOC请了解一下 | SCI-HUA科画技法
  12. 负载均衡算法--源地址哈希法(Hash)
  13. 遇到问题你的PIN不可用,请单击以重置和bitlocker恢复密匙
  14. 人工智能就业前景越来越严峻了,你还在坚持吗?
  15. 论文笔记(5.16,文本抗击,defense)--Combating Adversarial Misspellings with Robust Word Recognition
  16. 漫威系列-《复联4》
  17. 【学习总结】H2数据库
  18. linux内核内存管理slub
  19. 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
  20. 获得文件绝对路径的小技巧

热门文章

  1. java代码块的定义_Java几种代码块的定义与常见问题
  2. kaldi windows安装_kaldi在Windows下的使用
  3. 福禄克Fluke Pro3000 音频发生器和探头
  4. 项目管理:项目管理为什么难?
  5. Linux文件目录基础笔记
  6. 职场中不要问程序员这五类问题
  7. 那些关于浏览器的趣图和幽默段子
  8. php的正则表达式函数,php中常用的正则表达式函数
  9. android 微信缩小通话界面_安卓如何做出微信那样的界面仿微信“我”的界面2/5...
  10. html在线拖拽环绕,jQuery实现html元素拖拽