首页 > 其他分享 >left join 后用 on 还是 where?

left join 后用 on 还是 where?

时间:2024-08-21 08:53:41浏览次数:9  
标签:join 记录 tab2 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,size,where,id,left
From: https://www.cnblogs.com/shujuyr/p/18370879

相关文章

  • (八)Flink Join 连接
    在分布式数据处理中,JOIN是一个非常重要的操作。Flink的JOIN是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink双流JOIN主要分为两大类:一类是基于窗口的JOIN操作,另一类是基于原生State的Connect算子操作。其中基于窗口的JOIN可细分为WindowJoin......
  • Big Clique Everywhere 题解
    给个链接:BigCliqueEverywhere。先说一下团(clique)是什么,其实就是完全图。考虑什么情况下不满足题意。我们可以先建出补图,下面的东西都在补图中完成。我们首先给出结论:如果该图中有奇环(不是二分图),则条件不成立,否则成立。这里证明一下:如果存在奇环,则把点集设为这个奇环中的点,那......
  • 线程执行顺序 join()
    importlombok.SneakyThrows;importjava.util.concurrent.TimeUnit;publicclassT{@SneakyThrowspublicstaticvoidmain(String[]args){Objecto=newObject();Threadthread1=newThread(()->{try{......
  • 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'......
  • SQL Zoo 7.More JOIN operations
    以下数据均来自SQLZoo1.Listthefilmswherethe yr is1962[Show id, title](列出1962年的电影)SELECTid,titleFROMmovieWHEREyr=19622.Giveyearof'CitizenKane'.(给出《公民凯恩》的年份)selectyrfrommoviewheretitle='CitizenKane'3.List......
  • [Typescript] Using Variables Declared Elsewhere
    The declare keywordinTypeScriptallowsyoutospecifytypesforglobalvariables.Wheneveryouuseit,anambientcontextiscreated,whichmeansthatthevariableisinjectedwithoutneedingtoprovideanimplementation.Here'showwewoulduse de......
  • 【YashanDB数据库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to
    问题现象托管数据库时检查报错OM的IP是127.0.0.1,不支持托管到YCMOM问题的风险及影响导致数据库无法托管监控问题影响的版本问题发生原因安装数据库时修改了OM的监听ip为127.0.0.1解决方法及规避方式后台修改OM的ip为本机的ip或者0.0.0.0问题分析和处理过程1、修改en......
  • mysql中的left join、right join 、inner join的详细用法
     1.innerjoin,内连接,显示两个表中有联系的所有数据。当两个表中存在匹配的数据时,‌返回满足条件的SELECT结果。‌内连接只返回两个表中匹配的记录,‌如果某一方没有匹配的记录,‌则不会出现在结果集中。‌2.leftjoin,左链接,以左表为参照,显示所有数据,右表中没有则以null显示......
  • mysql中的left join、right join 、inner join的详细用法
    1.innerjoin,内连接,显示两个表中有联系的所有数据。    当两个表中存在匹配的数据时,‌返回满足条件的SELECT结果。‌内连接只返回两个表中匹配的记录,‌如果某一方没有匹配的记录,‌则不会出现在结果集中。‌2.leftjoin,左链接,以左表为参照,显示所有数据,右表中没有......