详解T-SQL的联接机制

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android FrameWork学习(一)Android 7 0系统源码下载 编译

最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固。 既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了。 #硬件环境要求 ###1. 编译环境 按照…

【MapGIS精品教程】002:GDB本地数据库的使用

本文主要内容为MapGISGDB本地数据库的使用,包括:GDB企业管理器的认识、GDB本地数据库的创建方法、GDB本地数据库的备份和恢复。 1. GDB企业管理器的认识 GDB是地理数据的资源管理器,主要对空间数据进行有序组织与管理。 GDB数据管理包括&…

RabbitMQ学习3----运行和管理RabbitMQ

1.服务为管理 Erlang天生就是为了让应用程序无需知道对方是否存在同一台机器上即可互相通信。 Erlang节点:Erlang虚拟机的每个实例。多个Erlang应用程序可以运行在同一个节点之上。节点之间可以进行本地通信(不管他们是运行在同一台服务器之上&#xff0…

各代移动网络性能

摘自《中国元宇宙白皮书》 下载整书完整版https://www.aliyundrive.com/s/gXQvRLM22kD

EFCore高级Saas系统下单DbContext如何支持不同数据库的迁移

前言随着系统的不断开发和迭代默认的efcore功能十分强大,但是随着Saas系统的引进efcore基于表字段的多租户模式已经非常完美了,但是基于数据库的多租户也是可以用的,但是也存在缺点,缺点就是没有办法支持不同数据库,mi…

poj 1679: The Unique MST【次小生成树】

题目链接 参考博客 希望注释足够清楚。。欢迎指出不足~ #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int maxn110; const int INF0x3f3f3f3f;int n,m; int mp[maxn][maxn]; int maxlen[maxn][maxn]; //maxlen…

51. Python 数据处理(2)

1.Python 修改excel文件import xlrd import xlutils.copy excelr xlrd.open_workbook("hello.xlsx") excelw xlutils.copy.copy(excelr) sheet1 excelw.get_sheet(0) sheet1.write(3, 5, "xlutils.copy test test") excelw.save("hello.xlsx"…

人工智能十大流行算法

导读&#xff1a;本文为有志于成为数据科学家或对此感兴趣的读者们介绍最流行的机器学习算法。 作者&#xff1a;Fahim ul Haq 译者&#xff1a;刘志勇&#xff0c;策划&#xff1a;赵钰莹 来源&#xff1a;InfoQ&#xff08;ID&#xff1a;infoqchina&#xff09; 机器学习是…

Win7+Win10双系统安装全攻略

安装双系统,不仅能给你非凡的体验,还可以满足工作中因系统版本,兼容性,处理器等原因带来的不便。本文讲解Win7+Win10双系统安装全攻略,亲测可用。 1. 硬盘分区 本文讲解利用固态硬盘+机械硬盘的分区方式。 固态硬盘:为了绝对提高系统运行的速度,将固态硬盘作为双系统的…

[矩形并-扫描线-线段树]Picture

最近在补数学和几何&#xff0c;没啥好写的&#xff0c;因为已经决定每天至少写一篇了&#xff0c;今天随便拿个题水水。 题目大意&#xff1a;给你N个边平行于坐标轴的矩形&#xff0c;求它们并的周长。(N<5000) 思路&#xff1a;这个数据范围瞎暴力就过了&#xff0c;但我…

聊聊研发团队中的“人”

大家好&#xff0c;我是Z哥。汉字博大精深&#xff0c;很多时候我们可以通过拆字来更形象地理解一个词的含义。比如“团队”这个词的两个字"团"和“队”单独看也都是表示一种由多人组成的组织。再做一下拆字就是“口”“才”和“耳”“人”。前者表示一个人才如果没有…

[转]【分布式系统】唯一ID生成策略总结

文章目录 全局唯一id介绍 全局唯一id特点:常见全局唯一id生成策略 1、数据库自增长序列或字段生成id 2、UUID 3、Redis生成ID 4、zookeeper生成ID 5、Twitter的snowflake算法全局唯一id介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中&#…

shell在一个大文件找出想要的一段字符串操作技巧

昨天端午&#xff0c;晚上的时候接了一个电话&#xff0c;我朋友的公司&#xff0c;数据库被两个工作没多久的phper给弄坏了&#xff0c;具体就是把一个字段值&#xff0c;给全表弄成一个了名字了&#xff0c;当然这个是可以配置了禁止全表更新数据库,这下可急坏了&#xff0c;…

CentOS7安装EPEL源

CentOS7安装EPEL [lijiayuncentos-*** ~]$ yum install epel-release已加载插件&#xff1a;fastestmirror, langpacks您需要 root 权限执行此命令。[lijiayuncentos-*** ~]$ su密码&#xff1a;[rootcentos-*** lijiayun]# yum install epel-release已加载插件&#xff1a;fas…

超全的开源Winform UI库,满足你的一切桌面开发需求!

本文有dotnet9站长整理 网址&#xff1a;https://dotnet9.com/本站曾介绍过一款Winform开源控件库HZHControls&#xff0c;Winform在大家心中的地位还是挺高的&#xff0c;今天小编再分享一款新鲜出炉的 Winform UI库——SunnyUI&#xff0c;一起跟 Dotnet9 往下看吧。项目名称…

告别国外 IDE,阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

经历近 3 年时间&#xff0c;在阿里集团及蚂蚁集团共建小组的努力下&#xff0c;OpenSumi 作为国内首个强定制性、高性能&#xff0c;兼容 VS Code 插件体系的 IDE 研发框架&#xff0c;今天正式对外开源。 一 OpenSumi 是什么&#xff1f; OpenSumi 是一款面向垂直领域&#…

window-memcache技术随笔

memcached.exe软件放置到非中文,非空格的目录,把MSVCR71.DLL文件放在memcached.exe同目录下启动,控制面板中打开window功能-Telnet客户端memcache服务方法一:管理员身份打开黑窗口 d:(mem的所在盘)cd memmemcached.exe -p 11211方法二: 安装为Windows的系统服务memcached.exe -…

将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

首先&#xff0c;非常感谢赵老大的CodeTimer&#xff0c;它让我们更好的了解到代码执行的性能&#xff0c;从而可以让我们从性能的角度来考虑问题&#xff0c;有些东西可能我们认为是这样的&#xff0c;但经理测试并非如何&#xff0c;这正应了我之前的那名话&#xff1a;“机器…

聊聊 C++ 中的几种智能指针(下)

一&#xff1a;背景 上一篇我们聊到了C 的 auto_ptr &#xff0c;有朋友说已经在 C 17 中被弃用了&#xff0c;感谢朋友提醒&#xff0c;今天我们来聊一下 C 11 中引入的几个智能指针。unique_ptrshared_ptrweak_ptr看看它们都怎么玩。二&#xff1a;三大智能指针详解 1. uniq…

iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

iOS回顾笔记&#xff08; 02 &#xff09; -- 由九宫格布局引发的一系列“惨案” 前言&#xff08;扯几句淡先&#xff09; 回顾到学习UI过程中的九宫格布局时&#xff0c;发现当时学的东西真是不少。 这个阶段最大的特点就是&#xff1a;知识点繁多且琐碎。 我们的目标就是要将…