sql语句中left join和inner join中的on与where的区别分析
关于SQL SERVER的表联接查询INNER JOIN 、LEFT JOIN和RIGHT JOIN,经常会用到ON和WHERE的条件查询,以前用的时候有时是凭感觉的,总是没有搞清楚,今日亲自测试了下,理解到了一些内容,在此分享。
要测试,首先我们来创建三张表,数据库就根据自己的情况而定
创建表TestJoinOnOrWhere_A、TestJoinOnOrWhere_B、TestJoinOnOrWhere_C
/****** Object: Table [dbo].[TestJoinOnOrWhere_A] Script Date: 2015/4/3 14:34:41 ******/ CREATE TABLE [dbo].[TestJoinOnOrWhere_A]([id] [int] NULL,[value] [int] NULL ) ON [PRIMARY]GO /****** Object: Table [dbo].[TestJoinOnOrWhere_B] Script Date: 2015/4/3 14:34:41 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TestJoinOnOrWhere_B]([id] [int] NULL,[value] [int] NULL ) ON [PRIMARY]GO /****** Object: Table [dbo].[TestJoinOnOrWhere_C] Script Date: 2015/4/3 14:34:41 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TestJoinOnOrWhere_C]([id] [int] NULL,[value] [int] NULL ) ON [PRIMARY]
表创建好了然后我们添加几条数据
INSERT [dbo].[TestJoinOnOrWhere_A] ([id], [value]) VALUES (1, 1) INSERT [dbo].[TestJoinOnOrWhere_A] ([id], [value]) VALUES (2, 1) INSERT [dbo].[TestJoinOnOrWhere_A] ([id], [value]) VALUES (3, 2) INSERT [dbo].[TestJoinOnOrWhere_B] ([id], [value]) VALUES (1, 1) INSERT [dbo].[TestJoinOnOrWhere_B] ([id], [value]) VALUES (2, 3) INSERT [dbo].[TestJoinOnOrWhere_B] ([id], [value]) VALUES (3, 4) INSERT [dbo].[TestJoinOnOrWhere_C] ([id], [value]) VALUES (1, 1) INSERT [dbo].[TestJoinOnOrWhere_C] ([id], [value]) VALUES (2, 2) INSERT [dbo].[TestJoinOnOrWhere_C] ([id], [value]) VALUES (3, 3)
现在我们开始测试
语句1:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND a.value = 1 语句2:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id
结果1:
id value id value
-------------------------------
1 1 1 1
2 1 2 3
3 2 NULL NULL
结果2
id value id value
-------------------------------
1 1 1 1
2 1 2 3
3 2 3 4
在网上查询到,有的人说a.value = 1没有生效,其实不然,它已经生效,只是在左联接查询时,左表的数据是不会受影响,只有右表的数据会根据a.value = 1条件取出左表(a表)Value为1的行,通过上面两个语句的结果就可以看出,那么我们用右表筛选条件会出现什么呢?看看下面语句
语句3:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND b.value = 1
结果3:
id value id value
-------------------------------
1 1 1 1
2 1 NULL NULL
3 2 NULL NULL
以上结果看出,也只是影响了右表的数据
语句4:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.value = 1
结果4:
id value id value
-------------------------------
1 1 1 1
1 1 2 3
1 1 3 4
2 1 1 1
2 1 2 3
2 1 3 4
3 2 NULL NULL
从上面语句结果看出,也只影响了右表的数据(取出所有a表value对应为1的b表数据)
所以在左联接查询时ON后面的条件只会影响右表,相反右联接查询影响的就是左边的表数据
如果用WHERE呢?我们看下下面的语句
语句5:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id where a.value = 1语句6:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id where b.value = 1
结果5:
id value id value
-------------------------------
1 1 1 1
2 1 2 3
结果6:
id value id value
-------------------------------
1 1 1 1
可以从结果看出,这个影响的结果就是全部的表,就相当于通过ON条件联接查询查询的结果,然后通过WHERE后面的条件取总体筛选
对于INNER JOIN 的ON条件会怎样影响呢?先看下面语句执行结果
语句7: SELECT * FROM dbo.TestJoinOnOrWhere_A AS a INNER JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND a.value = 1 语句8: SELECT * FROM dbo.TestJoinOnOrWhere_A AS a INNER JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND b.value = 1 语句9: SELECT * FROM dbo.TestJoinOnOrWhere_A AS a INNER JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id WHERE a.value = 1 语句10:SELECT * FROM dbo.TestJoinOnOrWhere_A AS a INNER JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id WHERE b.value = 1
结果7/9:
id value id value
-------------------------------
1 1 1 1
2 1 2 3
结果8/10:
id value id value
-------------------------------
1 1 1 1
上面通过WHERE和ON查询出来的结果是一样的,由此可看出,INNER JOIN 的ON条件和WHERE条件影响的都是一个效果,影响整体的查询结果。
下面我们再来看下对于LEFT JOIN的三表查询对于WHERE和ON影响的结果
语句11:SELECT a.id AS a_id,a.value AS a_value,b.id AS b_id,b.value AS b_value,c.id AS c_id,c.value AS c_value FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND a.value = 1 LEFT JOIN dbo.TestJoinOnOrWhere_C AS c ON b.id = c.id
语句12:SELECT a.id AS a_id,a.value AS a_value,b.id AS b_id,b.value AS b_value,c.id AS c_id,c.value AS c_value FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND b.value = 1 LEFT JOIN dbo.TestJoinOnOrWhere_C AS c ON b.id = c.id
语句13:SELECT a.id AS a_id,a.value AS a_value,b.id AS b_id,b.value AS b_value,c.id AS c_id,c.value AS c_value FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND a.value = 1 LEFT JOIN dbo.TestJoinOnOrWhere_C AS c ON b.id = c.id AND b.value = 1
语句14:SELECT a.id AS a_id,a.value AS a_value,b.id AS b_id,b.value AS b_value,c.id AS c_id,c.value AS c_value FROM dbo.TestJoinOnOrWhere_A AS a LEFT JOIN dbo.TestJoinOnOrWhere_B AS b ON a.id = b.id AND a.value = 1 LEFT JOIN dbo.TestJoinOnOrWhere_C AS c ON b.id = c.id AND c.value = 2
结果11:
a_id a_value b_id b_value c_id c_value
-----------------------------------------------------
1 1 1 1 1 1
2 1 2 3 2 2
3 2 NULL NULL NULL NULL
结果12:
a_id a_value b_id b_value c_id c_value
-----------------------------------------------------
1 1 1 1 1 1
2 1 NULL NULL NULL NULL
3 2 NULL NULL NULL NULL
结果13:
a_id a_value b_id b_value c_id c_value
-----------------------------------------------------
1 1 1 1 1 1
2 1 2 3 NULL NULL
3 2 NULL NULL NULL NULL
结果14:
a_id a_value b_id b_value c_id c_value
-----------------------------------------------------
1 1 1 1 NULL NULL
2 1 2 3 2 2
3 2 NULL NULL NULL NULL
通过以上三表数据查询结果,可以看出,LEFT JOIN 查询,对于ON的单独表条件始终只会影响条件表的右表(如,a.value=1会影响b表关联的a表value字段值为1的行,并不会限制a表的数据只显示value=1的行),RIGHT JOIN 影响效果恰恰相反
在使用ON条件时LEFT JOIN影响的是右侧的第二张第三张表,并不会对最左侧的表影响,所以对于a,b,c,三张表,a表数据是不受ON条件影响的,只会影响联接查询后的b或c数据
而WHERE就相当于在WHERE条件之前查询的数据当着一个表,然后通过WHERE条件进行筛选数据,所以影响的是整体。
创建于:2015-04-03
本文来自wl131710,转载请注明出处:http://www.cnblogs.com/wanglu/p/4390612.html
相关文章:

linux 笔记 一
查看apache是否开启pidof httpdps -aux | grep httpdps -ef| grep httpdpgrep httpd开启[停止|重启]/usr/sbin/apachectl start[stop|restart]/etc/init.d/httpd start[stop|restart]service httpd start[stop|restart]开机启动在/etc/rc.d/rc.local中增加启动apache的命令&…

【青少年编程】【三级】躲避恐龙
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100,小马老…

小数加分数怎样计算讲解_2020人教版三年级下册数学知识点汇总带视频讲解,让孩子在学习!...
小学生延期开学,孩子功课不能落下啊!帝源教育网课推出1-6年级语文数学英语教材同步讲解视频,让孩子在假期也能提早预习课文知识!手机用户访问:m.46344.com 即可观看学习哦!随着疫情的蔓延,学校…

JUnit基础及第一个单元测试实例(JUnit3.8)
JUnit基础及第一个单元测试实例(JUnit3.8) 单元测试 单元测试(unit testing) ,是指对软件中的最小可测试单元进行检查和验证。 单元测试不是为了证明您是对的,而是为了证明您没有错误。 单元测试主要是用来…

Scratch青少年编程能力等级测试模拟题(三级)
青少年编程竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…
Qt 程序在 Windows 下的发布
「博客搬家」 原地址: CSDN 原发表时间: 2016-06-04本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法。 经过验证发现,在 Ubuntu 平台下编译成功的程序可在未安装 Qt 开发环境下的 Ubuntu16.04 中…

楷书书法规则_硬笔书法入门学习“三步法”,让练字不再难
生活中,常常有人肯于吃苦,坚持经常练习硬笔书法,但却进步不大,收获甚微。因此,凡有志学好硬笔书法的人,必须掌握一些学习硬笔书法的方法。硬笔书法学习的方法可以采用“三步法”。一、规范入门硬笔一般比较短小灵硬&am…

系统异常设计规范与原则
为什么80%的码农都做不了架构师?>>> 1.系统异常设计的出发点: 良好的异常信息展示,开发运维人员能快速定位问题。响应外部调用异常时,应能明确指明是内部异常还是调用条件不满足导至。响应用户操作异常时,…

陈长沙:学习者参考手册
学习者参考手册 组队学习的核心是“和一群有意思的人在一起学感兴趣的知识的过程,这个过程充满了人与人之间的交流互动,是融入社交属性和学习属性的过程”。作为参与组队学习活动的学习者,一定想了解有关该项活动的各种环节。于是࿰…

TC配置文件WCMD.INI详解,只能在ini重修改的配置
有*的项目扩展了功能,有★的项目是只能在INI中修改的配置。 ★Allowed 允许访问哪些驱动器(\代表网络邻居)。例如写为Allowedcde\,代表仅允许访问C、D、E和网络邻居,其余驱动器无法访问,也不会出现在驱动…

mapgis矢量化怎么打分数_mapgis矢量化的详细工作流程
感觉不错就麻烦评下分哦1、准备光栅文件,启动MAPGIS输入编辑子系统,新建工程、新建控制点、界址点、线层等项目文件,建立界址点文件和线层文件的属性结构;2、采集控制点,记录图幅左下角经纬度,保存项目、工…

AutoFac使用方法总结:Part I
utoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系。在使用方面主要是register和resolve两类操作。 这篇文章用单元测试的形式列举了AutoFac的常用使用方法: 注册部分 使用RegisterType进行注册 [Fact]public void can_resolve_myclass…
canvas烟花锦集
canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果实现。 原文链接 实现一 效果地址 html <canvas id"canvas"></canvas>css body {background: #000;margin: 0; }canvas {cursor: crosshair;display: block; }js // when animat…

【青少年编程(第29周)】8月份的青少年编程组队学习结营了!
2021年09月05日(周日)晚20:00我们在青少年编程竞赛交流群开展了第二十九次直播活动。我们直播活动的主要内容如下: 首先,我们奖励了上周测试超过60分的小朋友。 其次,我们一起观看了电子学会等级测试流程的视频。 再…

led伏安特性实验误差分析_检测实验室误差分析知识汇编
2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家第一部分 误差理论简介在日常检测工作中,我们虽然有最好的检验方法、有检定合格的仪器设备、有满足检验要求的环境条件和熟悉检验工作的操作人员,但是,得到的检验结果却往往不可…

从Qcheck 1.3 不能在不同操作系统上运行问题(chro124、chro342)说开来------
【本文重在技巧学习,授人以鱼,不如授人以渔!!!】 因为公司项目需要对带宽占用进行测试, 最近看电子工业出版社《网络管理工具使用详解》就qcheck 1.3 不能在不同的操作系统之间运行做一个总结。 本文以标题…

Spark笔试
1.Spark 的四大组件下面哪个不是 (D ) A.Spark Streaming B Mlib C Graphx D Spark R 2.下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 3.spark 1.4 版本的最大变化 (B ) A spark sql Release 版本 B 引入 Spark R C DataFrame D支持动态资源…

秦州:西瓜书 + 南瓜书 吃瓜系列 10. 集成学习(下)
Datawhale南瓜书是经典机器学习教材《机器学习》(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习。 航路开辟者:谢文睿、秦州开源内容:https://githu…

iar定义arm版本_IAR Systems发布 IAR Embedded Workbench for ARM新版本
IAR Systems发布IAR Embedded Workbench for ARM嵌入式开发平台最新版本V5.41。相比于之前的版本,新版本软件在支持Cortex-M0上,将代码大小和执行速度这两个重要性能都提高了13%。本文引用地址:http://www.eepw.com.cn/article/106054.htmNXP…

UVA10110 Light, more light
链接地址。 分析: 如果n能被a整除,那么一定存在一个b使得a*b n。开关经两次变化相当于没有变化。那么只要看a b的那种特殊情况就OK了。 #include <stdio.h> #include <math.h> #include <stdlib.h>int main(){unsigned n, k;while(s…

【组队学习】【29期】Datawhale组队学习内容介绍
第29期 Datawhale 组队学习活动马上就要开始啦! 本次组队学习的内容为: 编程实践(数据可视化)计算机视觉自然语言处理之情感分析吃瓜教程——西瓜书南瓜书李宏毅机器学习(含深度学习)动手学数据分析集成学…

json的简单的数据格式
json的简单数据格式 var arr{"obj1":["张三","12","女"],"obj2":["李四","12","女"],"obj3":["王五","12","女"],} var str""; $.each(a…

eplise怎么连接数据库_基于手机信令的大数据分析教程(一)数据导入数据库
前言该套教程以一个初学大数据的菜鸟视角,编写数据分析处理的整套流程。写得较为详(luo)细(suo),希望适用于任何城乡规划大数据的初学者。持续更新中,若有错误,望指正!1、任务总纲(1)职住数据导…

反序列化xml
我是.net 菜鸟。 今天学习一下反序列化xml,即将xml文件转换成程序更好识别的对象。 下面来看一个例子。这是一个xml文件。 <xml> <students> <student> <fields> <field value"name"><field> <field value"i…

【青少年编程】【三级】小鸡吃虫
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传
http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html

display会影响canvas吗_多动症会影响智商吗?
小智(化名)小的时候非常皮,上学了也不老实,学习成绩还很差,一直是倒数,还有人说他智商低。父母带他到医院检查,一切都正常,智商也没问题。直到最近他被检查出多动症,小智…
SQL Server 数据库清除日志的方法
方法一: 1、打开查询分析器,输入命令 BACKUP LOG database_name WITH NO_LOG 2、再打开企业管理器--右键要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至xxm,这里会给出一个允许收缩到的最小m数,直接输入这个数,…

Axure8.0 网页 or App 鼠标滚动效果
1、index 页下添加一个内联框架,设置好自己想要的尺寸。 2、右键点击该内联框架转换为动态面板,并取消勾选“自动调整为内容尺寸”。 3、双击 “内联框架”选择并双击“state1” 切换到“内联框架的state1”页面,将“内联框架”组件的滚动条设…

【组队学习】【29期】1. 编程实践(数据可视化)
1. 编程实践(数据可视化) 航路开辟者:杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员:范佳慧航海士:杨剑砺、伊雪、肖桐、李晴晴、蔡婧旎 基本信息 开源内容:https://github.com/datawhalechina/fantastic…