======================
相信很多用了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 来判断,不能用=或者!=来判断
分享到:
相关推荐
本文实例讲述了mysql中null(IFNULL,COALESCE和NULLIF)相关知识点。分享给大家供大家参考,具体如下: 在MySQL中,NULL值表示一个未知值,它不同于0或空字符串”,并且不等于它自身。 我们如果将NULL值与另一个...
### MySQL悲观锁总结和实践 #### 一、悲观锁概念详解 悲观锁是一种同步机制,其基本思想是对数据被外界修改持有悲观态度,因此在整个数据处理过程中,将数据处于锁定状态。简而言之,悲观锁认为数据在处理过程中很...
MySql 中的 NULLIF 函数相当于 Oracle 中的 NVL 函数。MySql 中的 CASE WHEN 语句可以替换 DECODE 函数。MySql 中的 TEXT 等同于 Oracle 中的 LONG 函数。 13. 日期函数 MySql 中的 EXTRACT 函数可以提取日期的年...
总结一下,`IFNULL()`和`COALESCE()`是MySQL中处理`NULL`值的两个关键函数: 1. `IFNULL(expression, replacement_value)`:如果`expression`为`NULL`,返回`replacement_value`;否则返回`expression`。 2. `...
MySQL中文问题总结主要涉及到字符编码设置,这在处理中文数据时尤为重要。中文字符在数据库存储和检索时可能会遇到乱码问题,主要是由于字符集不匹配导致的。以下是一些关键知识点: 1. **字符集与校对集**: - ...
用到了MySql里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下: mysql中isnull,ifnull,nullif的用法如下: isnull(expr) 的用法:如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。...
MySQL 面试题总结 MySQL 是一个关系型数据库管理系统,广泛应用于各种领域。以下是 MySQL 面试题总结,来自大厂的宝典经验。 一、索引 1.1 简介 索引是 MySQL 中的一种数据结构,用于提高查询效率。索引可以是 B+...
### 常见MySQL命令总结 #### 数据库备份与恢复 **导出整个数据库** - **命令**: `mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名` - **示例**: `mysqldump -u wcnc -p smgp_...
总结来说,理解和正确处理`NULL`值是SQL查询中的关键部分,特别是在复杂的查询和数据验证中。在MySQL中,使用`IS NULL`和`IS NOT NULL`来处理`NULL`值,同时了解相关的函数和约束,能帮助我们更有效地管理和操作数据...
在Java Web开发过程中,MySQL数据库中的中文编码问题是非常常见的技术难题之一。如果处理不当,可能会导致中文显示乱码、数据插入失败等问题。本文将深入探讨MySQL中文编码的相关设置,并提供一种有效的解决方案。 ...
- **创建/删除数据库**:使用`$mysqladmin -u root -p create xxx`创建数据库,或者在MySQL客户端中使用`mysql> create database 数据库名;`。删除数据库则使用`mysql> drop database [if exists] 数据库名;`。 - **...
- **示例**:将表t2中的列a的数据类型由INTEGER更改为TINYINT NOT NULL: ```sql ALTER TABLE t2 MODIFY a TINYINT NOT NULL; ``` ### 数据库与表的备份与恢复 #### 备份整个数据库 - **命令格式**:`mysqldump -h...
在 Windows 系统下,若希望 MySQL 支持大小写敏感,可以在 `my.ini` 文件中的 `[mysqld]` 部分添加以下设置: ```ini lower_case_table_names=2 ``` #### DOS 命令下 MySQL 服务管理 - **启动 MySQL 服务**:`...
- **避免使用NULL**:NULL值不利于索引,且占用更多存储空间,即使MySQL已做优化,但效果有限。 3. **索引优化策略**: - **Btree索引**:Btree索引是MySQL中最常见的索引类型,适用于范围查询和排序。它基于平衡...
根据提供的文件信息,本文将对MySQL的使用方法进行详细的总结与解释,旨在为读者提供一套实用的操作指南。MySQL是一款广泛使用的开源关系型数据库管理系统,在Web应用程序、数据仓库、数据分析等领域有着广泛的应用...
### MySQL教程详细总结 #### 引言 MySQL是一款广泛使用的开源关系型数据库管理系统,因其高效稳定、易于管理和扩展性等特点而备受青睐。本文档旨在总结MySQL的一些基础与进阶知识,便于快速查阅与复习。 #### ...
### MySQL集群主从安装总结 在本篇文章中,我们将详细探讨如何进行MySQL集群的主从复制配置,并通过一系列具体的步骤来实现这一目标。MySQL主从复制是一种常见的数据冗余技术,它能够帮助我们构建高可用性和高可靠...
Mysql 数据库学习总结 Mysql 数据库学习总结涵盖了数据库的基本操作、表的基本操作、完整性约束、修改表等方面的知识点。 数据库的基本操作: * 创建数据库:使用 `Create database` 语句创建数据库,例如 `...
Mysql知识点总结 1. 数据库基本术语:数据库是数据的集合,MySQL是一种数据库管理系统(DBMS),它使用SQL语言进行数据库的管理。 2. 查询: - 查询多列:使用SELECT语句可选取一个或多个列。 - 检索唯一值:...