SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
AND product.amount=200;
+
| id | amount | id | weight | exist |
+
| 1 | 100 | NULL | NULL | NULL |
| 2 | 200 | 2 | 22 | 0 |
| 3 | 300 | NULL | NULL | NULL |
| 4 | 400 | NULL | NULL | NULL |
+
同样,所有来自product表的数据行都被检索到了,有一条数据匹配到了。
AND没有WHERE那么干脆,WHERE直接过滤掉右边表中为null的数据。
使用 WHERE … IS NULL 子句的 LEFT JOIN 这个有点不太理解
如前所述,WHERE 条件查询发生在 匹配阶段之后,这意味着 WHERE … IS NULL 子句将从匹配阶段后的数据中过滤掉不满足匹配条件的数据行。
纸面上看起来很清楚,但是当你在 ON 子句中使用多个条件时就会感到困惑了。
我总结了一种简单的方式来理解上述情况:
- 将 IS NULL 作为否定匹配条件
- 使用 !(A and B) == !A OR !B 逻辑判断
看看下面的示例: