在 SQL 语句中处理 NULL 值的方法

在日常使用数据库时,你在意过NULL值么?

其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧;

在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查询语句该怎么写呢?

是这样:

SELECT * FROM TABLE WHERE USER_AGE = NULL

还是这样?

SELECT * FROM TABLE WHERE USER_AGE IS NULL

当然,正确的写法应该是第二种(WHERE USER_AGE IS NULL)。

但为什么要这样写呢?在进行数据库数据比较操作时,我们不会使用“IS”关键词,不是吗?

例如,如果我们想要知道一个列的值是否等于 1,WHERE 语句是这样的:

WHERE USER_AGE = 1

那为什么 NULL 值要用 IS 关键字呢?为什么要以这种方式来处理 NULL?

因为,在 SQL 中,NULL 表示“未知”。也就是说,NULL 值表示的是“未知”的值。

NULL = 未知;

在大多数数据库中,NULl 和空字符串是有区别的。

但并不是所有数据库都这样,例如,Oracle 就不支持空字符串,它会把空字符串自动转成 NULL 值。

在其他大多数数据库里,NULL 值和字符串的处理方式是不一样的:

  • 空字符("")串虽然表示“没有值”,但这个值是已知的。
  • NULL 表示 “未知值”,这个值是未知的。

Oracle 比较特殊,两个值都使用 NULL 来表示,而其他大多数数据库会区分对待。

但只要记住 NULL 表示的是一个未知的值,那么在写 SQL 查询语句时就会得心应手。

例如,如果你有一个这样的查询语句:

SELECT * FROM SOME_TABLE WHERE 1 = 1

这个查询会返回所有的行(假设 SOME_TABLE 不是空表),因为表达式“1=1”一定为 true。

如果我这样写:

SELECT * FROM SOME_TABLE WHERE 1 = 0

表达式“1=0”是 false,这个查询语句不会返回任何数据。

但如果我写成这样:

SELECT * FROM SOME_TABLE WHERE 1 = NULL

这个时候,数据库不知道这两个值(1 和 NULL)是否相等,因此会认定为“NULL”或“未知”,所以它也不会返回任何数据。

三元逻辑

SQL 查询语句中的 WHERE 一般会有三种结果:

  • 它可以是 true(这个时候会返回数据);
  • 它可以是 false(这个时候不会返回数据);
  • 它也可以是 NULL 或未知(这个时候也不会返回数据);

你可能会想:“既然这样,那我为什么要去关心是 false 还是 NULL?它们不是都不会返回数据吗?”

接下来,我来告诉你在哪些情况下会有问题:我们来看看 NOT( ) 方法。

假设有这样的一个查询语句:

SELECT * FROM SOME_TABLE WHERE NOT(1 = 1)

数据库首先会计算 1=1,这个显然是 true。

接着,数据库会应用 NOT() 条件,所以 WHERE 返回 false。

所以,上面的查询不会返回任何数据。

但如果把语句改成这样:

SELECT * FROM SOME_TABLE WHERE NOT(1 = 0)

数据库首先会计算 1=0,这个肯定是 false。

接着,数据库应用 NOT() 条件,这样就得到相反的结果,变成了 true。

所以,这个语句会返回数据。

但如果把语句再改成下面这样呢?

SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)

数据库首先计算 1=NULL,它不知道 1 是否等于 NULL,因为它不知道 NULL 的值是什么。

所以,这个计算不会返回 true,也不会返回 false,它会返回一个 NULL。

接下来,NOT() 会继续解析上一个计算返回的结果。

当 NOT() 遇到 NULL,它会生成另一个 NULL。未知的相反面是另一个未知。

所以,对于这两个查询:

SELECT * FROM SOME_TABLE WHERE NOT(1 = NULL)

SELECT * FROM SOME_TABLE WHERE 1 = NULL

都不会返回数据,尽管它们是完全相反的。

NULL 和 NOT IN

如果我有这样的一个查询语句:

SELECT * FROM TABLE WHERE 1 IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 true,这个语句将返回数据,因为 1 在括号列表里是存在的。

但如果这么写:

SELECT * FROM SOME_TABLE WHERE 1 NOT IN (1, 2, 3, 4, NULL)

很显然,WHERE 返回 false,这个查询不会返回数据,因为 1 在括号列表里存在,但我们说的是“NOT IN”。

但如果我们把语句改成这样呢?

SELECT * FROM SOME_TABLE WHERE 5 NOT IN (1, 2, 3, 4, NULL)

这里的 WHERE 不会返回数据,因为它的结果不是 true。数字 5 在括号列表里可能不存在,也可能存在,因为当中有一个 NULL 值(数据库不知道 NULL 的值是什么)。

这个 WHERE 会返回 NULL,所以整个查询不会返回任何数据。

希望大家现在都清楚该怎么在 SQL 语句中处理 NULL 值了。

以上就是在 SQL 语句中处理 NULL 值的方法的详细内容,更多关于SQL 中的 NULL值的资料请关注我们其它相关文章!

(0)

相关推荐

  • mysql中将null值转换为0的语句

    复制代码 代码如下: SELECT IF(AVG(cai.conversionsRate) IS NULL,0,AVG(cai.conversionsRate)) AS conversionsRate FROM campaign_info cai WHERE insertTime BETWEEN '2011-02-01' AND '2011-02-04' AND googleCampaignId=23331401

  • SQLSERVER ISNULL 函数与判断值是否为空的sql语句

    先来有用的 复制代码 代码如下: use 数据库 update news set author='jb51' where author is null 如果你的不正确那就说明你的什么地方打错了.仔细看下,强烈建议操作以前先备份下数据库. 说明:使用指定的替换值替换 NULL. 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将被检查是否为 NULL 的表达式.check_expression 可以为任

  • sqlserver 不能将值NULL插入列id(列不允许有空值解决)

    错误现象: Microsoft OLE DB Provider for SQL Server 错误 '80040e2f'不能将值 NULL 插入列 'id',表 'web.dbo.dingdan':列不允许有空值.INSERT 失败. /Untitled-2.asp,行 115 原因分析: SQL数据库中,建立表时没有将id列标识规范设置为"是".所以大家在创建表的时候一定将id设为自动增加id,标识之类的. 解决办法: 点击表,修改,设置id列标识规范为"是",如

  • 详解MySQL中的NULL值

    我们已经看到使用WHERE子句的SQL SELECT命令来从MySQL表获取数据.但是,当我们试图给的条件比较字段或列的值为NULL,它不能正常工作. 为了处理这种情况,MySQL提供了三大运算符 IS NULL: 此运算符返回true,当列的值是NULL. IS NOT NULL: 运算符返回true,当列的值不是NULL. <=> 操作符比较值(不同于=运算符)为ture,即使两个NULL值 涉及NULL条件是特殊的.不能使用 =NULL 或 !=NULL 寻找NULL值的列.这种比较总是

  • MySQL中对于NULL值的理解和使用教程

    NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西.不是这样的!例如,下列语句是完全不同的: mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (""); 两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串.第一个的含义可以认为是"电话号码不

  • 在SQL Server中使用ISNULL执行空值判断查询

    有如下查询: 复制代码 代码如下: select isnull(lastchanged,'') as lastchanged from vhhostlist where s_comment='test202' 本来,ISNULL函数只有一个参数,它表示的含义就是判断这个参数的值是否为NULL,是NULL则返回TRUE,否则返回FALSE: 但是,在SQLServer的查询语句中,isnull需要两个参数,它的含义是如果参数1为NULL,则以参数2为isnull函数的返回值: 即,上面查询的的含义

  • SQLserver查询数据类型为ntext是空或NULL值的方法

    复制代码 代码如下: --为空的值text ntext select * from lf_newsNg_utf where datalength(newsContentE)=0 or datalength(newsContentE) is null

  • 在 SQL 语句中处理 NULL 值的方法

    在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 NULL,SQL 查询语句该怎么写呢? 是这样: SELECT * FROM TABLE WHERE USER_AGE = NULL 还是这样? SELECT * FROM TABLE WHERE USER_AGE IS NULL 当然,正确的写法应该是第二种(WHERE USER_AGE IS

  • sql 语句中的 NULL值

    今天写了这样的代码 复制代码 代码如下: DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr = NULL) BEGIN PRINT 1 END 原本是想打印出1的.但是没有. 把 代码修改成如下: DECLARE @atr NVARCHAR(20) SET @atr = NULL IF(@atr IS NULL) BEGIN PRINT 1 END 这样就正确打印出1了. 然后自己有做了如下的修改,把if语句修改成 复制代码 代码如下: IF(N

  • 列出SQL Server中具有默认值的所有字段的语句

    专家解答 通过查询任何数据库中的三个系统表,你可以获得每个表的每一个字段的默认值.下面是这个核心查询.它返回分配给当前数据库中每个用户表的默认值.这个查询在SQL 2000和SQL 2005中都是兼容的. Quote:  复制代码 代码如下: SELECT SO.NAME AS "Table Name", SC.NAME AS "Column Name", SM.TEXT AS "Default Value" FROM dbo.sysobject

  • Oracle数据库中对null值的排序及mull与空字符串的区别

    order by排序之null值处理方法 在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法: 1.使用nvl函数 语法:Nvl(expr1, expr2)     若EXPR1是NULL,

  • SQL语句中不同的连接JOIN及join的用法

    为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示. LEFT JOIN(左外连接):即使右边的表中没有匹配,也从左表返回所有的行. RIGHT JOIN(右外连接):即使左边的表中没有匹配,也从右表返回所有的行. FULL JOIN(全外连接):只要其中一个表中存在匹配就返回行. 如例,有grade表(课程号sn,分数scro

  • MySQL中关于null值的一个小问题

    今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没. 事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列给剔除掉,然后查看剩余的列信息,这个操作看起来比较简单,我用一个表模拟一下过程: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `age` int(11) DEFAULT NULL,   `score` varchar(20) NOT NULL DEFAULT '',

  • SQL语句中的DDL类型的数据库定义语言操作

    目录 SQL语句之DDL类型的数据库定义语言 1.DDL类型的SQL语句基本概述 2.DDL类型的SQL语句之数据库层面的操作 2.1.创建一个数据库 2.2.查看MySQL中有哪些数据库 2.3.进入某个数据库 2.4.查看当前处于哪个数据库中 3.DDL类型的SQL语句之数据库表层面的操作 3.1.创建一张数据表 3.2.查看当前数据库中所有的数据表 3.3.查询某张表的表结构 3.4.查询某张表的建表语句 3.5.在现有表中添加新的字段 3.6.修改现有表中的字段数据类型和字段名称 3.7

  • SQL语句中的ON DUPLICATE KEY UPDATE使用

    目录 一:主键索引,唯一索引和普通索引的关系 主键索引 唯一索引: 普通索引: 二:ON DUPLICATE KEY UPDATE使用测试(MYSQL下的Innodb引擎) 1:ON DUPLICATE KEY UPDATE功能介绍: 2:ON DUPLICATE KEY UPDATE测试样例+总结: 总结: 一:主键索引,唯一索引和普通索引的关系 主键索引 主键索引是唯一索引的特殊类型. 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行.该列称为表的主键. 在数据库关系图中为表定义一个

  • sql语句 update字段null不能用is null问题

    目录 sql语句 update字段null不能用is null update更新数据时null字段是否更新进数据库总结 情况一:不需要更新进数据库 情况二:需要更新进数据库 (推荐方法3) sql语句 update字段null不能用is null update字段为 null 值时, 要用 set column = null, 而不是 set column is null  UPDATE tableA set 字段a is null WHERE字段b = 条件; 例: mysql> UPDATE

随机推荐