首页 > 数据库 >sqlserver left join 后用 on 还是 where?

sqlserver left join 后用 on 还是 where?

时间:2024-08-21 09:48:38浏览次数:12  
标签:join 记录 tab2 sqlserver size where id left

昨天写 SQL Server 数据库上写 SQL 语句时,我原本想通过执行A left join B on ... and ...的操作,将查询结果中的两条记录合并成一条,奈何发现结果中依然有两条记录。


回顾了一下语法知识,意识到join on ... and ...的语句并不会对结果集的记录条数进行过滤。它的主要作用是,根据and后面指定的条件来决定是否显示B表的记录。而A表的记录则会无条件地显示出来。


不论and后面跟的是A.id=1还是B.id=1这样的条件,查询结果都会显示A表中的所有记录。同时,如果B表中存在与A表中id为1的记录相匹配的数据,或者B表中存在id为1的记录,这些信息也会被关联并显示出来。
运行sql :

select * from student s left join class c on s.classId=c.id order by s.id

 

运行sql :
select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id

 

运行sql :
select * from student s left join class c on s.classId=c.id and c.name="三年级三班" order by s.id

 

数据库通过连接多张表来返回记录的过程中,会首先生成一个中间的临时表。这个临时表是连接操作的核心,并且最终会基于这个临时表向用户展示结果。


当使用`left join`时,`on`条件的作用是在构建这个临时表时,用于确定如何连接左表和右表。无论`on`条件是否满足,左表中的所有记录都会被包含在生成的临时表中。


与之不同,`where`条件是在临时表已经构建完成之后,对临时表内容进行筛选的条件。这时,`left join`的语义(即必须返回左表的所有记录)已经不再适用。`where`条件会过滤掉不满足条件的记录,仅保留符合条件的记录作为最终的查询结果。


假设有两张表:
表1:tab2

2:tab2

 

两条SQL:1、
select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、
select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条SQL的过程:
1、中间表on条件:
tab1.size = tab2.size

 

2、再对中间表过滤where 条件:
tab2.name=’AAA’

 

第二条SQL的过程:

1、中间表on条件
tab1.size = tab2.size and tab2.name=’AAA’
条件不为真也会返回左表中的记录

 

实际上,上述结果的关键所在正是源于left join、right join以及full join的特点。在这些连接操作中,不论on条件是否成立,都会返回left或right表中的记录。而full join则结合了left和right的特性,返回的是两者的并集。


然而,对于inner join而言,它并不具备这样的特性。因此,在inner join中,无论是将条件放在on中还是where中,最终得到的结果集都是相同的。

标签:join,记录,tab2,sqlserver,size,where,id,left
From: https://www.cnblogs.com/gdjgs/p/18370997

相关文章

  • left join 后用 on 还是 where?
    昨天写SQLServer数据库上写SQL语句时,我原本想通过执行AleftjoinBon...and...的操作,将查询结果中的两条记录合并成一条,奈何发现结果中依然有两条记录。回顾了一下语法知识,意识到joinon...and...的语句并不会对结果集的记录条数进行过滤。它的主要作用是,根据and后......
  • (八)Flink Join 连接
    在分布式数据处理中,JOIN是一个非常重要的操作。Flink的JOIN是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink双流JOIN主要分为两大类:一类是基于窗口的JOIN操作,另一类是基于原生State的Connect算子操作。其中基于窗口的JOIN可细分为WindowJoin......
  • Big Clique Everywhere 题解
    给个链接:BigCliqueEverywhere。先说一下团(clique)是什么,其实就是完全图。考虑什么情况下不满足题意。我们可以先建出补图,下面的东西都在补图中完成。我们首先给出结论:如果该图中有奇环(不是二分图),则条件不成立,否则成立。这里证明一下:如果存在奇环,则把点集设为这个奇环中的点,那......
  • Abp vNext+SqlServer+MySqlServer
    目前项目使用的是ABPvNext版本8.2.0加上SQLServer。由于业务需求,我们需要与MySQL数据库进行对接,这意味着项目的主要功能将继续使用SQLServer,而部分特定功能将需要与MySQL数据库交互。步骤1.在项目“XXX.XXX.EntityFrameworkCore”中安装MySql包dotnetaddpackag......
  • sqlserver清理数据库日志并写作业定期执行
    清理数据库日志最终sql:USE[master]GOALTERDATABASElsrz_zjwb_wSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASElsrz_zjwb_wSETRECOVERYSIMPLE--简单模式GOUSElsrz_zjwb_wGODBCCSHRINKFILE(N'lsrz_zjwb_log',2,TRUNCATEONLY)--日志文件逻辑名称......
  • SQLServer 错误: 8646,在数据库 'msdb',表 1077578877 的索引 ID 1 中找不到索引条目
    一台非生产服务器,磁盘被打满了,刚开始以为只是正常的磁盘使用增长满了,就清理了一部分空间出来,没过一会,就又满了,排查到sqlserver的错误日志文件一直在增 同时查看sqlserver错误日志,大量报错日志:[298]SQLServer错误:8646,在数据库'msdb',表1077578877的索引ID1中找不到索......
  • 线程执行顺序 join()
    importlombok.SneakyThrows;importjava.util.concurrent.TimeUnit;publicclassT{@SneakyThrowspublicstaticvoidmain(String[]args){Objecto=newObject();Threadthread1=newThread(()->{try{......
  • C#高级:在SQLserver中使用视图和存储过程
    一、视图1.视图是什么,有什么作用?①一个虚拟表②简化查询2.视图和存储过程有什么区别?①视图:用于简化查询和数据展示②存储过程:用于执行一系列SQL语句,包含增删改查等,即业务逻辑得处理。3.建立一个视图,名为PersonBorrowView,SQL已给出: SELECTU.Name,BW.BoTime,BI.Bo......
  • Python 提取出SQL语句中Where的值的方法
    1.方法一:使用sqlparse库的方法为了提取SQL语句中WHERE子句的值,我们可以利用Python的sqlparse库,这是一个专门用于解析SQL语句的库。以下是一个示例代码,演示如何使用sqlparse来提取WHERE子句中的条件。首先,确保安装了sqlparse库。如果未安装,可以使用pip安装:bash复制代码pipins......
  • thinkphp6----where查询
    几种常见的where查询:1、关联数组查询$where=['user_id'=>1,'phone'=>'18311010011','is_delete'=>1];$result=Db::name('user_card')->where($where)->select();2、索引数组查询$where=[['id'......