在MySQL中意外的NOT EQUAL TO NULL比较

时间:2017-10-16 17:15:40

标签: mysql

我在MySQL中有下表。

city_data
+------+-----------+-------------+
|  id  | city_code | city_name   |
+------+-----------+-------------+
| 4830 | BHR       | Bharatpur   |
| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
| 4834 | NULL      | Shirdi      |
+------+-----------+-------------+

以下查询。

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

我期待3行。

| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
| 4834 | NULL      | Shirdi      |
+------+-----------+-------------+

但只能获得2行。

| 4831 | KEP       | Nepalgunj   |
| 4833 | OHS       | Sohar       |
+------+-----------+-------------+

我无法理解为什么行

| 4834 | NULL      | Shirdi      |

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

请有人帮忙解决疑问。

3 个答案:

答案 0 :(得分:2)

根据MySQL Reference Manual, section 3.3.4.6: Working with NULL values,以下是原因:

  

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

     

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

这意味着NULL != 'BHR'将评估为NULL,这反过来意味着false到MySQL。要使查询按您的方式工作,您必须将OR city_code IS NULL附加到查询中。

答案 1 :(得分:0)

您无法将空值与!=进行比较,因为它为空,请改用IS NULL谓词:

select id,city_code,city_name 
from city_data 
where city_code != 'BHR' OR city_code IS NULL;

答案 2 :(得分:0)

无法使用比较运算符测试NULL值,例如=,<或<>。因此查询很容易混淆,并且忽略了NULL记录。欲了解更多信息,请转到https://www.w3schools.com/sql/sql_null_values.asp