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

    注:

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


     

  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1308633.html
Copyright © 2011-2022 走看看