Post Jobs

关键字在值为null的应用举例,Mysql中NULL使用方法与注意事项

转自:http://www.maomao365.com/?p=6873

在mysql中null包括了not null与if
null或等等,下面我来给大家介绍在mysql中null的注意事项与使用方法,希望对大家能有所帮助。

摘要:
下文通过案例分析in 关键字在值为null的应用举例,
分析出not in关键字在null值产生的异常信息
如下所示:

SELECT NULL =0, NULL =12345, NULL <>12345, NULL +12345, NULL ||
‘abc’, NULL = NULL , NULL <> NULL , NULL AND TRUE , NULL AND FALSE
, NULL OR FALSE , NULL OR TRUE , NOT (NULL);

CREATE TABLE testA(keyId INT)
CREATE TABLE testB(keyId INT)
GO
INSERT INTO testA(keyId) VALUES (1)
INSERT INTO testA(keyId) VALUES (2)
INSERT INTO testA(keyId) VALUES (3)
GO
INSERT INTO testB(keyId) VALUES (1)
INSERT INTO testB(keyId) VALUES (2)
INSERT INTO testB(keyId) VALUES (4)
INSERT INTO testB(keyId) VALUES (NULL)
GO
 SELECT * FROM testA WHERE keyId IN (SELECT keyId FROM testB)
-----输出------
/*
keyId
1
2
*/
 SELECT * FROM testA WHERE keyId not IN (SELECT keyId FROM testB)
------无输出记录-----
/*
keyId
*/
INSERT INTO testA VALUES (NULL) ---在testA表中插入空值
SELECT * FROM testA WHERE EXISTS(
    SELECT null  FROM testB WHERE testA.keyId=testB.keyId    
)
----输出----
/*
keyId
1
2
*/
SELECT * FROM testA WHERE not  EXISTS(
    SELECT null  FROM testB WHERE testA.keyId=testB.keyId    
)
/*
keyId
3
NULL
*/
SELECT * FROM testA WHERE testA.keyId NOT in (
    SELECT testB.keyId FROM testB WHERE testB.keyId IS NOT NULL    
)

drop table testA
drop table testB

如果这是一道面试题,估计不知道有多少程序员甚至是DBA会阵亡……

 

正确的答案是什么?(为了加深印象,建议复制SQL到mysql里去执行,看一下)

通过以上测试,我们可以看出not in
查询关键字如果子表中存在空值,则无法查询出任何记录,会导致异常产生,

需使用not
exists获取相应的空值信息

下面跟大家分析一下原因:

图片 1

那么在应用中如何避免NULL带来的一些困扰呢?

•把NULL当成一个特殊值,不等于空、0、FALSE,使用IS NULL/IS NOT
NULL去检测
•声明NOT NULL列,给于默认值

Null时要注意两大陷阱

陷阱一:空值不一定为空

  空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。此时为出现什么情况呢(如下图)?

图片 2

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图