前言

尽管大多数开发者在日常工作中经常用到Join操作,如Inner Join、Left Join、Right Join等,但在面对特定查询需求时,选择哪种Join类型以及如何使用On和Where子句往往成为一大挑战。特别是对于初学者而言,这些概念可能显得抽象且难以区分。在实际应用中,错误地使用Join类型或混淆On与Where子句的功能,都可能导致数据查询结果的不准确或遗漏关键信息。

今天大姚给大家讲解一下SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、Where区别和用法。

SQL连接JOIN图解

数据库表结构和对应数据

本文咱们用的是MS Sql Server作为数据操作示例。

Students 学生表:

Class 班级表:

Join(where联立查询)

概念:用于两表或多表之间数据联立查询。

select * from Students s,Class c where s.ClassId=c.ClassId

Inner Join(内连接查询)

概念:与Join相同,两表或多表之间联立查询数据,因此我们在使用多表join查询的时候既可以使用where关联,也可以是inner join关联查询。

select * from Students s inner join  Class c  on s.ClassId=c.ClassId

Left Join(左连接查询)

概念:以左表中的数据为主,即使与右表中的数据不匹配也会把左表中的所有数据返回。

select * from Students s left join  Class c on s.ClassId=c.ClassId

Right Join(右连接查询)

概念:与Left Join的用法相反,是以右表中的数据为主,即使左表中不存在匹配数据也会把右表中所有数据返回。

select * from Students s right join  Class c  on s.ClassId=c.ClassId

Full Join(全连接查询)

概念:返回表中所有的数据数据,无论匹配与否。

select * from Students s Full JOIN  Class c  on s.ClassId=c.ClassId

On、Where的异同

这两个概念中也是绝大多数人无法区分到底它们两者之间有何区别,我什么时候使用On,什么时候使用Where,下面将分别展示两者的异同。

On条件的作用:

ON的使用无论是左右内全都使用到了On来进行关联!

对于inner join 的作用就是起到了与where相同的作用条件筛选:

select * from Students s inner join  Class c  on s.ClassId=c.ClassId and s.Sex='男'

对于左右连接而言,无论查询条件是否满足都会返回对应所指向的那边的所有数据:

select * from Students s left join  Class c  on s.ClassId=c.ClassId and s.Sex='男'

对于Full Join 而言无论,只有同时满足的时候才会返回全部关联的数据,假如有一方不满足返回以左边的表数据为基准返回:

--全连接
select * from Students s full join  Class c  on s.ClassId=c.ClassId
 
--全连接加on查询
select * from Students s full join  Class c  on s.ClassId=c.ClassId and s.Sex='男' 

WHERE条件的作用:

WHERE条件在临时表生成后的过滤阶段应用,对最终结果进行筛选。此时LEFT JOIN的“保留左表所有记录”特性已失效,WHERE 会过滤掉不符合条件的行(包括左表记录),如下所示:

仅返回右表 ClassId=1 的匹配记录,左表中无匹配的记录会被过滤掉。

select * from Students s left join Class c on s.ClassId=c.ClassId WHERE c.ClassId=1

区别总结:

一句话概括:ON用作于生成临时表时的条件筛选,WHERE用作于对临时表中的记录进行过滤。

  • ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录(以左连接为例)。
  • WHERE条件是在临时表生成好后,再对临时表产生的数据进行过滤条件筛选。

工作面试必备:SQL 中的各种连接 JOIN 的区别总结!的更多相关文章

  1. SQL中的左连接与右连接,内连接有什么不同

    SQL中的左连接与右连接,内连接有什么不同 我们来举个例子.天庭上面有一个管理系统:管理系统有个主表:主表记录着各个神仙的基本信息(我们把它当成表A).还有个表记录着他们这个神仙的详细信息(我们把它当 ...

  2. Sql中的内连接,左连接以及右连接区别

    转自:http://pangaoyuan.javaeye.com/blog/713177 有两个表A和表B. 表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据 ...

  3. 面试问题 - SQL 中存储过程与函数的区别

    SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行.  但函数也有着更多的限制,比如不能使用临 ...

  4. SQL中的内连接外连接和交叉连接是什么意思?

    内连接又分为等值连接.自然连接和不等连接三种. 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN).右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接( ...

  5. Spark SQL中的几种join

    1.小表对大表(broadcast join) 将小表的数据分发到每个节点上,供大表使用.executor存储小表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在SparkSQ ...

  6. SQL中的left outer join,inner join,right outer join用法详解

    这两天,在研究SQL语法中的inner join多表查询语法的用法,通过学习,发现一个SQL命令,竟然涉及到很多线性代数方面的知识,现将这些知识系统地记录如下: 使用关系代数合并数据1 关系代数合并数 ...

  7. SSM框架的sql中参数注入(#和$的区别)

    <select id="findUsersByUserName2" resultType="java.util.Map" parameterType=&q ...

  8. Access与SQL中的IsNull(),IS NULL的区别

    Access也有IsNull函数,但意义和参数却和T-SQL中的不同. 在T-SQL(也就是SQL Server所支持的SQL语言)中,IsNull的作用是把空值替代成指定的值.然而在Access中, ...

  9. SQL中instr和like的使用区别

    1.instr函数 instr函数是一个字符串处理函数,它在Oracle/PLSQL中是返回子字符串在源字符串中的位置,如果在源串中没有找到子串,则返回0. instr函数定义如下: /* * 返回子 ...

  10. SQL中distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

随机推荐

  1. Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

    一.前言 视频监控组件经历过数十年的迭代,从最初的只简单播放个rtsp视频流,到现在支持各种音频视频文件格式(mp3.wav.mp4.asf.rm.rmvb.mkv等).支持各种视频流格式(rtp.r ...

  2. Qt编写安防视频监控系统25-离线地图

    一.前言 离线地图这个功能是近期才完成的,老早以前就很多人问有没有离线地图的功能,之前也大致了解过如何做离线地图,其实最核心的不是代码,而是如何搞到免费的离线地图文件,离线地图下载器网上大部分都是收费 ...

  3. Qt编写安防视频监控系统36-onvif连续移动

    一.前言 时隔一年多,重新对视频监控系统的onvif内核重写,一方面为了兼容Qt6,一方面按功能分类提高效率.整体逻辑思路是一样的,主要的改动是由于Qt6不再支持QtXmlPatterns模块(其实这 ...

  4. 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.3版已发布

    关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持UDP .TCP .WebSocket 三种协议,支持iOS.A ...

  5. JMeter JDBC 请求实战宝典

    <JMeter JDBC 请求实战宝典> 宝子们,今天咱就来唠唠 JMeter 里超厉害的 JDBC 请求,这玩意儿就像是数据库世界的神奇魔杖,能帮咱把数据库里的各种秘密(数据)都挖出来, ...

  6. 【转载】hacker术语

    1.肉鸡 所谓"肉鸡"是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是WINDOWS系统,也可以是UNIX/LINUX系统,可以是普通的个人电脑,也可以是大型的服务 ...

  7. 史上最全MySQL面试60题和答案

    Mysql中有哪几种锁? 1.表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 2.行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也 ...

  8. linux:安装php7.x

    参考:链接 更新yum源 CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n ...

  9. Educational Codeforces Round 168 (Rated for Div. 2)

    题目链接:Educational Codeforces Round 168 (Rated for Div. 2) 总结:题目较简单,但是发挥很一般.A,B题一直读假题,卡了半个小时:C题用char存i ...

  10. axios请求拦截器和响应拦截器

    axios里面可以设置拦截器 ,在请求发送之前做一些事情: 拦截器分[请求拦截器]和[响应拦截器] 参考地址:https://www.jb51.net/article/150014.htm 参考的地址 ...