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

| 我以为这两个查询是相同的。但是结果表明,第一个查询的约束条件是从四个有效的AND开始,返回了许多带有左联接的错误行。第二个查询中的结果看起来正确。 谁能解释这两个查询之间的区别? 这个问题与此类似,但是我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 =>连接必须成功。 第一个查询将所有联接逻辑作为“ 2”的一部分,将包括第一个表中的所有行与第二个表中的那些行的连接-对于第二个表字段,如果不能进行联接,则为NULL。 第二个查询将不包含第一个表中未连接到第二个表的行。     

要回复问题请先登录注册