mysql> show columns in m like 'fld';
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| fld | varchar(45) | YES | MUL | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.02 sec)
mysql> show columns in i like 'fld';
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| fld | varchar(45) | YES | MUL | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.02 sec)
mysql> select count(distinct fld) from i;
+---------------------+
| count(distinct fld) |
+---------------------+
| 27988 |
+---------------------+
1 row in set (0.03 sec)
mysql> select count(distinct fld) from m;
+---------------------+
| count(distinct fld) |
+---------------------+
| 72558 |
+---------------------+
1 row in set (0.07 sec)
根据我对相关表格的了解,上述结果似乎是合理的。
mysql> select count(*) from m where fld not in (select fld from i);
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.11 sec)
最后的结果似乎不合理。 m
中的There must be 行fld
中的某些行,i
不在0
!有人可以解释为什么我得到mysql> select count(*) from m where fld is null;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
作为结果吗?
为了完整性(因为我怀疑它可能是相关的),我也会粘贴这个结果:
select count(*) from m join i using (fld)
编辑:在回复评论时,我正在编辑以下信息,以防有人回答我的问题:
left join
收益9350;与right join
,73087;与select count(*) from i where fld is null
,28872。答案 0 :(得分:1)
我现在已经明白了。 The documentation读到:
为符合SQL标准,
IN
不仅返回NULL
左侧的表达式为NULL
,而且如果列表中未找到匹配项,则返回NULL
列表中的表达式是fld not in
。
因此,not fld in
(即not null
)只要在派生表格中出现null
,就会返回null
(即fld
)在这里)并且在派生表中找不到(select fld from i where fld is not null)
(这是我正在测试的)。
可能有一个比这更好的解决方法,但我使用{{1}}。