mysql中的null值和空值区别,注意到null值是未知的,占用空间,并且不走索引;下面转载两篇文笔记之:
http://my.oschina.net/junn/blog/161769
相信很多用了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 会参与字段比较,所以对效率有一部分影响。
而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。
我们再向test的表中插入几条数据:
INSERT INTO `test` VALUES ('', NULL);
INSERT INTO `test` VALUES ('1', '2');
现在表中数据:
现在根据需求,我要统计test表中col1不为空的所有数据,我是该用“<> ''” 还是 “IS NOT NULL” 呢,让我们来看一下结果的区别。
SELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ''
可以看到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件。
---------------------------------
http://blog.csdn.net/eroswang/article/details/8529817
Mysql数据库是一个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱。
陷阱一:空值不一定为空
空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。此时为出现什么情况呢
我先创建了一个表。在这个表中有两个字段:User_id(其数据类型是int)、Date(其数据类型是TimesTamp)。现在往这个表中插入一条记录,其中往Date字段中插入的是一个NULL空值。可是当我们查询时,其结果显示的却是插入记录的当前时间。这是怎么一回事呢?其实这就是在MySQL数据库中执行SQL语句时经常会遇到的一个陷阱:空值不一定为空。在操作时,明明插入的是一个空值的数据,但是最后查询得到的却不是一个空值。
在MySQL数据库中,NULL对于一些特殊类型的列来说,其代表了一种特殊的含义,而不仅仅是一个空值。对于这些特殊类型的列,各位读者主要是要记住两个。一个就是笔者上面举的TimesTamp数据类型。如果往这个数据类型的列中插入Null值,则其代表的就是系统的当前时间。另外一个是具有auto_increment属性的列。如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列。而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。
陷阱二:空值不一定等于空字符
在MySQL中,空值(Null)与空字符(’’)相同吗?答案是否定的。
在同一个数据库表中,同时插入一个Null值的数据和一个’’空字符的数据,然后利用Select语句进行查询。显然其显示的结果是不相同的。从这个结果中就可以看出,空值不等于空字符。这就是在MySQL中执行SQL语句遇到的第二个陷阱。在实际工作中,空值数据与空字符往往表示不同的含义。数据库管理员可以根据实际的需要来进行选择。如对于电话号码等字段,可以默认设置为空值(表示根本不知道对方的电话号码)或者设置为空字符(表示后来取消了这个号码)等等。由于他们在数据库中会有不同的表现形式,所以数据库管理员需要区别对待。笔者更加喜欢使用空值,而不是空字符。这主要是因为针对空值这个数据类型有几个比较特殊的运算字符。如果某个字段是空字符,数据库中是利用字段名称来代替。相反,如果插入的是空值,则直接显示的是NULL。这跟其他数据库的显示方式也是不同的。
一是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含用空值的数据,需要使用特殊的关键字。其中前者表示这个字段为空,后者表示这个字段为非空。在Select语句的查询条件中这两个关键字非常的有用。如需要查询所有电话号码为空的用户(需要他们补充电话号码信息),就可以在查询条件中加入is not null关键字。
二是Count等统计函数,在空值上也有特殊的应用。如现在需要统计用户信息表中有电话号码的用户数量,此时就可以使用count函数、同时将电话号码作为参数来使用。因为在统计过程中,这个函数会自动忽略空值的数据。此时统计出来的就是有电话号码的用户信息。如果采用的是空字符的数据,则这个函数会将其统计进去。统计刚才建立的两条记录时,系统统计的结果是1,而不是2。可见系统自动将Null值的数据忽略掉了。
判断NULL用is null 或者 is not null。 sql语句里可以用ifnull函数来处理
判断空字符串‘’,要用 ='' 或者 <>''。sql语句里可以用if(col,col,0)处理,即:当col为true时(非null,及非'')显示,否则打印0
- 浏览: 450607 次
- 性别:
- 来自: 成都
最新评论
-
muqingren:
...
Maven多模块布局实例详解 -
shutear:
解决了我的难题,谢谢分享!
Unable to load configuration. - action - file:/D:/studytool/apache-tomcat-6.0.16 -
702346318:
[img][/img][flash=200,200][/fla ...
CAS单点登录完整教程(上)【转】 -
liuguofeng:
PersonS631887934 写道学习中。。 有个问题想请 ...
js constructor属性 -
S631887934:
学习中。。 有个问题想请教楼主为什么要加上Person.pro ...
js constructor属性
相关推荐
### MySQL约束课堂笔记知识点 #### DQL:查询语句 **1. 排序查询** - **语法**:`ORDER BY`子句用于对结果集按照一个或多个列的值进行排序。 - 示例语法:`ORDER BY column1 ASC|DESC, column2 ASC|DESC` - `...
- **列定义必须为NOT NULL**:CSV存储引擎中的所有列都必须被定义为`NOT NULL`,不允许存在空值。 - **不支持自增列**:由于CSV文件的特性,它不支持自增列的功能。 - **数据安全性低**:可以直接通过文本编辑器修改...
今天我们来看一下 MySQL 的字段约束:NULL 和 NOT NULL 修饰符、DEFAULT 修饰符、AUTO_INCREMENT 修饰符。 NULL 和 NOT NULL 修饰符 NULL 和 NOT NULL 修饰符可以在每个字段后面添加,以指定该字段是否可以为空...
其中`表的结构定义`指定了表中的字段名、数据类型和其他属性,如是否允许空值等。 - **字段定义示例**: ```sql 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | ...
这篇学习笔记主要涉及了MySQL中的SQL语句使用和优化,特别关注了检索、排序数据和过滤数据的方法。以下是对这些知识点的详细解释: 1. **检索/排序数据**: - **DISTINCT**:用于去除重复行,返回唯一不同的数据。...
### MySQL详细学习笔记 #### 数据库基础 **数据库的相关概念:** - **DB(Database)**: 数据库,即数据的仓库,是用来存储一系列有组织的数据的集合。 - **DBMS (Database Management System)**: 数据库管理系统...
### MySQL学习笔记 #### 一、基础知识介绍 MySQL是一种关系型数据库管理系统(RDBMS),它采用SQL(Structured Query Language)作为数据查询语言。相比于将所有数据存储在一个大型仓库内的传统方式,MySQL通过将...
《高性能MySQL笔记》 在构建高性能的MySQL数据库系统中,设计合理的表结构、选用恰当的数据类型、优化SQL语句以及实现分区和读写分离是关键环节。以下将详细阐述这些知识点。 首先,InnoDB存储引擎利用多版本并发...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其...以上就是关于MySQL高级笔记中的索引介绍,包括索引的定义、优势和劣势、不同类型以及创建语法。掌握这些知识对于优化数据库性能和编写高效的SQL查询至关重要。
总结来说,本篇SQL笔记详细介绍了在MySQL数据库中使用SQL进行数据操作的各个方面,包括数据库和表的创建、数据的插入、查询语句的构造以及数据的修改和删除。通过对这些基本知识点的理解和掌握,我们可以更有效地...
### MySQL学习笔记—索引详解 #### 索引的重要性 在MySQL中,索引扮演着极其重要的角色,尤其在处理大数据量时更是如此。合理的索引设计不仅可以大幅提升查询性能,还能有效降低服务器资源消耗。根据给定的信息,...
- `COUNT`、`SUM`、`AVG`、`MAX`、`MIN`分别用于统计数量、求和、计算平均值、找出最大值和最小值。 19. **分组和筛选**: - `GROUP BY`用于数据分组。 - `HAVING`用于筛选分组后的数据。 20. **字符串和数学...
MySQL笔记1主要涵盖了数据库基础、MySQL简介、使用MySQL连接、数据检索、排序、过滤、通配符与正则表达式、计算字段、函数、汇总数据、分组、子查询、联结、全文本搜索、数据插入、更新与删除、创建和操纵表、视图、...
- `ifnull()` 函数用于处理空值(NULL),当第一个参数为NULL时,将返回第二个参数指定的值。 5. MySQL表结构调整: - 修改表名:使用 `ALTER TABLE old_name RENAME TO new_name;` 来修改已存在的表名。 - 添加...
6. 约束:约束是确保数据完整性的规则,如NOT NULL约束(不允许空值)、UNIQUE约束(确保唯一性)、PRIMARY KEY约束(主键,唯一且非空)和FOREIGN KEY约束(外键,用于关联两个表)。 7. 事务:事务是一系列数据库...
### MySQL 学习笔记知识点详解 #### 一、MySQL 存储结构 MySQL 的存储结构主要包括以下几个层次: 1. **数据库**: 数据库是用于组织、存储和管理数据的集合。在 MySQL 中,可以通过创建不同的数据库来区分不同业务...
### Oracle学习笔记要点 #### 一、SQL Plus的使用方法 - **命令行方式**: 在命令行中直接输入 `sqlplus` 命令,并随后输入用户名和密码。 - **客户端方式**: 使用Oracle提供的SQL Plus客户端工具进行登录。 - **Web...
- **处理空值**:使用 `nvl()` 函数将空值转换为指定值,如 `SQL> select nvl(comm, 0) from emp;`。 - **字符串连接**: - Oracle 中使用 `||` 连接两个字符串,例如 `SQL> select ename || '的薪水是' || sal ...
NVL:处理空值,把空值转化为指定值。可转化为日期、字符、数值等三种(注意:转化时,两参数必须要同类型) 如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0) 错误写法: Select last_name,...
4. **`MAX()`**和**`MIN()`**:找出最大值和最小值,如`SELECT MAX(字段), MIN(字段) FROM 表名;` 在使用这些函数时,通常结合`GROUP BY`语句进行分组计算,例如`SELECT column, COUNT(*) FROM table GROUP BY ...