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

标签 mysql sql left-join isnull

我很难理解为什么 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 消除记录?我不理解 。我知道我遗漏了一些非常基本的东西,但目前我什至无法弄清楚那个基本的东西。如果有人向我详细解释,我将不胜感激。

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

最佳答案

这可以用下面的解释

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

现在当我们做 left join使用连接键,如果左表是 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)

关于mysql - Left Join/IS NULL 如何消除一个表中存在而另一个表中没有的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29944271/

相关文章:

mysql - IF语句MYSQL中的SUBSTR()函数

MySQL排名查询和LEFT JOIN

mysql - 选择具有多个条件的多列

mysql - 如何选择评论数、投票总数以及活跃用户是否投票

r - 与 R 中的日期模糊连接

mysql - 如何根据条件从表中获取主键?

mysql - SQL:将两个查询组合成一个查询

mysql - 在 MySQL 数据库中存储货币值的最佳数据类型

sql - 数据建模 : Is it always necessary to use an intersection table?

ruby-on-rails - Rails ActiveRecord :joins with LEFT JOIN instead of INNER JOIN