null在oracle中是很特殊的值,任何类型的值都可以是null.对于不知类型关联的null,字面量null,可以认为他是无类型的
null 和其他任何值都不相等或相等,包括自身,但可以使用is null或者is not null 来进行判断
任何和null的比较操作,如<> = <=等都返回unknown
oracle对null处理有专门的函数,有nvl nvl2 nullif coalesce decode函数
SELECT * FROM t;
CREATE TABLE t(a NUMBER,b NUMBER);
CREATE UNIQUE INDEX idx_t ON t(a,b);
INSERT INTO t VALUES(NULL,null);
INSERT INTO t VALUES(1,null);
INSERT INTO t VALUES(NULL,1);
COMMIT;
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname=>USER,tabname=>'T');
DBMS_STATS.GATHER_INDEX_STATS(ownname=>USER ,indname=>'IDX_T');
END;
对有的版本不适用
create table tt(a number);
insert into tt values(null);
select * from tt;
alter table tt modify a not null;
如果源表的列式允许null,并且存在null值,那么此列不可修改为not null约束
truncate table tt;
insert into tt values(1);
alter table tt modify a not null;
alter table tt modify a null;
如果源表列没有null值,则可以修改为not null约束,原来是not null约束的修改为null约束也是可以的
drop table tt;
create table tt(a number not null default 1,b number);
create table tt(a number default 1 not null ,b number);
建表的时候not null 和default 放在一起,必须not null在default后面
在not in 非相关子查询中注意null
create table a(id number not null, b varchar2(10) not null);
create table b(id number ,name varchar2(10) not null);
insert into a values(1,'aa');
insert into a values(2,'bb');
insert into b values(1,'aa');
insert into b values(null,'bb');
select * from a where (id,b) not in (select id,name from b );
select * from a where (id,b) not in (select id,name from b where id is not null);
集合 分组语句中的null
sql 的集合处理union intersect minus是不包含重复行的,如果某列中含有null,其他列相同的则任务是重复行
select null a,null b from dual
union select null ,null from dual
union select null,1 from dual
union select null,1 from dual
null 是pl/sql boolean类型的第3个值
pl/sql动态语句中的绑定定量与null