======================

相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问:

1、我字段类型是not null,为什么我可以插入空值

2、为毛not null的效率比null高

3、判断字段不为空的时候,到底要  select * from table where column <> ” 还是要用 select * from table where column is not null 呢。

带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样。

首先,我们要搞清楚“空值” 和 “NULL” 的概念:

1、空值是不占用空间的

2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。

搞清楚“空值”和“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 ;

插入数据:

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

mysql发生错误:

#1048 – Column ‘col1’ cannot be null

再来一条

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

成功插入。

可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1也就有答案了。

对于问题2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。

而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。

我们再向test的表中插入几条数据:

[php] view plaincopy

INSERT INTO `test` VALUES (”, NULL);

INSERT INTO `test` VALUES (‘1’, ‘2’);

现在表中数据:

现在根据需求,我要统计test表中col1不为空的所有数据,我是该用“<> ”” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。

[php] view plaincopy

SELECT * FROM `test` WHERE col1 IS NOT NULL

SELECT * FROM `test` WHERE col1 <> ”

可以看到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件。

=============

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’也可以在某些情形下使用。见7.16 LOAD DATA INFILE句法。

当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。

为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

=================================================================

数据库中存在null,那么怎样查找这些值是null的记录呢?

MySql数据库

法/步骤

1

查找到某一个字段是null的记录,最简单的想法可能是这样:

select *from  tableName where columnName = null

但是这样是不行的,因为null不能和任何值比较。在SQL中,NULL值与任何其它值的比较(即使是NULL)永远不会为“真”。包含NULL的表达式总是会导出NULL值,除非在关于操作符的文档中以及表达式的函数中作了其他规定。

2

我曾经犯的错误如下:

注意,红色字体的查询条件只能查询出pass_name!=’batch’且不为null的字段(null不能和任何值比较,即使是null也不会是true),如果需要查询出pass_name是null的字段,必须显示的加上:or pass_name is NULL

SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= ‘2012-08-01’ AND FROM_UNIXTIME(submit_time) < ‘2013-07-01’ AND pass_name <> ‘test’(错误)

查询出包含null且pass_name!=’batch’的数据:

SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= ‘2012-08-01’ AND FROM_UNIXTIME(submit_time) < ‘2013-07-01’ AND (pass_name <> ‘test’ or pass_name is null)(正确查出pass_name!=null及pass_name是null的)

3

null表示的含义是未知,即不知道有没有。和‘’空字符串不等,因为空字符串相当于没有值。null代表的是不知道有没有值。所以在数据查询中如果字段默认值是null,想查询出不等于某个条件的一定要加上——字段名 is null 或者字段名 is not null来包含是null或者不是null的字段

END

注意事项

null和任何值都不能比较

null只能用is null 或者is not null 来判断,不能用=或者!=来判断null和任何值都不能比较

null只能用is null 或者is not null 来判断,不能用=或者!=来判断

喜欢 (0)or分享 (0)

mysql中的钱null,mysql 中null总结相关推荐

  1. mysql中的钱null_MySQL数据库中null的知识点总结

    在mysql数据库中,null是一个经常出现的情况,关于mysql中的null,有哪些注意事项呢?下面简单总结归纳下,后续会不断补充. 1. is null 首先判断数据库中某一列的值是否为null, ...

  2. mysql的字段空格是null_MySQL中NULL与空字符串 空格问题

    一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串' '是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而''则表示值是存在的,只不过是个 ...

  3. mysql中0和空值_SQL中空值 和NULL的概念:

    在详细讲解null之前,我们先看一个例子 表数据如下: 3306>select * from t1; +------+-------+ | id | name | +------+------- ...

  4. mysql 删除not null_从MySQL的列中删除NOT NULL限制?

    要从MySQL的列中删除NOT NULL限制,请使用ALTER命令.语法如下:ALTER TABLE yourTableName MODIFY COLUMN yourColumnName dataTy ...

  5. mysql 设置一个字段为null_MySQL中,为什么要设置NOT NULL?

    有情怀,有干货,微信搜索[荒古传说]关注这个不一样的程序员. 平时开发过程中,MySQL 字段的一般都会设置为NOT NULL,你有想过为什么吗??? 原因如下: 1.空值("") ...

  6. mysql null 0 空_MySQL中 null与not null和null与空值''的区别

    相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.字段类型是not null,为什么可以插入空值? 2.为什么not null的效率比null高? 3.判断字 ...

  7. mysql 设置为空_MySQL中可为空的字段设置为NULL还是NOT NULL

    经常用mysql的人可能会遇到下面几种情况: 1.我字段类型是not null,为什么我可以插入空值 2.为什么not null的效率比null高 3.判断字段不为空的时候,到底要用 select * ...

  8. mysql explain ref列_mysql explain中的列

    参考:<高性能mysql>附录D EXPLAIN MySql将Select查询分为简单和复杂类型,复杂类型分为3大类:简单子查询,所谓的派生表(在派生表的子查询),以及UNION查询. 列 ...

  9. php mysql设置null,MySQL和PHP – 插入NULL而不是空string

    通常情况下,你可以像这样从PHP中为MySQL添加常规值: function addValues($val1, $val2) { db_open(); // just some code ot ope ...

最新文章

  1. 【转】直线光栅化算法-Bresenham算法
  2. 模拟电梯控制软件设计c语言,模拟电梯控制系统设计.docx
  3. [转]Device Context 设备环境 设备上下文 理解
  4. 连通域标记——实现硬币自动计件
  5. c语言 勒让德多项式,2406: C语言习题 求n阶勒让德多项式(示例代码)
  6. 串口循环缓存区 简单 免初始化 不用堆、指针、分段memcpy
  7. windos 服务怎么写_我的产品或服务怎么写?
  8. (转)MongoDB入门分享-笔记整理精选
  9. 基于Linux的集群系统(三)
  10. 计算机专业毕业设计的进度记录,毕业设计周次进度计划及实际进展情况表.doc...
  11. 博客中 Flex4/Flash mp3音乐播放器实例 含演示地址
  12. 【双系统】删除linux系统扇区后无法启动windows
  13. 关于用户表空间配额的问题
  14. 在ROS中创建并优化机器人URDF模型
  15. 用bmfont工具生成.fnt文件,但合成图片会分开问题
  16. 赏金猎人系列-如何测试sso相关的漏洞
  17. 青岛海尔供应商java面试_青岛某企业面试题(2019-11)
  18. Python使用Pandas读写EXCEL文件教程
  19. 【 linux系统入门管理篇-第二章文件和用户的管理】
  20. 一些对我影响重大的流行歌曲(r11笔记第32天)

热门文章

  1. tensorflow 风格迁移二
  2. 二叉树的序列化和反序列化
  3. ntu课程笔记7454 期中复习
  4. 数据集整理(ing)
  5. R语言实战应用精讲50篇(十八)-R语言实现分词、词频与词云案例解析
  6. tableau可视化数据分析60讲(八)-tableau计算函数(重点知识)
  7. R语言实战应用精讲50篇(五)-多重线性回归系列之模型拟合
  8. 强化学习(八)价值函数的近似表示与Deep Q-Learning
  9. Hadoop学习--Hive安装与配置
  10. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...