access 查询空值和null值的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了access 查询空值和null值的区别相关的知识,希望对你有一定的参考价值。
空值和Null值,两者是同一个东西。前者是后者的中文说法。
我想楼主实际是想搞清楚 空字符串(我们也可以称之为0长度字符串)与Null值(空值)的区别。
尽管这两者在外观上看起来都是没东西,但是这两者有很大的区别:
1)空字符串(0长度字符串)在代码中用一对没有间隔的英文双引号表示--> "" (外层有双引号的情况下用一对英文单引号表示--> '')其数据类型是明确的,即为字符型。存储“空字符串”是要占据物理磁盘空间的;
2)Null值(空值)在代码中用关键字 "Null" 表示,代表没东西,其数据类型未知,它不占用物理磁盘空间。
为了进一步讲清楚这两者的区别,下面举一个数据表来说明
新建学生表 Students(ID 数字,Name 文本,Tel 文本)暂时不添加除数据类型外的任何约束
分别运行下列SQL动作查询,插入4条记录
a) insert into Students(ID,Name) values(1,"张三")
b) insert into Students(ID,Name,Tel) values(2,"李四",Null)
c) insert into Students(ID,Name,Tel) values(3,"王五","3348912")
d) insert into Students(ID,Name,Tel) values(4,"陈六","")
运行选择查询
select ID,Name,Tel,IIf(IsNull(Tel),"Null",IIf(Tel="","''",Tel)) as Tel的实际存储值 from Students
返回下列记录
注意因为空字符串和Null值的外观看起来都是空白的,故我用表达式IIf(IsNull(Tel),"Null",IIf(Tel="","''",Tel)) 将Tel字段实际存储的值显示出来
查出电话为空值(Null)的记录
select * from Students where Tel is Null
查出电话不为为空值(Null)的记录
select * from Students where Tel is not Null
查出电话为空字符串的记录
select * from Students where Tel=""
查出有电话的记录
select * from Students where Tel is not Null and Tel<>""
通过上面的解释应该比较清楚空字符串与NUll值的区别了。
如果一定要确保有学生的电话资料,我们应在数据表设计视图将Tel字段的”必填字段“属性设置为”是“同时还要将”允许空字符串“属性设置为”否“,如果这样设置后上述四条操作查询语句里只有c才能被执行。
参考技术A 在数据库系统中,空值是(什么也没有)。解释:
所谓的NULL就是什么都没有,连\0都没有,\0在字符串中是结束符,但是在物理内存是占空间的,等于一个字节,而NULL就是连这一个字节都没有。在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS关键字。
空 (NULL)
值表示数值未知(在实际意义中,如果使用null,就是代表变量值是未知的,比如手机号码设为null,说明不知道手机号码是什么)。空值不同于空白或零值。没有两个相等的空值。比较两个空值或将空值与任何其它数值相比均返回未知,这是因为每个空值均为未知。
在写入数据的时候,空字符串也是一个确定的值,所以就算定义了 NOT NULL 也可以被写入。 参考技术B 如果想查询某字段为空 就是 [字段] is null
不再迷惑,无值和NULL值
在关系型数据库的世界中,无值和NULL值的区别是什么?一直被这个问题困扰着,甚至在写TSQL脚本时,战战兢兢,如履薄冰,害怕因为自己的一知半解,挖了坑,贻害后来人,于是,本着上下求索,不达通幽不罢休的决心(开个玩笑),遂有此文。
学习过关系型数据库的伙伴都知道,NULL是指不确定的值,在数据库中绝对是噩梦的存在;而空值,一般对字符串类型而言,指没有任何值的字符串类型,为字符类型的变量设置为空值:set @vs=\'\',空值跟无值不同。有人可能会问,无值是什么?无值,是指数据表中没有任何数据。无值和不确定值,单从字面意思上来看,两者之间的定义很清楚,一旦深究,这两者之间的关系,有时令人十分迷惑(confused),这是因为,在特定条件下,无值会转换为NULL值。
一,举个栗子,理解无值和NULL值的区别
比如,创建一个临时表,在不插入任何数据时,该数据表是空的,没有任何值,对其执行select命令,将不会返回任何数据值:
create table #temp ( id int null )
创建一个标量类型的变量,在不初始化时,该变量的值是不确定的,其值是NULL:
declare @vs int
创建一个表类型变量,在不初始化时,该表变量没有任何数据,是无值的:
declare @vt as table ( id int null )
总结一下,声明一个标量型变量,如果没有对变量进行初始化,其值是不确定的,是NULL值;对于表变量,临时表和基础表,如果没有插入任何数据,该表没有任何数据,是无值的。
二,无值和NULL值的转换
在开始本节之前,先为变量赋值,简单的一个select命令就可以完成变量的赋值:
select @vs=1
有些朋友思维比较活跃,立马会想到:“用select命令可以从表中取值为变量赋值”,对,但是,赋值方法不是我求索的重点,我关注的是从表中取值为变量赋值的结果。
1,从空表中为变量赋值
如果数据表是空表,没有任何值,那么数据库引擎不会执行赋值语句,变量保持原有值不变:
select @vs=id from #temp
但是,如果采用以下方式,那么数据库引擎会执行赋值语句,由于空表不返回任何值,数据库引擎会把无值转换为不确定值NULL:
select @vs=(select top 1 id from #temp)
诧异吗?无值和NULL值的转换,居然从不起眼的变量赋值开始。注意,当不返回任何值时,数据库引擎不确定返回值,就把无值转换为NULL值。
2,从空表中计算聚合
空表是没有任何数据的表,计算聚合会产生怎样的结果?
select count(0) as count_all ,count(id) as count_id ,max(id) as max_id ,min(id) as min_id ,avg(id) as avg_id ,sum(id) as sum_id from #temp
当统计数据行数时,返回的是0;当计算聚合函数(max,min,avg和sum)的聚合值时,由于无值可以聚合,数据库引擎不能确定这些聚合函数的返回值,因此,数据库引擎返回NULL值。
三,聚合函数忽略NULL值
一般情况下,除了count(0),count(*)之外,聚合函数都会忽略NULL值,而统计非NULL值,如果读者有疑问,可以查看我的博客《TSQL 聚合函数忽略NULL值》。如果只知聚合函数忽略NULL值,而不知空表也会产生结果为NULL的聚合值,轻易得出聚合函数不会返回NULL值的定论,那就很尴尬。楼主曾遇到过一次“意外”,在一次调试脚本代码的过程中,我遇到max聚合函数返回NULL值的情况,当时一脸懵逼,直接怀疑自己之前的所学。
当聚合列值都是NULL值时,由于聚合函数忽略NULL值,因此,当计算聚合函数(max,min,avg和sum)的聚合值时,由于无值可以聚合,数据库引擎不能确定这些聚合函数的返回值,因此,数据库引擎返回NULL值。
insert into #temp(id) values(null) select count(0) as count_all ,count(id) as count_id ,max(id) as max_id ,min(id) as min_id ,avg(id) as avg_id ,sum(id) as sum_id from #temp
聚合函数(max,min,sum,avg和count)忽略null值,但不代表聚合函数不返回null值:如果数据表为空表,或聚合列值都是null,那么max,min,sum,avg聚合函数返回null值,而count 聚合函数返回0。聚合函数的共性:Null values are ignored。
不再迷惑:当不返回任何值时,数据库引擎不确定返回值,就把无值转换为NULL值。
附:select和set通过查询(query)对变量赋值的差异:
差异1:set 只能对变量赋值一次,而select 可以对变量赋值多次,变量值是最后一次赋值的结果
set @variable=(select top 1 column_name from data_table) select @variable=column_name from data_table
差异2:如果查询(query)不返回任何值,set把变量的值设置为NULL,而select将不会执行赋值操作,变量保持原来的值不变
--if query returns no value, assign variable null set/select @variable=(select top 1 column_name from data_table) --if query returns no value , the variable keeps previous value select @variable=column_name from data_table
代码中,查询(query)返回标量值,使用set和select对变量赋值,变量的值都是NULL
以上是关于access 查询空值和null值的区别的主要内容,如果未能解决你的问题,请参考以下文章