当前位置: 首页 > 编程笔记 >

MySQL中对于NULL值的理解和使用教程

牛嘉谊
2023-03-14
本文向大家介绍MySQL中对于NULL值的理解和使用教程,包括了MySQL中对于NULL值的理解和使用教程的使用技巧和注意事项,需要的朋友参考一下

NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西。不是这样的!例如,下列语句是完全不同的:

mysql> INSERT INTO my_table (phone) VALUES (NULL); 
mysql> INSERT INTO my_table (phone) VALUES ("");

两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。

在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列返回NULL:

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

如果你想要寻找值是NULL的列,你不能使用=NULL测试。下列语句不返回任何行,因为对任何表达式,expr = NULL是假的:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想寻找NULL值,你必须使用IS NULL测试。下例显示如何找出NULL电话号码和空的电话号码:

mysql> 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()返回一个数字或字符串值,取决于它被使用的上下文环境。

mysql> 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函数。
例:

NVL(TO_CHAR(numeric_column), 'some string')

其中numeric_column代指某个数字类型的值。
例:

nvl(yanlei777,0) > 0

NVL(yanlei777, 0) 的意思是 如果 yanlei777 是NULL,则取 0值

null与空值的辨析
来看这样一段代码:

CREATE 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值):

INSERT INTO `test` VALUES (null,1);

正确(插入''没问题):

INSERT INTO `test` VALUES ('',1);
INSERT INTO `test` VALUES ('', NULL);
INSERT INTO `test` VALUES ('1', '2');

检索(''不是null,所以not null会把''都算进去):

SELECT * FROM `test` WHERE col1 IS NOT NULL

结果:所有三条数据

检索(正常检索):

SELECT * FROM `test` WHERE col1 <> ''

结果:最后一条数据

检索(<>'',会同时排除''和null的数据,只检索有内容的数据):

SELECT * FROM `test` WHERE col2<>''

总结:
1. null的存储不是'',是其它特殊的字符表示。
2. null在检索<>''的时候,也会被排除,因为没有真正有意义的内容
3. not null严格按照字面意思,''不会被排除。
4. 定义not null的字段,可以插入''

 类似资料:
  • 本文向大家介绍详解MySQL中的NULL值,包括了详解MySQL中的NULL值的使用技巧和注意事项,需要的朋友参考一下 我们已经看到使用WHERE子句的SQL SELECT命令来从MySQL表获取数据。但是,当我们试图给的条件比较字段或列的值为NULL,它不能正常工作。 为了处理这种情况,MySQL提供了三大运算符     IS NULL: 此运算符返回true,当列的值是NULL。     IS

  • 问题内容: 我是Derby的新手,我注意到,就值而言,我面临着与使用DB2 RDBMS时类似的问题。Derby文档指出,值必须具有与之关联的类型(DB2最终在9.7版中被删除): http://db.apache.org/derby/docs/10.7/ref/crefsqlj21305.html 现在,我试图在这里找到解决此问题的 一般 方法,因为这将成为我的数据库抽象库jOOQ的一部分。下面的

  • 我遇到了一个与基于JAX-WS的Web服务中的解组过程相关的问题。在WSDL文件中,有一个元素定义为 在相关JAVA类中,它被定义为: 如果此元素的XML值是十进制数(3.4)的表示形式,则该元素将被解组为空整数。不会生成SOAPFault,并且不可能在WebService中区分十进制值和空值。这可能是JAXB实现中的缺陷还是我做错了什么?

  • 本文向大家介绍解决mysql使用not in 包含null值的问题,包括了解决mysql使用not in 包含null值的问题的使用技巧和注意事项,需要的朋友参考一下 注意!!! 这个sql不回返回任何结果。要避免not in的list中出现null的情况。 另外: –如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除) –如果null参与比较运算,则结果可视

  • 我有时区POJO如下: 我在Spring Controller中有如下updateTimeZone方法: 当我通过以下请求时: 然后,当映射到POJO时,它会自动将其他值转换为默认值,并变为: 因此,当我如下更新此POJO时 它自动覆盖TimeZone=null和小时差异=0.0, 那么有没有什么方法可以让我在@Request estbody中的TimeZoneDto只包含我在请求JSON中传递的

  • 本文向大家介绍你知道mysql中空值和null值的区别吗,包括了你知道mysql中空值和null值的区别吗的使用技巧和注意事项,需要的朋友参考一下 前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值。以下带来示例给大家进行讲解。 建表 向test表中插入数据 插入colA为null的数据 此时会报错,因为colA列不能