SQL 语句中 left join 后用 on 还是 where,区别大了!

这篇具有很好参考价值的文章主要介绍了SQL 语句中 left join 后用 on 还是 where,区别大了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

情况

小结

举例


情况

        前天写SQL时本想通过 A left B join 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 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

运行sql :

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

SQL 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

运行sql :

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

SQL 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

        数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

小结

在使用left jion时,on和where条件的区别如下:

        1、 on条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

        2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

举例

假设有两张表:

表1:tab1

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
30 CCC

两条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

SQL 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

2、再对中间表过滤where 条件:

tab2.name=’AAA’

SQL 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

第二条SQL的过程:

1、中间表on条件:

tab1.size = tab2.size and tab2.name=’AAA’

(条件不为真也会返回左表中的记录)

SQL 语句中 left join 后用 on 还是 where,区别大了!,后端,sql,数据库,oracle

        其实以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

转自:jcpp9527

https://blog.csdn.net/wqc19920906/article/details/79785424文章来源地址https://www.toymoban.com/news/detail-634590.html

到了这里,关于SQL 语句中 left join 后用 on 还是 where,区别大了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL left join 和 left outer join 区别

    先说结论: left join 和 left outer join 的结果是一致的。 我不知道各位大神是怎么测试的,网上面就说两个不一样,我A、B表都是有重复数据的,为啥结果是一样的。 表A 表B 左连接 左外连接 以下MySQL官方文档的说明(2664页),outer join是为了某些第三方程序的兼容性而存在的。 微软

    2024年02月10日
    浏览(31)
  • MybatisPlus使用Left Join...on...一对多多表联查和Ipage分页返回数据问题

    问题: 一对多关系表使用MybatisPlus的Ipage进行分页查询,会先执行联表查询sql语句,然后进行分页。  像图中联表查询一对多关系,会有多条重复数据,使用Ipage分页会将这10条数据返回到xml中resultMap绑定的type。造成一页展示的数据少于10条。 针对这种我们采用子查询的方式解

    2024年02月13日
    浏览(28)
  • 关于Mysql使用left join写查询语句执行很慢的问题解决

    目录 (一)前言 (二)正文 1. 表结构/索引展示 (1)表结构 (2)各表索引情况 2. 存在性能问题的SQL语句 3. 解决思路 (1)执行计划思路调优 (2)字符集匹配调优 (三)总结 1. 关于执行计划中TYPE的性能比较 2. 关于left join优化 3. 其他注意点 这几天供应商在测试环境上使

    2024年02月02日
    浏览(33)
  • Mysql join加多条件与where的区别

    最近在项目中遇到一个问题,感觉有点意思,在解决问题及查阅了相关资料后,打算写篇文章给朋友们分享一下。 问题现象: 问题是很常见的空指针问题,后端查询数据库数据,遍历进行相关业务处理时报空指针。通过断点调试发现问题就出在查询回来的数据上,返回的L

    2024年02月11日
    浏览(30)
  • SQL联表查询LEFT JOIN 数据去重复

    使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 解决方法: 将查询结果作为中间表,使用group by 进行去重 如果想对group by后的数据计算count,可以将查询结果作为中间表再计算count

    2024年02月11日
    浏览(33)
  • SQL中的——左连接(Left join)、右连接(Right join)、内连接(Inner join)

    最近有一个开发需求,需要实现一个复杂年度报表,前后端都是博主开发,这里的业务逻辑比较复杂,也很锻炼sql能力,这里博主也将表的内外连接做了一个整理分享给大家 首先还是介绍一下这三个的定义 1.Left join:即 左连接 ,是以左表为基础,根据ON后给出的两表的条件

    2024年02月12日
    浏览(34)
  • sql Left Join 关联多条数据情况下只取一条数据

    存在b表中foreign_key多条关联a表中的id 需要只取b表中的一条数据(例如取最新的时间的一条) 1.解决方式:使用ROW_NUMBER () over()新增一列编号,排序后对新增列进行筛选 2.解决方式:使用listagg函数多列转一行,再结合substr函数截取最后一条

    2024年02月06日
    浏览(32)
  • SQL中的where语句的使用

    `WHERE`语句用于在SQL查询中过滤行,只返回满足特定条件的行。下面是一些常用的`WHERE`语句的例子,假设有三个表:`users`,`products`和`orders`。 1. 简单的WHERE子句 这条语句将从`users`表中选择所有年龄大于18岁的用户。 2. 使用AND和OR运算符的WHERE子句 这条语句将从`products`表中选

    2024年02月16日
    浏览(37)
  • hive 谓词下推实例分析(on与where的区别)

    t1 表 t2 表 t1 left join t2 t1 left join t2 on a.id=b.id where a.dt =‘01’,保留表谓词下推,map端提前过滤 t1 left join t2 on a.id=b.id and a.dt =‘01’,保留表非谓词下推,reduce端过滤 说明 :保留表应用谓词下推,提前过滤,会把不符合条件的数据提前过滤掉;保留表不应用谓词下推,不提前

    2024年02月09日
    浏览(34)
  • SQL 语句中 WHERE 1=1 的作用

    你是否曾在 SELECT 查询中看到过 WHERE 1=1 条件。我在许多不同的查询和许多 SQL 引擎中都有看过。这条件显然意味着 WHERE TRUE,所以它只是返回与没有 WHERE 子句时相同的查询结果。此外,由于查询优化器几乎肯定会删除它,因此对查询执行时间没有影响。那么,WHERE 1=1 的作用是

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包