第六个技巧:合理处理NULL字段。
Null字段在数据库中是一个比较特殊的字段。Null字段表示未知值或者说缺少数据,注意若某个字段的值为Null,则这个字段即不是空格,也不是0。当插入记录的时候,若这个字段没有被赋值,而且也没有默认值的话,则这个字段系统默认给他的值就是“Null”。
由于这个值比较特殊,在查询的时候,及时经验丰富的数据库管理员,有时候在处理起来的时候,也会发生错误。为此,笔者在这里总结一些,在数据库查询的时候,关于这个空字段查询的一些需要注意的地方。
一是要注意NULL字段的数字运算问题。
如现在在一个薪资管理系统中,有一张薪资表,其中有基本工资与加班工资两个字段。若某个用户的基本工资为2000,而其加班工资没有。在输入这条记录的时候,由于加班工资这个字段中,没有输入数据,而且在数据库设计的时候,也没有个这个字段设置0的默认值。所以,当这条记录保存的时候,数据库系统会给这个字段自动赋值,这个字段的值就为NULL。
若我们用Select语句查询这条记录的时候,其加班工资这个字段显示的数据是空的。看起来好像是空格,而实际上其存储的不是空格。此时,我们若利用查询语句想知道,这个员工的总的工资(即加班工资加上基本工资)为多少的时候会有什么结果呢?
我们可以利用Select 员工姓名,基本工资,加班工资,基本工资+加班工资 as 总工资 FROM 员工薪资表; 我们可以通过这条语句来查询这个员工总的工资是多少。但是,这条语句会查询出我们想要的结果吗?我们执行一下这条语句,结果我们会发现,得出的结果跟我们想象的大相径庭。最后显示的总工资一栏中,为空格。
原来,Oracle数据库设计中,若一个NULL字段跟其他字段进行四则运算时,其显示的结果都为空。所以,若一个字段为NUU,则无论加减乘除,最后其结果都返回的施NULL值。这显然跟我们想象的不同。
针对这种情况,我们该如何处理呢?在数据库设计过程中,主要有两种处理方法。
一是在设计表的时候,对于这些需要参与运算的字段,要设置默认值。如可以把这个字段的默认值设置为0。则当添加这条记录的时候,即使前台用户没有给其设置值。在保存数据的时候,系统也会给其默认值0。如此的话,在进行四则运算的时候,才可能得到我们想要的值。
二是在查询的时候,需要考虑到这个NULL值的影响。有时候,若数据库中已经有记录,则不能够改变数据库字段的默认值。遇到这种情况,若我们需要对NULL字段与数字字段进行四则运算的时候,又该如何处理呢?此时,我们就需要在查询的时候,给NULL字段赋0的值。具体我们可以在查询语句中,如此定义。Select 员工姓名,基本工资,加班工资,基本工资+NVL(加班工资,0) as 总工资 FROM 员工薪资表;如此的话,当加班工资的值为NULL的时候,则系统在运算的时候,会把其当作0来处理。这么处理,我们就可以得到我们所想要的结果。不过一般情况下,这一种处理方式是不得已而为之的。最好的是,在数据库表设计的时候,就给相关的字段设置0的默认值。
另外,还有一个函数NVL2跟NVL函数功能类似,只是其多了一个参数而已,其表达式为NVL2(参数1,参数2,参数3)。它的含义是,当参数1不为空值时,则返回的值为参数2;当参数1是空值时,则范围的是参数3。若用这个函数实现NVL函数的目的时,则就需要如此改写上面这个案例的函数参数写法:NAV2 (加班工资,基本工资+加班工资,基本工资)。可见,两个函数有异曲同工之妙。具体采用哪种函数为好,则就需要根据数据库管理员的爱好来选择了。
二是如何查询NULL字段。
如果现在有一张员工基本信息表,其中有一个身份证号码的字段。现在若用户想知道,有哪些员工还没有记录身份证号码信息,该如何做呢?由于这个NULL字段不为空格或者0。若我们在查询条件语句中,利用’0’ 或者’’(空格)作为查询条件的话,是查不到我们所需要的结果的。此时,在数据库中,提供了一个专门用户查询NULL字段记录的函数IS NULL。若我们现在想知道哪些员工没有注明身份证信息时,就可以利用如下的语句来实现。
Select 员工姓名,身份证号码 from 员工基本信息表 where 身份证号码 is not null;
通过以上这条语句就可以实现查找身份证件为空的员工信息的目的。
第七个技巧:多多利用模糊查询。
在应用系统设计的时候,若让用户完整的输入全部查询条件,这个要求对于普通用户来说,过于苛刻。做过软件项目培训或者实施的时候,出于种种原因,用户在查询的时候,往往只输入部分的输入条件。遇到这种情况的时候,就需要在查询设计的时候,实现模糊查询。如此的话,即使用户输入的查询条件不全,也可以查询出相关的内容。
如用户在查询某个产品信息的时候,其可能不记得某个产品的具体名称,只知道其叫做端子,而其他具体的信息不清楚。此时,只需要在名称字段或者规格字段处输入端子,就可以从系统中查询中这两个字段中含有“端子”的纪录信息。如此的话,用户只需要在查询出的结果中继续查找即可。
这就告诫我们数据库管理人员,在数据库系统设计的时候,需要多用用模糊查询的功能。
具体的来说,需要注意以下几方面内容。
一是大小写不要进行区分。默认情况下,在数据库查询的时候,大小写是区分的。也就是说,现在有个字段内容为ABC,则我们查询abc的时候,就查不到这条记录。因为其大小写不同。而作为前段应用程序的用户来说,往往其在输入查询条件的时候,其并不会区分英文的大小写。虽然,不区分大小写也可以在前端应用程序中实现,不过,一般来说,在数据库中实现要比在前端系统中实现简单的多。故笔者是建议在后台数据库中实现这个大小写的自动转换功能。在查询的时候,不要区分大小写。这可能就是国内的特有国情吧。
二是要实现前后模糊查询。如现在有个字段的内容为“好好学习”,若我现在输入查询条件为学习、好好、好学等,都可以查到这条件记录。此时该如何设计查询的条件语句呢?这就是前后模糊查询的概念。其实,要实现这个功能也很简单。在前台查询语句设计的时候,当把查询条件传递给后台数据库系统的时候,在查询参数的前后,分别加入模糊查询的参数%即可。即我们若输入的查询条件语句为“好学”,则其传递给数据库的参数为“%好学%”。如此,就可以实现我们所需要的模糊查询。一般来说,模糊查询需要前台应用程序与后台数据库之间共同实现,这么处理起来,工作量会少许多;也会提高数据库的运行效率。
三是通过Beteen函数实现模糊查询。如现在有一个考勤系统,某个员工想知道自己在9月份自己的加班情况时,只需要在查询条件中,输入时间为9月1日到9月30日时,就可以查询到自己所需要的信息。这就是通过Beteen函数来实现模糊查询的。笔者以前碰到过一个平台型的ERP系统,他在这方面作的不错。这个产品就可以自己设计相关的报表。在报表设计中,在基于日期的查询条件,其即可以查询单个日期,而且还可以查询某个范围内的纪录。这就使利用了这个函数。另外,可以实现模糊查询的函数还有IN函数等等。作为数据库管理人员,需要从提高数据库的查询性能角度出发,合理选择这些模糊查询函数。并且,还需要配合前台应用程序设计,处理好模糊查询的功能。