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

left join 后用 on 还是 where?

时间:2025-01-10 23:48:35浏览次数:1  
标签: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

相关文章

  • 【Spark SQL】Join连接条件使用or导致运行慢
    现象运行的SQL示例如下selectt1.*fromedw.at1leftjoinedw.bt2on(t1.id=t2.idor((t1.idisnullort2.idisnull)andt1.phone=t2.phone))andt1.province=t2.provinceandt1.city=t2.cityandt1.type=t2.typewheret2.typeisnull;提交运行......
  • .join
    .join是JavaScript中数组对象的一个方法,用于将数组中的所有元素连接成一个字符串,并返回这个字符串。你可以指定一个分隔符来分隔数组中的元素,如果不指定分隔符,默认使用逗号(,)。基本用法javascriptarray.join(separator);separator:用于分隔数组元素的字符串。如果省略,数......
  • 【GreatSQL优化器-09】make_join_query_block
    【GreatSQL优化器-09】make_join_query_block一、make_join_query_block介绍GreatSQL优化器对于多张表join的连接顺序在前面的章节介绍过的best_access_path函数已经执行了,接着就是把where条件进行切割然后推给合适的表。这个过程就是由函数make_join_query_block来执行的。下......
  • wx.join1v1Chat
    wx.join1v1Chat(Objectobject)基础库2.20.1开始支持,低版本需做兼容处理。以Promise风格调用:支持用户授权:需要scope.record,&,camera小程序插件:不支持微信Windows版:支持微信Mac版:支持相关文档:双人音视频对话功能描述加入(创建)双人通话。参数Objectob......
  • wx.joinVoIPChat
    wx.joinVoIPChat(Objectobject)基础库2.7.0开始支持,低版本需做兼容处理。以Promise风格调用:支持用户授权:需要scope.record小程序插件:支持,需要小程序基础库版本不低于2.9.0微信Windows版:支持微信Mac版:支持相关文档:多人音视频对话功能描述加入(创建)......
  • js数组实例方法-lastIndexOf,join,keys,map
    Array.prototype.lastIndexOf()lastIndexOf()方法返回数组中给定元素最后一次出现的索引,如果不存在则返回-1。该方法从fromIndex开始向前搜索数组语法lastIndexOf(searchElement)lastIndexOf(searchElement,fromIndex)参数searchElement:被查找的元素fromIndex:以......
  • 供应链计划性能优化解决方案-Clickhouse本地Join
    作者:京东零售姜波前言本文主要针对供应链计划业务发展过程中系统产生的瓶颈问题的解决方案进行阐述,并且分享一些问题解决过程中用到的一些工具方法,希望对其他业务同类问题提供启发,原理细节不着重介绍,如有兴趣欢迎一起探讨。业务背景供应链计划业务目前数据库主要使用了Tidb和......
  • MYSQL中Join的用法.240430
    1、笛卡尔积(没有加筛选条件的内连接)两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。mysql>select*fromt1joint2;或者mysql>select*fromt1innerjoint2;或者mysql>select*fromt1,t2;2、左连接两表关联,左表全部保留,右表关联不上用null表......
  • SQL where条件(某字段N多个值)
    今天是2025年元旦,祝大家新年快乐!工作顺利,写代码如意随行......节日,没有出去溜达,依然在宿舍写程序,主要写的是SQL代码...下面分享在写代码时,其中一些细节与想法,如下一张表, 前端用户将会传入FileType字段一个或多个值给SQL去过渡上面这表的数据。如,Png,Jpeg,Gif,Bmp。此时,你会在SQL存......
  • 【Java并发编程线程池】 ForkJoinPool 线程池是什么 怎么工作的 和传统的ThreadPoolEx
    Java中的ForkJoinPool线程池是什么怎么工作的Java中的ForkJoinPool线程池是什么怎么工作的相比较于传统的线程池,ForkJoinPool线程池更适合处理大量的计算密集型任务,它的核心思想是将一个大任务拆分成多个小任务,然后将这些小任务分配给多个线程去执行,最后将这些小任务的......