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

时间:2011-06-21 21:56:53

标签: 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%'

1 个答案:

答案 0 :(得分:2)

只要LEFT JOIN中的右侧表格中的字段与在WHERE子句中,它实际上变为INNER JOIN - 在您的查询中,您强制objtype的{​​{1}}字段为非NULL =>连接必须成功。

第一个查询,将所有连接逻辑作为UnitUpdateInfo的一部分,将包括第一个表中连接到第二个表中的那些行的所有行 - 其中第二个表字段为NULL,其中连接为'可能。

第二个查询将包含第一个表中未加入第二个的那些行。