zoukankan      html  css  js  c++  java
  • 关于连接查询主要是左右连接查询中,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 点击打开链接

  • 相关阅读:
    1024 Calendar Game
    外存管理与文件系统(1)
    1008 Gnome Tetravex
    写给想用技术改变世界的年轻人by 沃兹
    为什么VS2008里没有Silverlight呢?
    QQ消息群发器实现原理及核心代码
    JavaScript检测多组Radio是否选择
    C#操作Excel(导入导出)
    String.Split 方法有6个重载函数:
    【原】Ext2.2学习系列:ExtJS与.NET结合开发实例全部Ext2.2示例索引贴 (共收录56篇文章)
  • 原文地址:https://www.cnblogs.com/xiaoyao-001/p/9184799.html
Copyright © 2011-2022 走看看