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
插入表的第一个TIMESTAMP
列,则插入当前的日期和时间。如果你将NULL
插入一个AUTO_INCREMENT
列,则插入顺序中的下一个数字。
在《SQL-3参考大全》中,作者这样解释NULL的含义:未知或未定义。对NULL来说,有很多有趣的特性。
NULL是一个数据值,而且它属于一个域(?)。是的,例如一个字符串字段,其中的空值只能是一个字符串。尽管它的内容没有定义,或者未知,但它是字符串,这一点无可置疑。
NULL不是非法数据,这一点SQL-3 标准也说的很清楚。我们没有办法保存零分之一,但可以保存空值。虽然它是空值,是未定义,是未知,可它也的确是 一个合法的信息。
运算黑洞:对于NULL,一般的运算都会返回NULL。比如加减乘除,这简直就是一个黑洞一样。永远不会有什么数据等于NULL。当然,1不等于NULL,2也一样。可是,NULL也不等于NULL。说一个NULL等于NULL是错误的。所以我们只能比较它“是”或“不是”。为了避免混乱,SQL-3标准有一些约定。比如表达式 x=NULL,结果应当是UNKOWN 。 而表达式“x is NULL”,就得看情况,如果x是NULL或 False,就返回Ture(?);x是非NULL,返回False。有点奇怪是不是,它基于NULL不等于NULL。 这个规则的确为SQL标准所支持,遇到这样的数据库系统,可不要感到惊讶。
三值逻辑:《鹿鼎记》中的韦小宝,整人的秘诀之一就是“我问你话,是就点头,不是就摇头,不许你出声!”的确,通常我们的逻辑观点,总是基于这种二值逻辑体系,对就是对,错就是错。可在关系理论中,没有这么简单。有一种没有绝对是非的情况存在:NULL。这就是关系理论的三值逻辑。
还有一些常见的与NULL相关的情况。比如,统计函数(也有的文档称之为聚集函数、集函数)通常会忽略NULL。不过,假设有这样一个表T:
C
-----
1
2
NULL
NULL
我们分别执行两个查询:SELECT COUNT(*) FROM T和SELECT COUNT(C) FROM T, 猜猜会有什么不同?起初,我以为两个结果应当一样。结果,前一个是4,后一个是2。前一个等于4,显然基于NULL也是数据这个事实;而后一个结果为2,是由于统计C列时,COUNT忽略了NULL。
SQL-3标准中,搜索条件(WHERE和HAVING)只接受TRUE,而约束却只拒绝FALSE,二者对NULL的接受态度相反。所以我们前面见到的ROOMS表才可以把空值写入人员字段。而在排序时,却又没什么规律。SQL标准只作出了一个补充定义,所以每个DBMS的处理 ORDER BY的方法并不相同,当然NULL不是高于所有值就是低于所有值。
在《SQL-3参考大全》中介绍了更详细的关于NULL的内容。另外,书中还介绍了两位数据库专家C.J.Date和E.f.Codd关于NULL的不同论点(E.F.Codd甚至希望有四值逻辑)有兴趣的朋友可以找来一读。在实践中,我们还会遇到一些有趣的事,特别是联接查询中, NULL让我们的人生变得 “丰富多彩”。
分享到:
相关推荐
以下是对给定文件中SQL语句的详细讲解和实例分析: 1. **复制表结构:** ```sql SELECT * INTO b FROM a WHERE 1<>1 ``` 这个命令会创建一个新的表`b`,并从表`a`中复制所有的列定义,但不复制任何数据。`WHERE...
### SQL简明讲解教程 #### 一、SQL简介与重要性 **结构化查询语言**(Structured Query Language),简称**SQL**,是一种专为管理和处理关系型数据库而设计的语言。SQL不仅是进行数据存取的基础工具,也是数据库管理...
SQL Server支持的约束包括:空值约束(NULL或NOT NULL)、主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、默认值约束(DEFAULT)、唯一性约束(UNIQUE)以及检查约束(CHECK)。 对于已创建的表,可以进行的...
5. **空值检查**:`IS NULL`或`IS NOT NULL`。 **四、排序与分组** `ORDER BY`子句用于对结果集进行排序,`GROUP BY`子句用于对数据进行分组,常与聚合函数如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`一起使用。 1. **...
`lab833-4-2 joindb 中实现数据完整性的各种约束.sql`和`lab833-4-2 joindb 实现constraint(default,rule)约束.sql`这两文件可能专注于数据完整性,这是数据库设计的重要部分,包括实体完整性(如NOT NULL约束)、...
本文将深入讲解Oracle SQL的一些核心概念和语句,帮助你更好地理解和运用它。 首先,SQL*PLUS是Oracle数据库的命令行工具,用于交互式访问数据库。登录Oracle SQL*PLUS需要输入SQLPLUS命令,接着输入Oracle用户的...
SQL 触发器实例讲解 SQL 触发器是一种特殊的存储过程,用于在数据库中执行某些操作时自动触发某些事件。触发器可以应用于 Insert、Update、Delete 事件等。 什么是触发器? 触发器是一个特殊的存储过程,在 SQL ...
### ORACLE数据库教程-SQL使用讲解 #### 一、SQL简介 SQL,全称为Structured Query Language,即结构化查询语言,是由IBM公司在1970年代为其System R项目设计的一种数据库查询语言。自那时起,SQL迅速发展并成为...
【SQL2000实例教程讲解】 SQL2000是一种基于SQL标准的数据库管理系统,由微软公司开发,主要用于管理和处理关系型数据库。本教程旨在为初学者提供基础的SQL知识,涵盖创建数据库表格、数据查询、数据操作等方面。 ...
【SQL优化讲解】 SQL优化是数据库管理中至关重要的一步,旨在提高查询效率,减少资源消耗,从而提升整体系统性能。以下是一些优化SQL语句的原则和技巧: 1. **使用LIKE语句时的注意事项**: - 当使用LIKE操作符时...
SQL Server CLR(Common Language Runtime)是微软SQL Server数据库引擎中的一个功能,允许开发人员使用.NET Framework的任何语言(如C#、VB.NET或F#)编写存储过程、触发器、用户定义函数(UDFs)、类型和其他...
数据库SQL语句讲解PPT学习教案 这份PPT学习教案主要讲解了数据库SQL语句的基础知识,包括约束、基本查询、多表联合查询、子查询、数据操作等内容。下面是对该PPT学习教案的详细知识点解释: 一、约束 在数据库中...
本篇文章将详细讲解SQL数据库的基础知识,以SQL Server为例。 首先,基本的SELECT语句是SQL中最常用的命令,用于从数据库中检索数据。基本格式如下: ```sql SELECT 字段名 FROM 表名 WHERE 条件; ``` 例如,要查询...
乐山师范学院数据库编程期末答疑,卷子讲解,SQL server相关 如下是一个简化的员工考勤应用E-R图,请在SQL Server中创建名为YQKG的数据库,包括两个数据文件,一个日志文件,文件名按SQL Server对象命名规范定义,...
全网最全的SQL 讲解,带实例描述 目录概要: 1. SQL 简介 3 2. SQL 语法 4 3. SQL SELECT 语句 5 4. SQL WHERE 子句 7 5. SQL AND & OR 运算符 8 6. SQL ORDER BY 子句 9 7. SQL INSERT INTO 语句 11 8. SQL UPDATE...
例如,NOT NULL约束确保字段不能为NULL,UNIQUE约束确保数据的唯一性,FOREIGN KEY约束则维护了表之间的参照完整性。 3. **视图**:视图是虚拟表,基于一个或多个表的SELECT查询结果。它提供了一种方式来封装特定的...
的 SQL 语法差异、SQL 调优、NULL 值处理、事务、开窗函数等高级技术;通过对实际案例 开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容提要 本书主要介绍SQL以及在实际开发中的应用,并且对SQL在MYSQL、...