MySQL 中意外的 NOT EQUAL TO NULL 比较

shu*_*511 3 mysql

我在 MySQL 中有下表。

city_data
+------+-----------+-------------+
|  id  | city_code | city_name   |
+------+-----------+-------------+
| 4830 | BHR       | Bharatpur   |
| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
| 4834 | NULL      | Shirdi      |
+------+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

和下面的查询。

从 city_data 中选择 id、city_code、city_name,其中 city_code != 'BHR';

我本来期待 3 排。

| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
| 4834 | NULL      | Shirdi      |
+------+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

但只得到 2 行。

| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
+------+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么行

| 4834 | NULL      | Shirdi      |
Run Code Online (Sandbox Code Playgroud)

不包含在我的查询结果中。应该已经传递了 where 条件(NULL != 'BHR')。

请哪位大神帮忙解疑一下。

Per*_*uss 5

根据MySQL 参考手册,第 3.3.4.6 节:使用 NULL 值,原因如下:

由于与 NULL 的任何算术比较的结果也是 NULL,因此您无法从此类比较中获得任何有意义的结果。

在 MySQL 中,0 或 NULL 表示 false,其他任何值表示 true。布尔运算的默认真值是 1。

这意味着NULL != 'BHR'将计算为NULL,而这又意味着falseMySQL。为了使查询按您想要的方式工作,您必须附加OR city_code IS NULL到查询中。