各位用户为了找寻关于MySQL中对于NULL值的理解和使用教程的资料费劲了很多周折。这里教程网为您整理了关于MySQL中对于NULL值的理解和使用教程的相关资料,仅供查阅,以下为您介绍关于MySQL中对于NULL值的理解和使用教程的详细内容
NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西。不是这样的!例如,下列语句是完全不同的:
? 1 2mysql>
INSERT
INTO
my_table (phone)
VALUES
(
NULL
);
mysql>
INSERT
INTO
my_table (phone)
VALUES
(
""
);
两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。
在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列返回NULL:
? 1mysql>
SELECT
NULL
,1+
NULL
,CONCAT(
'Invisible'
,
NULL
);
如果你想要寻找值是NULL的列,你不能使用=NULL测试。下列语句不返回任何行,因为对任何表达式,expr = NULL是假的:
? 1mysql>
SELECT
*
FROM
my_table
WHERE
phone =
NULL
;
要想寻找NULL值,你必须使用IS NULL测试。下例显示如何找出NULL电话号码和空的电话号码:
? 1 2mysql>
SELECT
*
FROM
my_table
WHERE
phone
IS
NULL
;
mysql>
SELECT
*
FROM
my_table
WHERE
phone =
""
;
在MySQL中,就像很多其他的SQL服务器一样,你不能索引可以有NULL值的列。你必须声明这样的列为NOT NULL,而且,你不能插入NULL到索引的列中。
当用LOAD DATA INFILE读取数据时,空列用''更新。如果你想要在一个列中有NULL值,你应该在文本文件中使用N。字面上的词'NULL'也可以在某些情形下使用。
当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。
为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。
MySQL的 IFNULL() 函数和Oracle的 NVL() 函数功能类似。以下简单举例: IFNULL(expr1, expr2) 如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
? 1 2 3 4 5 6 7 8 9mysql>
select
IFNULL(1,0);
-> 1
mysql>
select
IFNULL(0,10);
-> 0
mysql>
select
IFNULL(1/0,10);
-> 10
mysql>
select
IFNULL(1/0,
'yes'
);
->
'yes'
NVL( string1, replace_with)
功能:如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值。 引申一下,此NVL的作用与SQLserver 中的 ISNULL( string1, replace_with) 一样。 注意事项:string1和replace_with必须为同一数据类型,除非显式的使用TO_CHAR函数。 例:
? 1NVL(TO_CHAR(numeric_column),
'some string'
)
其中numeric_column代指某个数字类型的值。 例:
? 1nvl(yanlei777,0) > 0
NVL(yanlei777, 0) 的意思是 如果 yanlei777 是NULL,则取 0值
null与空值的辨析 来看这样一段代码:
? 1 2 3 4CREATE
TABLE
`test` (
`col1`
VARCHAR
( 10 )
CHARACTER
SET
utf8
COLLATE
utf8_general_ci
NOT
NULL
,
`col2`
VARCHAR
( 10 )
CHARACTER
SET
utf8
COLLATE
utf8_general_ci
NULL
) ENGINE = MYISAM ;
错误(不可以插入null值):
? 1INSERT
INTO
`test`
VALUES
(
null
,1);
正确(插入''没问题):
? 1 2 3INSERT
INTO
`test`
VALUES
(
''
,1);
INSERT
INTO
`test`
VALUES
(
''
,
NULL
);
INSERT
INTO
`test`
VALUES
(
'1'
,
'2'
);
检索(''不是null,所以not null会把''都算进去):
? 1SELECT
*
FROM
`test`
WHERE
col1
IS
NOT
NULL
结果:所有三条数据
检索(正常检索):
? 1SELECT
*
FROM
`test`
WHERE
col1 <>
''
结果:最后一条数据
检索(<>'',会同时排除''和null的数据,只检索有内容的数据):
? 1SELECT
*
FROM
`test`
WHERE
col2<>
''
总结: 1. null的存储不是'',是其它特殊的字符表示。 2. null在检索<>''的时候,也会被排除,因为没有真正有意义的内容 3. not null严格按照字面意思,''不会被排除。 4. 定义not null的字段,可以插入''