在数据库设计与管理中,WHERE子句无疑是大家用的最频繁的一个子句之一。那么大家是否真的擅长这个子句的使用呢?我看不见的的吧。笔者的下面这些建议就可以帮助大家来充分使用WHERE子句的功能,发挥其强大的作用。
建议一:查询条件中包含撇号怎么处理?
数据库的某些列中,可能会包含一些特殊的符号,如撇号(‘)。这对于SQLServer数据库来说是一个特殊的符号。因为其原本是用来区分字符与变量的。如在查询语句中,如果输入的是字符串的值,就需要利用两个撇号引用起来。(有时候撇号大家又叫做单引号)。但是在有些情况下,特别是国外人的名字中,本身就包含着单引号。如某个产品的规格信息为“8’尖嘴钳(07型)/ 碳钢/ 热处理/ 全抛光/ 镀镍铁合金/ 橙色”。在这个规格信息中就有一个单引号。此时如果在WHERE查询语句中需要查询这个规格信息,那么这个单引号还如何处理呢?数据库管理员如果按如下的格式来输入查询语句(WHERE Description like ‘8’尖嘴钳’),能够查询到所需要的结果呢?答案是否定的。因为此时数据库系统因为这个查询语句中有三个单引号分割符号,为此数据库优化器在编译优化这条语句的时候,无法识别输入的条件语句的含义。
为此数据库管理员在设计查询语句的时候,就需要预计到这种情况,并在编写语句的时候采取措施来避免这种错误。如果要在查询条件中包含单引号的这个特殊符号也未尝不可。在SQLServer数据库中,如果需要查找的数据包含一个单引号时,则可以输入两个单引号来标明这个单引号是文本值而非分隔符。其实,这个单引号就好像程序开发语言中的转移字符,能够把系统中的一些特殊符号转换成文本符号。不过由于转义字符的使用或多或少会影响数据库的执行性能,为此在查询的时候还是要尽量避免在查询条件语句中包含单引号。数据管理员在设计SQL查询语句中,应该有意识的限制这种行为,而不是支持。只有在用户确实有这方面需求的情况下,才能够使用转移字符来告诉数据库把单引号当作字符数据来处理。
建议二:数值作为查询条件的注意事项。
如果把数值作为查询条件时,其不用单引号括起来,在数字中间也不会出现单引号等分隔符。那么照理来说数值作为查询参数是最容易的事情了。其实不然。很多数据库管理员可能不熟悉一些基本的规则,为此在使用数值作为查询条件的时候,还是会遇到磕磕碰碰的事情。
如把数值作为查询条件的话,则在数值中可以加入小数点。默认情况下,小数点位一个小黑点,如12.5。但是并不是在所有操作系统中都是以这个点好作为小数点的分隔点。如笔者一次在给客户进行数据库维护时,在客户的电脑上使用sql语句来查询记录,就是把参数值输入为12.5。但是怎么执行数据库都提示这条SQL语句有错误。笔者核对了好几次,就是发现这个问题。但是在笔者自己的笔记本电脑上,把这条SQL语句一模一样的照写了一遍,执行起来的时候就没有发生任何错误。这到底是怎么回事呢?原来小数点的分隔符默认情况下是采用小黑点,但是并不是所有操作系统这支持这个。小数点的分隔符用户可以进行自定义。如在Windows操作系统控制面便的区域设置中,可以根据用户的使用习惯来定义小数点的分隔符。当在书写查询条件的过程中如果使用到小数点的话,那么就需要跟这个区域设置中的设置相符。如果在这个区域设置中是采用冒号来作为小数的分隔符号的,那么在查询语句中也需要利用冒号来作为小数点的分隔符。在数据库编译的时候,会自动把这个冒号转换为二进制数据。为此,在有些教科书上,把小数点的分隔符好定义为小黑点笔者人为这是不科学的,会对读者产生误导。笔者认为,应该这么写:如果把数值作为查询条件的,则除了小数点分隔符和负号之外,不能够包含非数字字符。如果为了让读者更加明白的话,则在后面可以加一句注释,这里的小数点分隔符默认情况下是小黑点符号,但是可以在控制面中中的区域设置对方框内进行重新定义。
另外在使用数值型数据作为查询条件时,需要注意如果输入的是正数,那么无论搜索的是整数还是实数,都可以包含小数点标记。也就是说,12.与12是等价的(这里假设小数点分隔符为.号)。而且在SQLServer数据库中,还可以利用科学计数法来作为查询条件。要知道利用科学计数法来表示非常大或者非常小的数字,非常有用。数据库能够支持科学计数法作为查询条件,则对于一些小数或者大数的查询非常的有用。
建议三:要注意逻辑值的表示方法。
在SQLServer数据库中,逻辑值的应用也是很普遍的。如在员工信息表中,往往把员工的性别利用逻辑值来表示。如员工如果是男性的话,则利用True来表示。如果员工是女性的话,则利用false来表示。再如如果某个员工离职了,为了后续查询往往不会把这个员工信息删除,而是采用另外一种管理机制来进行管理。如会在这个员工信息表中创建一个isactive等类似的布尔型字段。如果这个员工信息是有效的,则其值就为True;如果这个员工信息因为离职等原因已经实现了,则其就为Faluse。
但是数据库管理需要注意这个逻辑数据的格式会因数据库的不同而不同。如在SQLServer中,如果逻辑值为False的话,则在数据库存储为0;如果逻辑值为True的话,则其通常存储的值为1。不过不同的数据库这个对应的值可能不同,如有的数据库利用-1来表示逻辑值False等等。为此在编写SQL语句的时候,数据库管理员需要注意这方面的差异,要防止张冠李戴的情况发生。
另外需要注意的是,在开发应用程序的时候,其往往不会利用数字0或者1来表示罗机值。如在C语言中直接以TRUE或者FALSE来表示布尔值。为此数据库开发人员在开发应用系统的时候,需要注意这些表示方式上的差异。在必要的时候,需要通过别名等表达方式来进行相关的转换。如用户在生成报表时,如果利用1或者0数字来表示逻辑值的话,可能用户并不一定看的懂。此时就需要在数据库查询的时候,进行一些转换处理。如可以利用CASE语句来判断并利用别名进行转换。这也是数据库设计过程中对逻辑值进行处理的最常见的方法。
建议四:当心日期数据的处理。
日期型的数据在数据库中使最特殊也是最复杂的一类数据类型。其看起来像是字符型的数据,但是其操作起来要比数据型的字符负责的多。要掌握在WHERE语句中如果利用日期型的数据作为查询条件,则数据库管理员首先需要明白其日期的表示格式。因为不同类型的表示格式其所代表的含义是不同的。
首先数据库管理员需要注意,在SQLServer与Windows操作系统的环境下,其日期格式可以在多个地方进行设置。如区域设置特定、数据库特定、ANSI标准等三个方面。在数据库部署的时候,***把这三个地方的日期格式设置为一致,否则的话,在后续操作的时候会遇到很多不必要的麻烦。如区域设置处设置的日期格式与数据库特定的日期格式不一致的话,则在利用日期型数据进行查询的时候,很容易因为日期格式不兼容而导致语法编译错误。
其次需要注意的是,在SQL Server数据库中有两个地方可以生成SQL语句。一是在数据提供的窗口中生成SQL语句;二是直接编写SQL语句。如果在其提供的查询窗口中生成SQL语句的话,则在日期型的字段中输入日期数据的话,则数据库在生成SQL查询语句的过程中,会自动对日期型的数据进行转换,以符合于数据库兼容的日期格式。也就是说,在查询窗口输入日期型数据查询条件,一般不会出现问题。但是如果是在应用程序中直接编写SQL语句,则此时需要注意,其输入的日期要符合数据库特定的格式或者ANSI标准的格式。而不是在区域设置处设定的格式。
第三,那么查询返回的结果会以什么格式显示呢?是按照区域设置特定的格式、还是数据库特定的格式或者ANSI标准日期格式显示呢?这里要注意,其显示的时候是以操作系统中区域设置处设置的日期格式来显示。而不是数据库中设置的日期格式来显示。为此在同一个数据库中,不同的客户端其日期显示格式就有可能不同。这主要是因为客户端上面的区域设置中的日期格式设置不同而造成的。
【编辑推荐】