sql使用的是三值谓词逻辑,所以逻辑表达式返回的结果可以为true、false或者未知,在三值逻辑中返回true与不返回false并不完全一样,
sql对查询过滤条件的处理:接受ture 拒绝false和unknown
sql对check约束的处理:接受false 拒绝 true和unknown
unknown的微妙之处在于当对它取反时 结果仍是unknown,
对两个null值进行比较的表达式(null=null),其计算的结果仍为unknown,因为null值代表的是一个不可知的值,所以实际上无法判断一个不可知的值是否等于另一个,因此sql提供了两个谓词is null和is not null来取代=null和null, 使用not in 谓词过滤数据时,如果 in的值中包含null,则永远不会返回值(select ordernum from [dbo].[salesorder] where ordernum not in ('100128054',null))
当进行分组和排序时 ,认为两个null值是相等的,就是说group by子句会在每个组中重新组织所有的null值
orderby子句也会对所有的null值进行排序,t-sql是把null值得排在了有效值之前
所有的聚合函数都会忽略null值,只有一个例外count(*),假设一个组有两行,其qty分别为3,null,表达式count(*)返回2,count(qty)返回1,因为一行是已知值
ansi sql有两种unique约束:
将多个null值视为相等(只允许有一个null值)将多个null值视为不同(允许有多个null值)sqlserver只实现了前者
