左连接,右连接,内连接(left join ,right join,inner join)
浅谈左连接,右连接,内连接(left join ,right join,inner join)
这个问题一直困扰着我,每次遇到就打擦边球,不正面应对。今天索性把这几个连接搞懂了,写下这篇博客,
让跟我遇到同样问题的人,不再困惑。
先谈谈内连接:假设表A与表B根据条件id进行内连接,就将A表中的每一行跟B表中的每一行进行匹配,
注意匹配的方式如下图所示:

注意:首先取出teacher表中的第一行(如上图标记的地方),与表student中的每一行进行匹配(根据studentid条件),
然后再取出teacher表中的第二行,与表student中的每一行进行匹配,一直到结束。
如果遇到不匹配的直接跳过,那么内连接得到的结果就是两表的匹配项的集合。
sql语句:select * from Teacher t1 inner join Student s1 on t1.StudentId=s1.Id
linq查询语句:from t1 in Teachers
join s1 in Students on t1.StudentId equals s1.Id
select new {t1,s1}
lambda表达式:Teachers.Join(Students,t1 => t1.StudentId,s1 => s1.Id, (t1, s1) =>new{t1=t1,s1=s1})
这里给大家推荐一款软件(LINQPad),由于现在写后台代码的时候,对数据库中的表进行操作,基本上不写sql语句了,
都通过linq语句来操作数据库。所以想判断自己写的linq语句写的对不对,以及结果是啥,都需要运行程序,不方便。
但是在LinqPad里不仅可以写sql还可以写linq来操作数据库。重点:我不是打广告呦。。。
左连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。如下图所示

同样的还是先取表teacher中的第一行与表student表中的所有行来匹配,如果在表student中没有找到匹配项,
那么就返回teacher中的一行,外加student表中的一行,并且由于没有在student表中匹配到,所以这行以null值来填充。
sql语句:select * from Teacher t1 left join Student s1 on t1.StudentId=s1.Id
linq查询语句:from t1 in Teachers
join s1 in Students on t1.StudentId equals s1.Id into temp
from tt in temp.DefaultIfEmpty()
select new {t1,tt}
lambda表达式:Teachers.GroupJoin (Students,t1 => t1.StudentId, s1 => s1.Id,(t1, temp) =>new{t1 = t1, temp = temp})
.SelectMany (temp0 => temp0.temp.DefaultIfEmpty (),(temp0, tt) =>new{t1 = temp0.t1, tt = tt})
右连接: 返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
这个地方与左连接几乎一致,我就不再继续写了。
这篇文章比较基础,仅以记录自己学习的点点滴滴,如果能给博友们解除疑惑,那最好了。
左连接,右连接,内连接(left join ,right join,inner join)的更多相关文章
- PHP左、右、内连接
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录.right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录.inner join: 内连接,又 ...
- SQL中的连接可以分为内连接,外连接,以及交叉连接 。
SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...
- SQL Server中的连接查询【内连接,左连接,右连接,。。。】
在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...
- SQL 四种连接查询(内连接、左连接、右连接、全连接)
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. (1) JOIN: 如果表中有至少一个匹配,则返回行(inner join) (2) LEFT JOIN: 即使右表中没有 ...
- 关于数据库的左,右,内,外连接,Union和Union all---------笔记
1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...
- [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate迫切左外连接和迫切内连接
•迫切左外连接: •LEFT JOIN FETCH 关键字表示迫切左外连接检索策略. –list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee ...
- oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
1.简述 1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合 ...
- SQL连接方式(内连接,外连接,交叉连接)
1.内连接.左连接.右连接.全连接介绍 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来.内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来. 左连 ...
- SQL Server中的连接查询(内连接、外连接、交叉连接)
在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询 连接查询分为三种:内连接.外连接和交叉连接 1. 内连接 内连接inner join ...
随机推荐
- href=#与href=javascript:void(0)的区别
#"包含了一个位置信息,默认的锚点是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首,而 ...
- java基础-位运算符
1.位运算符 << 左移 : 右边以0填充 >> 带符号右移: 负数前面补1,整数补0 >>>不带符号右移 & 按位与运算 ...
- Linux基础理论
本节内容 1. Linux的安装及相关配置 2. UNIX和Linux操作系统概述 3. Linux命令及帮助 4. 目录结构 6. 用户.群组和权限 7. 用户.群组和权限的深入讨论 1 ...
- mysql 存储过程 CONCAT 字符串拼接
mysql 存储过程 CREATE PROCEDURE pro_province_report (IN startDate VARCHAR(),IN endDate VARCHAR(),IN Sour ...
- 如何修改config?
这几天在做给WCF做加密传输,结果当然是实现了加密传输,同时也发现了一个问题,有没有大神来答疑解惑一下. 事情是这样的. 在客户端的配置中,需要加入一个behavior,在config文件中是这样的. ...
- ASP.NET MVC下使用AngularJs语言(三):ng-options
今天使用angularjs的ng-options实现一个DropDownList下拉列表. 准备ASP.NET MVC的model: public class MobilePhone { public ...
- 不熟,不会,未a的题列表
不熟: jzoj5968. 电竞选手(不知道公式如何得来) jzoj4877. [NOIP2016提高A组集训第10场11.8]力场护盾 (对向量不熟悉,不知道为什么结果要取反) jzoj4867. ...
- python中的数字取整(ceil,floor,round)概念和用法
python中的数学运算函数(ceil,floor,round)的主要任务是截掉小数以后的位数.总体来说 就是取整用的.只是三者之间有微妙的区别: floor() :把数字变小 ceil() : ...
- [Node.js与数据库]node-mysql 模块介绍
[Node.js与数据库]node-mysql 模块介绍 转载至:https://itbilu.com/nodejs/npm/NyPG8LhlW.html#multiple-statement-q ...
- es6中的对象的可计算的属性名
先简单的啰嗦一下对象的属性: var obj = { a:2 } 要访问obj中a的位置,方法:1. obj.a //2 2..obj ["a"] ...