在以前做机房收费系统的时候,遇到一个问题查询是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值会被忽略,这是需要特别注意的地方。