好记性不如烂笔头。

关于SQL中的NULL值

关于SQL中的NULL值 

1)、当在SELECT子句使用连接符“+”连接表达式时,如果有一列为NULL,则得到的结果也为NULL,当与NULL值作运算时,情况同上(逻辑运算符OR运算时除外,当TRUE OR NULL时,结果为TRUE,但FALSE OR NULL时结果为UNKNOW)

 

2)、在ORDER BY 子句中,NULL值被认为是最小可能(即,如果是升序排序 ,则NULL会排在第一位)

 

3)、NULL的判断不能简单的用=或!= 而只能使用IS (NOT) NULL来判断,可以使用ISNULL函数来对NULL值进行替换(即第一个参数为NULL式,将其替换为第二个参数的值)

 

4)、在连接语句(外连接中),左表或右表失配的元素会被设为NULL值(可以变通地通过这个特征得到左表有而右表没有记录,反之亦然),另外,在表的内部连接中,如果要连接的列都含有NULL值,则它们被认为是相互不匹配的,因此,如果其中一个连接表的列中出现NULL,只能通过外部连接返回这些值(除非WHERE子句不包括空值。

 

5)、在GROUP BY 子句中,NULL值会被分为一组,而不是被忽略,另外,在CUBE   ROOLUP汇总语句中,会由运算符操作生成NULL值 ,怎么样区别NULL是记录本身的还是系统生成的呢? 答案就是GROUPING(列名)==1   

 

6)、NULLIF函数,如果指定的两个表达式等价,则返回空值

 

7)、DATALENGTH函数可以返回用于表示任何表达式的字节数,但要注意 NULL的DATALENGTH仍是NULL

 

8)、有一个函数会把NULL统计在内,那就是COUNT(*),除此之外,所有的聚合函数均会“忽略”NULL值(注意,不是把结果搞成NULL),(还要注意,MAX    MIN函数虽然也会忽略NULL,但当所有行都是NULL值时,它便只能返回NULL了)

 

9)、表的约束中,主键具有唯一性约束并且不允许NULL值 ,但单独的UNIQUE约束可以存在一个NULL值,当一个表设置了外键约束时,它可接收的值一种是在参照列中存在的值,还可以是NULL值,在主键约束中不必再指定NOT NULL,但如果显式指定为NOT NULL系统也是允许的

 

10)、表的插入操作,当要插入的数据为空时,要显式指定为NULL而不能什么都不写

 

11)、使用IN 子查询的方式实现“集合交”的操作时,IN 关键字会排除NULL值,而结果集中会有重复值出现,这点和intersect 是不同的,不管是null in (null)   还是null not in (null)其结果都是FALSE

 

12)、exists子查询中使用NULL仍然会返回结果集,如:

 

select * from bookinfo where exists(select null) order by bookid--仍然会返回结果

 

13)、多列外键约束时,如果没有NULL值则系统会强制每个列全部匹配 ,但如果其中一列存在NULL值 则系统会放弃检查,这有可能引起数据完整性的问题,因此 ,此类问题最好在约束的每个列上增加not null约束。例如,如果a(sid,sname) references b(id,name) ,当向a 表插入类似values(' 随便一个不匹配的数字’,NULL)时,并不会引起数据插入失败,从而失去约束的效果

 

14)、当一个表在创建时没有设置主键,利用修改表语句添加主键时,则要实施主键约束的列必须已经具有not null约束

 

15)、当使用CHECK约束时,如果后面的表达式返回NULL,则校验会通过