一个SQL的bug:值为null的字段处理

     今天同事问了一个问题,要查询某个字段,将这个字段不为某个值得数据全部查询处理,给的SQL是这样的:select * from table where column not like '%abc%',但是结果中却将为null的记录给忽略了。原来null值与数字或字符是有一定区别的,解决方法用is null 来匹配改行。

          虽然方法找到了,但是对该问题还是不太理解,以下是在网上找的相关资料,解释的比较详细:null 值与数字、字符的不同的7点:

                   1:普通的值一般都可能进行运算符操作,例如:ID列为int,所以可以这样:ID=ID+1等,但如果一列的值为null,null+1=null,就是说null与任何运算符运算后都为null,这就是大家说的黑洞,会吃掉所有的东西.
        update testNull
 set b=b+1
 where b is null

                           结论:查询后发现b的值没有变化,仍然为null.

 

                   2:普通的值可以进行"="操作,例如条件中一般都会这样出现:sUserName='张三',如果sUserName的值为null,要想找出所有名字为null的记录时,不能这样用:sUserName=null,因为null不是一个具体的值,任何值与它比较时都会返回false.此时可借用is null 或者是is not null.

       

                  示例查询:

                            1:select * from testNull where a=null --返回空结果集
           
                            2:select * from testNull where b is null --返回结果集 2 2 NULL

                            结论:说明null是不能用"="来比较,可用is null来替换

 

                   3:在用统计函数count时会不同,例如count(ID):统计记录数.当统计的记录中的包含有null值时,它会忽略null值.

                       示例查询:

 

                            1:select count(*),count(b) from testNull 它的返回值为2 1
                            2: select count(*),count(isnull(b,'')) from testNull 它的返回值为2 2

                            结论:对于列包含null 时,统计行数是可用count(*),或者是先把null值转换成对应的值再统计,例如count(isnull(b,''));

 

                   4:对于in 的影响不同.

                      示例查询: 查询testNull表中b的值包含在null中的记录.

 

            select * from testNull
where b in(null) --没有任何记录
                           结论:in在查询时会忽略null的记录,查询的时候可用is not null来查询.

                    5:排序时顺序有不同:当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。
                        1:select * from testNull
                            1 1 ''
                            2 2 NULL
                        2:select * from testNull order by b
                             2 2 NULL
                             1 1 ''
                         3:select * from testNull order by b desc
                             1 1 ''

                             2 2 NULL

 

                      6:当使用GROUP BY时,所有的NULL值被认为是相等的。这时先多插入几条数据,方便查看结果.
           insert into testNull
values('3',null)
         values('4','4')
select * from testNull
           select count(b) from testNull
group by b
                         返回结果:
                           0 1 1

                           结论:可见在group by  的时候,null视为等同.

 

                      7:永远不会有什么数据等于NULL。1不等于NULL,2也一样。但NULL也不等于NULL。所以我们只能比较它“是”或“不是”。

        总结:SQL中提供了如此众多的存储过程,函数供我们调用,而我们又真正的理解几个呢?只有真正了解它们,才会对开发中出现的种种问题迅速找出问题所在并解决它.  

 

注:

   本文引用网络上相关资料.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值