关于连接查询主要是左右连接查询中,where和on的区别
工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单的东西搞出来,已做记录
如下:(因为简化了大家可能觉得很简单,但是多张表放一块有可能会搞错,所以连接查询为自己设定个写代码的标准吧)
比如:
我想要的结果是
但是实际查出来的是如下很多
直接上重点
原因是两句sql语句的差别
第一个图的语句是SELECT * FROM d_device d LEFT JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` WHERE d.`company_id`='gdl'
第二个图的语句是:SELECT * FROM d_device d LEFT JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` AND d.`company_id`='gdl'
对,就是这两个不起眼的差别,在左右连接查询中,过滤条件d.`company_id`='gdl'没有起作用
如果用内连接查询结果一样
语句分别是:
SELECT * FROM d_device d INNER JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` AND d.`company_id`='gdl'
SELECT * FROM d_device d INNER JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` WHERE d.`company_id`='gdl'
结果均一样
为此,自己在以后写连接查询时候,定义一个原则,凡是跟两张表相关(表示两张表有引用关系)的比如 d.id=dub.id的语句放在on后面,凡是没关系的只是单表的过滤条件的则可以放在where后面即可减少或者避免很多麻烦。
网上查找原因分析:
在使用left join时,on and和on where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
可以参考如下博客详细了解:
1. https://blog.csdn.net/xingzhemoluo/article/details/39677891 点击打开链接
2.https://www.cnblogs.com/aspwebchh/p/6726181.html 点击打开链接
最新文章
- codevs 2830 蓬莱山辉夜
- C算法编程题(三)画表格
- C#复习④
- JQuery html API支持解析执行Javascript脚本功能实现-代码分析
- Google工程师打造Remix OS系统 桌面版安卓下载
- iOS之block块
- eclipse增加浏览器chrome
- Oracle 基础知识
- linux下单独安装oracle12.1客户端
- 优化器的使用oracle ---explain plan
- 写一篇 Bootstrap弹窗确认的文章。本周完成
- Bootstrap相关的网站
- Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
- full join no满连接的使用
- docker 创建docker用户组,应用用户加入用户组
- DBUtils数据库连接池
- Elasticsearch 整合spring(不是sprig boot)
- Postman无法正常启动解决办法
- Spring Security构建Rest服务-0600-SpringSecurity基本原理
- input必填