我们之前说过,null值在MySQL中是一种很特殊的情况,处理不好会影响查询数据库的速度。那么如果我们想查询表中值为 null的数据,应该怎么处理呢? 当提供的查询条件字段为NULL时,MySQL语句可能就无法正常工作。
处理这种情况,可以用三大运算符来查询:
- is null 当列的值是null ,会返回 true
- is not null 当列的值不为null,也会返回true
- <=> : 比较操作符 (不同于 = 运算符) ,当比较的两个值相等或者都为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字段,结果也是一样的。
好了,今天就先到这里吧。