浅谈左连接,右连接,内连接(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)的更多相关文章

  1. PHP左、右、内连接

    left join   :左连接,返回左表中所有的记录以及右表中连接字段相等的记录.right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录.inner join: 内连接,又 ...

  2. SQL中的连接可以分为内连接,外连接,以及交叉连接 。

    SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...

  3. SQL Server中的连接查询【内连接,左连接,右连接,。。。】

    在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...

  4. SQL 四种连接查询(内连接、左连接、右连接、全连接)

    下面列出了您可以使用的 JOIN 类型,以及它们之间的差异. (1)     JOIN: 如果表中有至少一个匹配,则返回行(inner join) (2)     LEFT JOIN: 即使右表中没有 ...

  5. 关于数据库的左,右,内,外连接,Union和Union all---------笔记

    1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...

  6. [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Hibernate迫切左外连接和迫切内连接

    •迫切左外连接: •LEFT JOIN FETCH 关键字表示迫切左外连接检索策略. –list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee  ...

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

    1.简述  1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合 ...

  9. SQL连接方式(内连接,外连接,交叉连接)

    1.内连接.左连接.右连接.全连接介绍 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来.内部连接是两个表中都必须有连接字段的对应值的记录,数据才能检索出来.   左连 ...

  10. SQL Server中的连接查询(内连接、外连接、交叉连接)

    在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询 连接查询分为三种:内连接.外连接和交叉连接 1. 内连接 内连接inner join ...

随机推荐

  1. day30

    作业 #__author : 'liuyang' #date : 2019/4/11 0011 下午 12:36 # 这两天 1.软件开发规范 不写 没法做新作业 #2. 认证+上传 +下载 + 校验 ...

  2. centos7 编译安装nginx+tcp转发

    一.依赖 1. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 2. PCRE pc ...

  3. Python10/24--组合/封装/property装饰器/多态

    组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...

  4. jvm参数与GC

    一.JVM的新生代.老年代.与永久代 JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 1.新生代:主要是用来存放新生的对象,一般占据堆的1/3空间.由于频繁创建对象,所以新生代会频繁触发Mi ...

  5. mysql data type <----> java data type (数值)

    https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +----------------------------+---- ...

  6. 基于UML的毕业选题系统建模研究

    一.基本信息 标题:基于UML的毕业选题系统建模研究 时间:2018 出版源:电脑迷 领域分类:UML建模技术 二.研究背景 问题定义:为了加强学生设计分析开发软件的相关能力,有效避免结构化模型存在的 ...

  7. ROM、RAM、DRAM、SRAM和FLASH、PSRAM

    1.ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常 ...

  8. 关于UIScrollView不能响应UITouch事件的解决办法

    原因是:UIView的touch事件被UIScrollView捕获了. 解决办法:让UIScrollView将事件传递过去.于是最简单的解决办法就是加一个UIScrollView的category.这 ...

  9. LeNet,AlexNet,GoogleLeNet,VggNet等网络对比

    CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段 ...

  10. webapi 自定义缓存实现

    定义一个Filter public class MyOutputCacheAttribute : ActionFilterAttribute { MemoryCacheDefault _cache = ...