小编典典

Left Join / IS NULL如何消除一个表中存在而另一表中没有的记录?

sql

我很难理解为什么LEFT JOIN/要IS NULL消除一个表而不是另一个表中的记录。这是一个例子

SELECT  l.id, l.value
FROM    t_left l
LEFT JOIN t_right r
ON      r.value = l.value
WHERE   r.value IS NULL

为什么要r.value = NULL消除记录?我不理解
。我知道我缺少一些非常基本的东西,但目前我还无法弄清楚那个基本的东西。如果有人向我详细解释,我将不胜感激。

我想要一个非常基本的解释。


阅读 350

收藏
2021-03-23

共1个答案

小编典典

这可以用以下解释

mysql> select * from table1 ;
+------+------+
| id   | val  |
+------+------+
|    1 |   10 |
|    2 |   30 |
|    3 |   40 |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from table2 ;
+------+------+
| id   | t1id |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

这里 table1.id <-> table2.t1id

现在,当我们leftjoin使用连接键进行操作时,如果左边的表是table1,那么它将从table1获取所有数据,并且在table2的不匹配记录中将其设置为null

mysql> select t1.* , t2.t1id from table1 t1 
left join table2 t2 on t2.t1id = t1.id ;
+------+------+------+
| id   | val  | t1id |
+------+------+------+
|    1 |   10 |    1 |
|    2 |   30 |    2 |
|    3 |   40 | NULL |
+------+------+------+

3 rows in set (0.00 sec)

看到table1.id = 3在table2中没有值,因此将其设置为null当您应用where条件时,它将进行进一步的过滤

mysql> select t1.* , t2.t1id from table1 t1 
left join table2 t2 on t2.t1id = t1.id where t2.t1id is null;
+------+------+------+
| id   | val  | t1id |
+------+------+------+
|    3 |   40 | NULL |
+------+------+------+
1 row in set (0.00 sec)
2021-03-23