关于NULL

来源:互联网 发布:源码商城开发公司 编辑:程序博客网 时间:2024/05/22 06:41
在写sql的时候经常可能因为NULL的原因造成查询的结果并不是真正想要的。
许多人都知道数据库其实是三值逻辑,即真、假、NULL。


CREATE TABLE BASE_PERSON(
ID INTEGER,
NAME VARCHAR2(30)
);


HUANG>>>>INSERT INTO BASE_PERSON VALUES(1,'huang');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(2,'guagua');
HUANG>>>>INSERT INTO BASE_PERSON VALUES(null,'zheng');


HUANG>>>>commit;
HUANG>>>>select * from base_person;


        ID NAME                                                                                                                                                                                                                                                                                            
---------- ------------------------------------------------------------                                                                                                                                                                                                                      
         1 huang                                                                                                                                                                                                                                                                                            
         2 guagua                                                                                                                                                                                                                                                                                          
            zheng    
  
HUANG>>>>select * from base_person where id=1;
        ID NAME                                                                                                                                                                                                                                                                                            
---------- ------------------------------------------------------------ 
         1 huang  
 
HUANG>>>>select * from base_person where id<>1;
        ID NAME                                                                                                                                                                                                                                                                                            
---------- ------------------------------------------------------------ 
         2 guagua   
 
HUANG>>>>select * from base_person where id is null;
        ID NAME                                                                                                                                                                                                                                                                                            
---------- ------------------------------------------------------------  
           zheng 
  
这下清楚了吧,呵呵,许多开发人员以为当条件为id<>1时查询结果会有id为2和id为null的数据。
实际上id为null的数据不会查出来,原因是在数据库中任何和null的操作结果都是null不会是真或者假,
即任何和未知的比较结果任然是未知。   




在实际的生产中,可能因为sql变得复杂点,null的特殊性容易被忽视,举个例子吧。
(这个例子直接拿了itput上一个人的例子)
update cr_vip_bkg_view_load d
set d.total_cntr_qntt=null,
d.total_cntr_qntt_20=null,
d.total_cntr_qntt_40=null,
d.total_cntr_qntt_40_hq=null,
d.total_cntr_qntt_45_hq=null
where rowid not in
(select max(rowid)
from cr_vip_bkg_view_load d
where (d.cntr_check_digit not like '%*%' or
  d.cntr_check_digit is null))
group by d.bkg_num,d.svc_prod_comp_id);


如果这个sql没有d.cntr_check_digit is null这个条件在里面的话,这样的sql很危险,更新的内容会比想要的多。










   
原创粉丝点击