课程咨询 :0351-5608878

  • 太原达内php培训班:SQL 语句中关于 NULL 的那些坑

    发布:太原PHP培训      来源:达内新闻      时间:2016-05-03

  • 问题描述

    今天在跟进公司内部测试平台线上问题的时候,发现一个忽略已久的问题。

    为了简化问题描述,将其进行了抽象。

    有一张数据表qms_branch,里面包含了一批形式如下所示的数据:

    太原达内


    在系统的某个页面中,需要展示出所有dashboard类型以外的分支,于是就采用如下方式进行查询(Rails)。

    这个方式有问题么?

    之前我是觉得没什么问题。但是在代码上线后,实际使用时发现部分分支没有加载出来,这就包括了performance_trunk分支。

    然后就是问题定位,到MySQL的控制台采用SQL语句进行查询:

    发现在查询结果中的确没有包含performance_trunk分支。

    这是什么原因呢?为什么在第4条数据中,types属性的值明明就不是dashboard,但是采用types!='dashboard'就

    无法查询得到结果呢?

    原因追溯

    查看数据表qms_branch的结构,看到types字段的属性为:DEFAULT NULL。

    经过查询资料,在上找到了答案。

    • NULL is used as a placeholder for unknown or inapplicable values, it is treated differently from other values.
    • It is not possible to test for NULL values with comparison operators, such as =, <, or <>. We will have to use the IS NULL and IS NOT NULL operators instead.

    也就是说,在SQL中,NULL并不能采用!=与数值进行比较,若要进行比较,我们只能采用IS NULL或IS NOT NULL。

    于是,我们将SQL语句改为如下形式:

    这会存在问题么?我们并没有采用=, <, <>, !=对NULL进行比较哦。

    答案是同样存在问题!

    因为在SQL中,IN语句会被转换为多个=语句。例如,上面例子中的SQL在执行时就会被转换为如下SQL语句:

上一篇:太原达内php培训师:数据库的原理

下一篇:太原达内:中国互联网公司因“魏则西时间”而走向何方

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:06.30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:06.30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:06.30

高级开发工程师精品班

高级开发工程师精品班

开班日期:06.30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:0351-5608878     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56