(六)MySQL中查询null值的一般做法

时间:2022-10-05 16:58:21

我们之前说过,null值在MySQL中是一种很特殊的情况,处理不好会影响查询数据库的速度。那么如果我们想查询表中值为 null的数据,应该怎么处理呢? 当提供的查询条件字段为NULL时,MySQL语句可能就无法正常工作。

  处理这种情况,可以用三大运算符来查询:

  1. is null  当列的值是null ,会返回 true
  2. is not null 当列的值不为null,也会返回true
  3. <=> : 比较操作符 (不同于 = 运算符) ,当比较的两个值相等或者都为null时,返回 true


null的条件比较运算是比较特殊的,不能使用 = null 或者 != null在列中查找null值。MySQL中,null值与任何其它值的比较(即使是null),永远返回null

处理null需要使用IS NULL 和 IS NOT NULL


我们来具体看下实例:

之前一直用的teacher和course表中都没有null值,我们需要给表中插入一些

null值。插入的时候需要先看下表中字段创建时是否定义了不能为空。如果定义了not null,则不能插入null值。

mysql> insert into course (name) values (null),(null);

ERROR 1048 (23000): Column 'name' cannot be null

可以看到,course表中的name字段不能为空,所以不能插入null值

查下course表和teacher表中对各字段的定义:

mysql> show columns from course;

+-------+------------------+------+-----+---------+----------------+

| Field | Type  | Null | Key | Default | Extra |

+-------+------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO  | PRI | NULL | auto_increment |

| name | varchar(100)  | NO  |  | NULL | |

+-------+------------------+------+-----+---------+----------------+

2 rows in set (0.01 sec)

可以看出,course表中id和name都不能为空


mysql> show columns from teacher;

+--------+--------------+------+-----+---------+-------+

| Field | Type  | Null | Key | Default | Extra |

+--------+--------------+------+-----+---------+-------+

| id  | int(11) | NO  | PRI | NULL |  |

| name  | varchar(100) | YES |  | NULL |  |

| time  | date  | YES |  | NULL |  |

| scores | int(11) | YES |  | NULL |  |

+--------+--------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

可以看出,teacher表中除了id不能为空,其它字段都可以为空


mysql> insert into teacher (id,name,time,scores) values (11,null,null,92);

Query OK, 1 row affected (0.01 sec)

插入包含null值的数据

我们查一下:

mysql> select * from teacher;

+----+--------+------------+--------+

| id | name  | time  | scores |

+----+--------+------------+--------+

| 1 | 张三  | 2020-06-28 |  77 |

| 2 | 李四  | 2020-06-28 |  88 |

| 3 | 王五  | 2020-06-28 |  66 |

| 4 | 赵六  | 2020-06-28 |  49 |

| 5 | 张三  | 2020-06-29 |  81 |

| 6 | 胡八  | 2020-06-29 |  92 |

| 7 | 柳九  | 2020-06-29 | 100 |

| 8 | 王五  | 2020-06-29 |  28 |

| 11 | NULL  | NULL  |  92 |

+----+--------+------------+--------+

9 rows in set (0.00 sec)


我们先使用 = 和 != 来查询表中是否有null值

mysql> select * from teacher where name = null;

Empty set (0.02 sec)


mysql> select * from teacher where time != null;

Empty set (0.00 sec)

可以看粗,即使表中有null值,= 和 != 查不到


mysql> select * from teacher where name is null;

+----+------+------+--------+

| id | name | time | scores |

+----+------+------+--------+

| 11 | NULL | NULL |  92 |

+----+------+------+--------+

1 row in set (0.01 sec)

用了is null,可以查出来了


mysql> select * from teacher where name is not null;

+----+--------+------------+--------+

| id | name  | time  | scores |

+----+--------+------------+--------+

| 1 | 张三  | 2020-06-28 |  77 |

| 2 | 李四  | 2020-06-28 |  88 |

| 3 | 王五  | 2020-06-28 |  66 |

| 4 | 赵六  | 2020-06-28 |  49 |

| 5 | 张三  | 2020-06-29 |  81 |

| 6 | 胡八  | 2020-06-29 |  92 |

| 7 | 柳九  | 2020-06-29 | 100 |

| 8 | 王五  | 2020-06-29 |  28 |

+----+--------+------------+--------+

8 rows in set (0.01 sec)

再试下 is not null ,哪些数据不为空,返回数据结果也是正确的


mysql> select * from teacher where time is null;

+----+------+------+--------+

| id | name | time | scores |

+----+------+------+--------+

| 11 | NULL | NULL |  92 |

+----+------+------+--------+

1 row in set (0.00 sec)


mysql> select * from teacher where time is not null;

+----+--------+------------+--------+

| id | name  | time  | scores |

+----+--------+------------+--------+

| 1 | 张三  | 2020-06-28 |  77 |

| 2 | 李四  | 2020-06-28 |  88 |

| 3 | 王五  | 2020-06-28 |  66 |

| 4 | 赵六  | 2020-06-28 |  49 |

| 5 | 张三  | 2020-06-29 |  81 |

| 6 | 胡八  | 2020-06-29 |  92 |

| 7 | 柳九  | 2020-06-29 | 100 |

| 8 | 王五  | 2020-06-29 |  28 |

+----+--------+------------+--------+

8 rows in set (0.00 sec)

我们再用下time字段,结果也是一样的。


好了,今天就先到这里吧。   

(六)MySQL中查询null值的一般做法