LEFT JOIN条件在on后面和在where后面的区别及说明

 更新时间:2023年09月01日 09:39:53   作者:夜白宋  
这篇文章主要介绍了LEFT JOIN条件在on后面和在where后面的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、left join 的实际运用

left join 一般用于显示左边所有数据,并携带右表的数据;

而在on后面进行条件过滤,只会过滤掉右表条件不为真的数据,左表数据一定会显示;

在where后面进行条件过滤,是对左表右表的结果表进行过滤,所以数据不一定能完全显示。

二、两表联查SQL区别

存在数据表test1, test4

test1:

在这里插入图片描述

test4:

在这里插入图片描述

1、在on后面补全条件

select * from test1 left join test4 on test1.id = test4.id and test4.is_effective = 1

在这里插入图片描述

可以发现test1中的数据全部被读取,test4中过滤了is_effective != 1的数据

2、在where后面补全条件

select * from test1 left join test4 on test1.id = test4.id where test4.is_effective = 1

在这里插入图片描述

可以发现只显示了test1中的id为1的数据内容。

三、三表联查SQL区别

存在test1,test2,test3三张表,其中test3是test1和test2的中间表

test1:

在这里插入图片描述

test2:

在这里插入图片描述

test3:

在这里插入图片描述

某些业务中,我们会使用中间表查询数据,如果存在业务,要显示test1中的全部数据,并携带test2中的有效数据,我们一般会采用left join 去完成sql,而这时需要注意应该将test2和test3的结果表作为整个右表,才能正常完成业务。

1.错误示范:

1.1 连续使用left join,on后面过滤条件

SELECT
	* 
FROM
	test1
	LEFT JOIN test3 ON test1.id = test3.id1
	LEFT JOIN test2 ON test2.id = test3.id2 and is_effective = 1

在这里插入图片描述

会查出test1中的重复数据

1.2 连续使用left join,where后面过滤条件

SELECT
	* 
FROM
	test1
	LEFT JOIN test3 ON test1.id = test3.id1
	LEFT JOIN test2 ON test2.id = test3.id2 
WHERE
	is_effective = 1

在这里插入图片描述

无法完全显示test1中的数据

2.正确操作 

2.1将test2和test3作为整个右表查询

SELECT
	* 
FROM
	test1
	LEFT JOIN ( SELECT * FROM test2 INNER JOIN test3 ON test2.id = test3.id2 WHERE is_effective = 1 ) b ON test1.id = b.id1

在这里插入图片描述

正常完成查询

四、结论

1.用left join 进行条件过滤时,on条件只会对右表进行条件过滤,不会对左表数据产生任何影响;

2.用left join 进行条件过滤时,where条件会对结果表进行条件过滤,所以会对左表数据产生影响;

3.用inner join 用on和where没有任何区别

好了,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • CentOS 7 安装Percona Server+Mysql

    CentOS 7 安装Percona Server+Mysql

    这篇文章主要介绍了CentOS 7 安装Percona Server+Mysql的相关资料,需要的朋友可以参考下
    2018-11-11
  • windows下忘记MySQL密码的修改方法

    windows下忘记MySQL密码的修改方法

    这篇文章主要介绍了windows下忘记MySQL密码的修改方法,需要的朋友可以参考下
    2014-03-03
  • mysql下普通索引和唯一索引的效率对比

    mysql下普通索引和唯一索引的效率对比

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快
    2010-12-12
  • MySQL中查询当前时间间隔前1天的数据

    MySQL中查询当前时间间隔前1天的数据

    实际项目中我们都会遇到分布式定时任务执行的情况,今天通过本文给大家分享MySQL中查询当前时间间隔前1天的数据,查询sql语句给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧<BR>
    2021-12-12
  • Mysql5.7并发插入死锁问题解决

    Mysql5.7并发插入死锁问题解决

    死锁是数据库并发控制中的一种现象,它涉及多个事务在执行过程中相互等待对方占有的资源,导致无法继续执行,本文就来介绍一下Mysql5.7并发插入死锁问题解决,感兴趣的可以了解一下
    2024-09-09
  • MySQL通过binlog实现恢复数据

    MySQL通过binlog实现恢复数据

    在MySQL中,如果不小心删除了数据,可以利用二进制日志(binlog)来恢复数据,本文将通过几个示例为大家介绍一下具体实现方法,希望对大家有所帮助
    2025-01-01
  • 浅谈MySQL中用什么数据类型存IP地址

    浅谈MySQL中用什么数据类型存IP地址

    MySQL中用什么数据类型存IP地址?在MySQL中,当存储IPv4地址时,应该使用32位的无符号整数来存储IP地址,而不是使用字符串,本文就介绍一下这几种情况,感兴趣的可以了解一下
    2023-08-08
  • MySQL中MTR的概念

    MySQL中MTR的概念

    这篇文章主要介绍了MySQL中MTR的概念,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL错误代码2058和2059的解决办法

    MySQL错误代码2058和2059的解决办法

    这篇文章主要介绍了MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,下面就来介绍一下解决方法,感兴趣的可以了解一下
    2025-03-03
  • MySql中数据表增加字段很慢问题及解决

    MySql中数据表增加字段很慢问题及解决

    这篇文章主要介绍了MySql中数据表增加字段很慢问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论