步行者

--勿在浮沙筑高台
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

应注意的2个SQL陷阱

Posted on 2008-11-24 12:35  Niels  阅读(249)  评论(0编辑  收藏  举报
1. NULL连接任意字符串, 结果是NULL
 
有如下的数据 
F1 F2
a a
b NULL
 (表1)
 
执行下面的查询:
select F1, concat(F2,'str') from t
 
我们可能想当然地以为结果应该是
F1 F2
a astr
b str
 (表2)
 
但事实上,结果是:
F1 F2
a astr
b NULL
 (表3)
 
NULL连接任意字符串,结果都是NULL
 
如果期望是表2的结果,SQL语句应该如下:
select F1, concat(IfNULL(F2, ''), 'str') from t
MySql中的IfNULL函数相当于SQL Server中IsNull,Oracle中的Nvl。
  
2. 字段为NULL, 则这个字段和其它字段比较, 既不"等于",也不"不等于"
 
原数据如下:
F1 F2
A NULL
NULL B
NULL NULL
C C
D DD
 (表4)
 
查找F1=F2的记录
select * from t where F1 = F2
 
结果如下:
F1 F2
C C
 (表5)
3行的两个NULL并不被认为是相等。
 
查找F1 <> F2的记录:
select * from t where F1 <> F2
 
结果如下:
F1 F2
D DD
 (表6)
 
可见,凡是有NULL参加比较的列,既不"相等",也不"不相等"
因此,"相等"的行数加上"不相等"的行数也就不一定等于总行数
 
以上结论在MySql 5.0和SQL Server 2000中测试结果相同。