ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql中NULL大坑

2020-12-14 12:57:23  阅读:221  来源: 互联网

标签:大坑 sec select mysql ----- NULL -----+


mysql中NULL大坑

参考网址:

建表规范

https://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247490967&idx=2&sn=fc92dc46ad2b6b2c2964c06f6277c4f7&chksm=fddecb53caa94245107a004935add8c0ccb059830f61d31ef404d172c3b07f87c0f576aa9a62&mpshare=1&scene=23&srcid=0923GipnyxKQhFHoObIlFU9W&sharer_sharetime=1600911081363&sharer_shareid=9d1e76e919cc0b2f3ca23ed1f5ef67a8#rd

说明:

mysql建表规约是不允许列的值为NULL的

NULL存在的坑
我们先看⼀下效果,然后在解释,⽰例如下:
mysql> create table test5 (a int not null,b int,c varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test5 values (1,2,‘a’),(3,null,‘b’),(4,5,null);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test5;
±–±-----±-----+
| a | b | c |
±–±-----±-----+
| 1 | 2 | a |
| 3 | NULL | b |
| 4 | 5 | NULL |
±–±-----±-----+
3 rows in set (0.00 sec)
上⾯我们创建了⼀个表test5,3个字段,a不能为空,b、c可以为空,插⼊了3条数据,睁
⼤眼睛看效果了:
mysql> select * from test5 where b>0;
±–±-----±-----+
| a | b | c |
±–±-----±-----+
| 1 | 2 | a |
| 4 | 5 | NULL |
±–±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test5 where b<=0;
Empty set (0.00 sec)
mysql> select * from test5 where b=NULL;
Empty set (0.00 sec)
mysql> select * from test5 t where t.b between 0 and 100;
±–±-----±-----+
| a | b | c |
±–±-----±-----+
| 1 | 2 | a |
| 4 | 5 | NULL |
±–±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test5 where c like ‘%’;
±–±-----±-----+
| a | b | c |
±–±-----±-----+
| 1 | 2 | a |
| 3 | NULL | b |
±–±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test5 where c in (‘a’,‘b’,NULL);
±–±-----±-----+
| a | b | c |
±–±-----±-----+
| 1 | 2 | a |
| 3 | NULL | b |
±–±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test5 where c not in (‘a’,‘b’,NULL);
Empty set (0.00 sec)
认真看⼀下上⾯的查询:
上⾯带有条件的查询,对字段b进⾏条件查询的,b的值为NULL的都没有出现。
对c字段进⾏like '%'查询、in、not查询,c中为NULL的记录始终没有查询出来。
between and查询,为空的记录也没有查询出来。
结论:查询运算符、like、between and、in、not in对NULL值查询不起效。
那NULL如何查询呢?继续向下看
IS NULL/IS NOT NULL(NULL值专⽤查询)
上⾯介绍的各种运算符对NULL值均不起效,mysql为我们提供了查询空值的语法:IS
NULL、IS NOT NULL。
IS NULL(返回值为空的记录)
select 列名 from 表名 where 列 is null;
查询指定的列的值为NULL的记录。
如:
mysql> create table test7 (a int,b varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test7 (a,b) values (1,‘a’),(null,‘b’),(3,null),
(null,null),(4,‘c’);
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from test7;
±-----±-----+
| a | b |
±-----±-----+
| 1 | a |
| NULL | b |
| 3 | NULL |
| NULL | NULL |
| 4 | c |
±-----±-----+
5 rows in set (0.00 sec)
mysql> select * from test7 t where t.a is null;
±-----±-----+
| a | b |
±-----±-----+
| NULL | b |
| NULL | NULL |
±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test7 t where t.a is null or t.b is null;
±-----±-----+
| a | b |
±-----±-----+
| NULL | b |
| 3 | NULL |
| NULL | NULL |
±-----±-----+
3 rows in set (0.00 sec)
IS NULL(返回值不为空的记录)
select 列名 from 表名 where 列 is not null;
查询指定的列的值不为NULL的记录。
如:
mysql> select * from test7 t where t.a is not null;
±-----±-----+
| a | b |
±-----±-----+
| 1 | a |
| 3 | NULL |
| 4 | c |
±-----±-----+
3 rows in set (0.00 sec)
mysql> select * from test7 t where t.a is not null and t.b is not
null;
±-----±-----+
| a | b |
±-----±-----+
| 1 | a |
| 4 | c |
±-----±-----+
2 rows in set (0.00 sec)
<=>(安全等于)
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低,⽤得较少
⽰例:
mysql> create table test8 (a int,b varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test8 (a,b) values (1,‘a’),(null,‘b’),(3,null),
(null,null),(4,‘c’);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from test8;
±-----±-----+
| a | b |
±-----±-----+
| 1 | a |
| NULL | b |
| 3 | NULL |
| NULL | NULL |
| 4 | c |
±-----±-----+
5 rows in set (0.00 sec)
mysql> select * from test8 t where t.a<=>null;
±-----±-----+
| a | b |
±-----±-----+
| NULL | b |
| NULL | NULL |
±-----±-----+
2 rows in set (0.00 sec)
mysql> select * from test8 t where t.a<=>1;
±-----±-----+
| a | b |
±-----±-----+
| 1 | a |
±-----±-----+
1 row in set (0.00 sec)
可以看到<=>可以将NULL查询出来。
经典⾯试题
下⾯的2个sql查询结果⼀样么?
select * from students;
select * from students where name like ‘%’;
结果分2种情况:
当name没有NULL值时,返回的结果⼀样。
当name有NULL值时,第2个sql查询不出name为NULL的记录。

总结

• like中的%可以匹配⼀个到多个任意的字符,_可以匹配任意⼀个字符
• 空值查询需要使⽤IS NULL或者IS NOT NULL,其他查询运算符对NULL值⽆效
建议创建表的时候,尽量设置表的字段不能为空,给字段设置⼀个默认值
<=>(安全等于)玩玩可以,建议少使⽤
• sql⽅⾯有问题的欢迎留⾔?或者加我微信itsoku交流。

标签:大坑,sec,select,mysql,-----,NULL,-----+
来源: https://blog.csdn.net/shaoming314/article/details/111162520

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有