mysql - 这两个mysql查询之间的区别?

标签 mysql join where

我认为这两个查询是相同的。但结果证明,以四个 AND 开始的第一个查询的约束起作用了,返回了许多左连接的错误行。第二个查询的结果看起来是正确的。 谁能解释这两个查询之间的区别是什么? 这个问题与 this one 类似, 但我 100% 肯定结果是不同的。

       SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
       FROM UnitInfo uinfo
       LEFT JOIN 
       UnitUpdateInfo upd
       ON uinfo.serial_number = upd.serial_number
       AND substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')  
       AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
       AND upd.objtype ='HEEN' 
       AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'   


       SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
       FROM UnitInfo uinfo
       LEFT JOIN 
       UnitUpdateInfo upd
       ON uinfo.serial_number = upd.serial_number
       WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')  
       AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
       AND upd.objtype ='HEEN' 
       AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'

[编辑]
第二个查询与:

       SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
       FROM UnitInfo uinfo
       INNER JOIN 
       UnitUpdateInfo upd
       ON uinfo.serial_number = upd.serial_number
       WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')  
       AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
       AND upd.objtype ='HEEN' 
       AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'

最佳答案

一旦 LEFT JOIN 中的右侧表有字段进行比较,例如WHERE 子句中的相等性,它实际上变成了 INNER JOIN - 在您的查询中,您强制 UnitUpdateInfo 的 objtype 字段 为非 NULL => 连接必须成功。

第一个查询,将所有连接逻辑作为 LEFT JOIN 的一部分,将包括第一个表中的所有行,这些行连接到第二个表中的那些行 - 第二个表字段为 NULL,其中无法加入。

第二个查询将包括第一个表中未连接到第二个表的那些行。

关于mysql - 这两个mysql查询之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432502/

相关文章:

mysql - 在 Mysql 中使用正则表达式替换

c# - 使用 RIGHT JOINT 将两个表连接到一个数据 GridView 中

swift - 将 Range 和 StrideTo 转换为 Sequence 时出现特殊错误

php - 从选定列检索所有数据并存储

Python mySQL 更新,工作但不更新表

php - 需要mysql查询推荐

mysql - SQL-如何将两个表与具有不同条件的两个表计数组合起来

ios - 使用 "where"子句在 Swift 算法中生成可选类型

mysql - 如何将今年的第一个日期放在 WHERE 子句中。数据库

MySQL:存储过程语法错误