SQL开发中容易忽视的一些小地方(一)

系统 1551 0
原文: SQL开发中容易忽视的一些小地方(一)

 

       写此系列文章缘由 : 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面: 

          第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也就不存在应用程序.

          第二:数据库,现在是信息化世界,大多数信息都可以通过数据库存储来交换信息.常与应用程序互相交流信息.

 

         但在SQL开发应用时,我们往往只观注些常用的方法(insert delete select update),对些 小细节方面 ( 系统存储过程,函数的应用,优化分析 )研究的并不多或者是知其一不知其二,所以本人想把在学习工作当中遇到的问题总结些,希望还没有重视这些方面的朋友会有帮助,少走些弯路.

 

       主旨: 本文首先根据自己的经验整理了一下 SQL中的null的用法及要注意的方面 .

       名词解释 (英文辞典): null:无效的, 无价值的, 等于零的.

                   (SQL定义): SQL中, NULL 与空格, 零, 都不相同. 是指为未定义或是不可用的.

        构成因素: 造成某一列成为 NULL 的因素可能是:

                        (1),值不存在;

                        (2), 值未知;

                        (3), 列对表不可用.         

       它与普通的值最大的 异同 是:

          相同点:
             1:统统属于值范畴.数字1是一个值,字符串'aaa'同样是一个值,同理 null也是一个值.

             2:都是合法的值,普通的数字,字符可以存在于表中字段,null也可以,而且是有意义的.

 

           不同点:
              先创建测试表:
USE [myTestDB]
GO
/****** 对象:  Table [dbo].[testNull]    脚本日期: 10/11/2008 13:45:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testNull](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [a] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
    [b] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_testNull] PRIMARY KEY CLUSTERED
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

              插入相关测试值:
insert into testNull
values('1','')
insert into testNull

values('2',null)

 

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

注:

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


 

 

SQL开发中容易忽视的一些小地方(一)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论