在讲null之前,我们先看一个例子
表数据如下:
3306>select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | chen |
| 2 | zhang |
| 3 | NULL |
+------+-------+
3 rows in set (0.00 sec)
 
然后我们想查出所有名字不为'chen'的其它行记录,我们有可能这样写:
3306>select * from t1 where name!='chen';
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
+------+-------+
1 row in set (0.00 sec)
 
但是结果好像不太如我们所愿,id为1的那条记录没有被查出来,null肯定和'chen'不相等呀,为什么会查不出呢?
 
 
 
NUll值对于新手来说非常容易混淆,经常会被认为null与空字符串''是一样的,但事实上,这两者是非常不一样,NULL表示的是“a missing unknown value”,而字符串''是一个确定的值,这本质上就已经不一样了。
 
举个例子:
mysql> INSERT INTO t_user (phone) VALUES (NULL); mysql> INSERT INTO t_user (phone) VALUES ('');
第一条insert语句认为这个手机号还不确定是多少,是a missing unknown phone number
第二条代表这个手机号码是确定的,它的手机号码为空字符串
 
为了处理和null相关的比较,在mysql中可以用is null、is not null、<=>、isnull()来测试比较,不能用如=、<、<>来和null值比较测试,任何值(包括和null本身)与null对比和函数运算操作结果都为null
 
如下三个例子可以说明问题:
任何与null的相关操作都为null
3306>SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
+------+--------+--------------------------+
| NULL | 1+NULL | CONCAT('Invisible',NULL) |
+------+--------+--------------------------+
| NULL | NULL | NULL |
+------+--------+--------------------------+
1 row in set (0.00 sec)
 
3306>SELECT 1>NULL, 1=NULL, 1!=NULL;
+--------+--------+---------+
| 1>NULL | 1=NULL | 1!=NULL |
+--------+--------+---------+
| NULL | NULL | NULL |
+--------+--------+---------+
1 row in set (0.00 sec)
 
用指定的函数操作才能返回0或1
3306 > SELECT 1 IS NULL, 1 IS NOT NULL, 1<=>NULL,NULL<=>NULL;
+-----------+---------------+----------+-------------+
| 1 IS NULL | 1 IS NOT NULL | 1<=>NULL | NULL<=>NULL |
+-----------+---------------+----------+-------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+----------+-------------+
1 row in set (0.00 sec)
 
但是呢,凡事都有个例外:
当用distinct、group by、order by时,此时不同的null值被视为相等计算。
 
最重要的是,在mysql中,0和null代表假,其它的任何值都代表真
 
 
所以回头看最开始的例子,当我们的where条件为name!='chen'时,它与id=1的行进行比较,即测试:
'chen'!='chen'
这个测试结果为0,为假,所以id=1这一行就不会被查出来。接下来再测试:
'zhang'!='chen'
这个测试结果为1,为真,所以id=2这一行就可以被查出来。接下来再测试:
NULL!='chen'
这个测试结果为NULL,为假,所以id=3这一行就不会被查出来。
所以最终的结果就只有id=2这一行的数据被查出来了。
那如果要达到我们的目地怎么办?
3306>select * from t1 where name!='chen' or name is null;
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
| 3 | NULL |
+------+-------+
2 rows in set (0.01 sec)
 
 
3306>select * from t1 where ifnull(name,0)!='chen' ;
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
| 3 | NULL |
+------+-------+
2 rows in set (0.00 sec)
 
推荐用第一种方法。
因为mysql对了null列的查找是有查询优化的:
3306>explain select * from test a where a.code='AAAAAA' or a.code is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref_or_null
possible_keys: code
key: code
key_len: 21
ref: const
rows: 73603
Extra: Using index condition
1 row in set (0.01 sec)
 
而第二种在列上加上函数的查询时索引是不起作用的。
 
 
其它注意事项
1、用order by ... asc时,null值会被放在最前面,而用order by ... desc时,null时会被放在最后面,相当于null是一个无穷小的值。
 
2、聚合函数如count(),min(),sum()是忽略null值的。唯一的例外是用count(*),如
SELECT COUNT(*), COUNT(age) FROM person;
如上语句是第一个count(*)是计算person表总行数,而第二个是计算person表age列非null的行数
 
3、在MyISAM和InnoDB MEMORY引擎中,是可以在包含null值的列添加索引的,而在其它引擎中则必须声明为not null才可以添加索引
 
4、当用load data infile时,空的或者没有的列将用空字符''代替,如果要导入null值,需要在数据文件里用\N来表示。
 
5、如果你往timestamp插入null值,则当前时间会被插入,如果一个自增列插入null值,下一个自增值将会被插入。
 
 
 
 

mysql null值处理详细说明的更多相关文章

  1. MySQL NULL 值处理

    MySQL NULL 值处理 我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了 ...

  2. 二十一、MySQL NULL 值处理

    MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...

  3. DB-MySQL:MySQL NULL 值处理

    ylbtech-DB-MySQL:MySQL NULL 值处理 1.返回顶部 1. MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数 ...

  4. MySQL NULL值

    我们已经看到SQL SELECT命令和WHERE子句一起使用,来从MySQL表中提取数据, 但是,当我们试图给出一个条件,比较字段或列值设置为NULL,它确不能正常工作. 为了处理这种情况,MySQL ...

  5. Oracle 与 Mysql NULL值,空字符串''的区别

    Oracle(null等同于空字符'') 1.oracle插入空字符串默认替换成null 2.oracle查询(null和被替换的空字符)时使用 is null/is not null 3.使用聚合函 ...

  6. 【mysql】mysql null值

    在数据表我们有时候有些表字段会为null,表示空.其实在mysql中null值是占用空间的. mysql手册如下解释 NULL columns require additional space in ...

  7. MYSQL NULL值特性

    NULL是一种“没有类型”的值,通常表示“无值”,“未知值”,“缺失值”,“超界”,“不在其中”等,我们在日常运用中很容易和NULL字符串混淆,这里大致整理了下NULL值的一些特性,以便能够正确使用N ...

  8. MySQL NULL 值如何处理?

    我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MySQL提 ...

  9. mysql null 值查询问题

    我在开发公司内部的一个项目时遇到一个问题:select student_quality_id from STUDENT_QUALITY where mark_status=0 and batch_st ...

随机推荐

  1. 初涉深度优先搜索--Java学习笔记(二)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...

  2. 【一】Ubuntu14.04+Jekyll+Github Pages搭建静态博客

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  3. SQL Server数据库镜像的页面自动修复原理

    SQL Server数据库镜像的页面自动修复原理 主库页面损坏 镜像库页面损坏 LSN用来保证事务的时序 LSN保存在每个数据页面的页头 在同一台机器,内存中的数据页和磁盘中的数据页保持同步依靠的是数 ...

  4. 介绍.NET 开发必备工具 .NET Portability Analyzer

    随着.NET的原来越开放,不仅仅是开源这么简单了,也意味着.NET程序员要关注越来越多的平台,涵盖.NET Mic Framework, Xamarin,Mono,.NET等等,从windows到li ...

  5. Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...

  6. 一个小白App开发需要了解的基本技术

    本文针对小白用户对App做一个简单的介绍,首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己的需求选择不同的App开发. 一 App有哪些形式 WebApp:简单来说,Web A ...

  7. IoC在ASP.NET Web API中的应用

    控制反转(Inversion of Control,IoC),简单地说,就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的 ...

  8. C# 用原生JS进行文件的上传

    1.此文章是用原生JS来进行文件的上传,有两个版本,一个不用ajax,一个用ajax. 1)非AJAX <!DOCTYPE html> <html> <head> ...

  9. struts tags

    HTTP ERROR 500 Problem accessing /showognl.jsp. Reason: Server Error Caused by: org.apache.jasper.Ja ...

  10. 每天一个linux命令(45):free 命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...