在Oracle中有个关键字叫NULL,它表示某个值是未知的、是不确定的。既然是未知的,就有无数种的可能性。因此,NULL并不是一个确定的值。先看两个例子吧:
例1:declare
v_b1 boolean:=null; --布尔值可以赋值null.当然它另外两种值只能是true,false了
v_a int := null;
v_b int := null; --整数可以给它赋值null
v_s varchar2(20):= null ; --字符也可以赋值null
begin
if(v_a= v_b) then --v_a 和v_b都是null但此处判断的结果是它们并不相等.改成v_a =null结果仍然是一样
dbms_output.put_line('v_a equal v_b');
else
dbms_output.put_line('v_a not equal v_b');--输出这个结果
end if;
if(v_b1) then --把v_b1改成not v_b1结果都一样.也就是v_b1和把它取反都不会是true
dbms_output.put_line('v_b1 equal true');
else
dbms_output.put_line('v_b1 is not true');--输出这个结果
end if;
if(true or v_b1) then --输出v_b1 equal true
dbms_output.put_line('v_b1 equal true');
else
dbms_output.put_line('v_b1 is not true'); -- 如果把前面的判断条件改成true and v_b1 则输入这条语句
end if;
end;
create table test (ename char(1),constraint ck_test check(ename in ('a',null)));
--上面的语句创建一个表,只有一列ename,给此列添加约束条件,它的值只能在列表('a',null)中.但实际上我们可以插入任何字符.这时貌似null可以代表所有的字符了.去掉它只能插入'a'
但如果我们这样创建表
create table test1 (ename char(1),constraint ck_test check(ename not in ('a',null)));
--按我们猜想如果null能代表所有字符了那它取反就是不能输入任何字符.但实际上不是.此处它貌似没起任何作用.去掉它和不去掉效果一样.都可以插入除'a'外的任何字符
看了上面两个例子是不是有点晕了啊,其实我们可以这样理解.既然null是个不确定的类型,就可以转变成任何类型中的任何值.就像C#中的object类型.它是任何类型的父类.可以代表任何类型.我们可以在运行程序时再去动态确定它的具体类型.那么null如果是处在一个条件判断条件中得让它取特定类型的所有值去进行判断.如果结果都为真才为真.
如例1中两个整数值v_a,v_b都是null.要让他们相等得让null取所有的整数去判断.那样自然不可能都相等.所以为假.而true or v_b1之所以为真了是因为or前面的为真的话不去对后面的v_b1做判断了.而v_b1和not v_b1都为假则可以认为v_b1可以取true和false,把这两种值都代入则不可能保证都为true所以最终结果为false.
这样来理解了null就不难明白为什么我们在一个表中插入一个null值.但我们不能通过判断条件=null来查询.不过oracle提供了关键字is来判断一个值是否是null.
例2中第二种情况是有点反常.我们就当作如果什么都不让用户插入,但建个表没啥意义.所以不这样
至于Oracle后台是怎么存储null值和操作null值的就不清楚了啊.
其实空字符串和其他字符的操作是一样的.只是用它的时候眼神要好点,别搞错了.举个例子
先建表create table arwen(ename varchar2(1)); --此列只能插入一个字符
insert into arwen values(' ');--注意引号中是一个空格.如果是两个空格会出错的,因为是两个字符了.
select * from arwen where ename = ' '; --返回一行.这里引号中也必须是一个空格.
如果是''也就是引号中没空格.那插入它时Oracle默认把它变成null了.所以如果引号中没空格我们就不能叫它空字符串了啊.不知道叫啥好啊.觉得有null了它好像有点多余
例如create table arwen(eno int);
insert into arwen values(44);
insert into arwen alues(''); --引号是没有空格
insert into arwen alues(null);
这上面三条语句都会成功插入.
虽然''被默认转换成null但我们不能用is '' 或=''来用它
例如你select count(*) from arwen 或者select count(*) from arwen where ename is null--结果是3
但如果是select count(*) from arwen where ename is ‘’ 或者 select count(*) from arwen where ename =‘’结果就是0
就是如果碰到哪个地方是null就把它转换成其他的东东
例如上面插入三行后我们这样查找select nvl(ename,11) from arwen; --结果是44 11 11
ename如果是null就转换成11如果不是null就原样输出
在用avg,max,min这些函数时会把null忽略掉
比如create table arwen(eno int);
insert into arwen values(1);
insert into arwen values(2);
insert into arwen values(null);
select avg(eno) from arwen;--结果为1.5.这是因为忽略掉null了不然应该是1的
select max(eno) from arwen;--结果为2
如果在排序中会把null当作最大值处理.就像无穷大一样