sql查询中的null

来源:互联网 发布:centos开机启动命令 编辑:程序博客网 时间:2024/05/16 07:40

在以前做机房收费系统的时候,遇到一个问题查询是null指的数据,是这样写的

select * from student where id=null

数据库明明是有数据的,但是却查询不出来。当时不知道内部执行到底是怎样的,所以也就放弃了。后来在学习中慢慢明白了其中的原理,也就一直没有记录下来。现在说一下其中的原理。

如果一个字段没有被赋值,那么它的值就是null,null值并不代表没有值,而是表示值是未知的,只是这个值我们暂时还不知道。

由于null在数据库是比较特殊的,所以涉及到null的一些处理中也会存在一些需要注意的地方:

NULL与比较运算符

因为null表示未知的值,因此在使用比较运算符的时候就需要注意null值可能造成的Bug。

比如下面的sql语句

select * from t_employee t wheret.fsalary<5000;

这句sql语句是查询不出来fsalary字段值为null的数据的,因为null值代表的是未知,那么用未知的数和5000比较,能说未知的数小于5000么?显然不能。

那这样呢

select * from t_employee t wheret.fsalary<5000 or ft. fsalary>=5000;

这样写也是不行的。未知的数显然不符合小于5000或者大于等于5000的。

那么如何查询出来fsalary字段中的null值呢?

select * from t_employee t where t. fsalaryis null;

这样就能查询出来我们想要的结果。

NULL和计算字段

select t.fid,t.fsalary+2000 from t_employee;

执行完这个sql语句就会发现,原来fsalary字段为null的值,经过计算以后,值还是为null。

原理还是这样,因为未知的数加上2000得到的结果仍然是未知的。

所以如果null值出现在任何计算字段中,得到的结果永远为null。

NULL和聚合函数

和普通的函数不同,如果null值出现在聚合函数中,那么NULL值将会被忽略,可以用聚合函数max来进行试验。

select max(t.salary) from t_employee t;

按照前面的逻辑分析,一个包含NULL值在内的所有员工工资的最大值和最小值应该是未知的null,不过聚合函数是一个例外,null值会被忽略,这是需要特别注意的地方。

0 0
原创粉丝点击