📄 265.html
字号:
<STYLE type=text/css>
<!--
body,td { font-size:9pt;}
hr { color: #000000; height: 1px}
-->
</STYLE>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD><TITLE>精选文章 >> Oracle 专栏 >> 漫 谈oracle 中 的 空 值</title>
</head>
<body >
<p><IMG SRC="../image/jsp001_middle_logo.gif" WIDTH="180" HEIGHT="60" BORDER=0 ALT=""></p>
<table width=100% bgcolor="#cccccc" align=center cellpadding="2" cellspacing="0" border=1 bordercolorlight="#000000" bordercolordark="#FFFFFF">
<tr bgcolor="#EFF8FF"><td>
<a href=http://www.jsp001.com/list_thread.php?int_attribute=2>精选文章</a>
>> <a href=http://www.jsp001.com/list_thread.php?forumid=20&int_attribute=2>Oracle 专栏</a>
>> 漫 谈oracle 中 的 空 值 [<a href=http://www.jsp001.com/forum/showthread.php?goto=newpost&threadid=265>查看别人的评论</a>]<br>
<hr><p>由 webmaster 发布于: 2001-02-05 11:45</p><p><img src="images/icons/icon7.gif" alt="Smile" border=0> </p><p>摘自:计算机世界日报<br><br><br>河 北 省 统 计 局 贾 书 民 <br>---- 在 数 据 库 中, 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况。 在 一 个 表 中, 如 果 一 行 中 的 某 列 没 有 值, 那 么 就 称 它 为 空 值(NULL)。 任 何 数 据 类 型 的 列, 只 要 没 有 使 用 非 空(NOT NULL) 或 主 键(PRIMARY KEY) 完 整 性 限 制, 都 可 以 出 现 空 值。 在 实 际 应 用 中, 如 果 忽 略 空 值 的 存 在, 将 会 造 成 造 成 不 必 要 的 麻 烦。 <br><br>---- 例 如, 在 下 面 的 雇 员 表(EMP) 中, 雇 员 名(ENAME) 为KING 的 行, 因 为KING 为 最 高 官 员(PRESIDENT), 他 没 有 主 管(MGR), 所 以 其MGR 为 空 值。 因 为 不 是 所 有 的 雇 员 都 有 手 续 费(COMM), 所 以 列COMM 允 许 有 空 值, 除300、500、1400、0 以 外 的 其 它 各 行COMM 均 为 空 值。 <br><br>EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<br>---- -------- -------- --------- -------- ------ ---------<br>7369 SMITH CLERK 7902 17-DEC-80 800 20<br>7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30<br>7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30<br>7566 JONES MANAGER 7839 02-APR-81 2975 20<br>7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30<br>7698 BLAKE MANAGER 7839 01-MAY-81 2850 30<br>7782 CLARK MANAGER 7839 09-JUN-81 2450 10<br>7788 SCOTT ANALYST 7566 09-DEC-82 3000 20<br>7839 KING PRESIDENT 17-NOV-81 5000 10<br>7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30<br>7876 ADAMS CLERK 7788 12-JAN-83 1100 20<br>7900 JAMES CLERK 7698 03-DEC-81 950 30<br>7902 FORD ANALYST 7566 03-DEC-81 3000 20<br>7934 MILLER CLERK 7782 23-JAN-82 1300 10<br><br>---- 本 文 将 以 上 述EMP 表 为 例, 具 体 讨 论 一 下 空 值 在 日 常 应 用 中 所 具 有 的 一 些 特 性。 <br><br>---- 一、 空 值 的 生 成 及 特 点 <br><br>---- 1. 空 值 的 生 成 <br><br>---- 如 果 一 列 没 有 非 空(NOT NULL) 完 整 性 限 制, 那 么 其 缺 省 的 值 为 空 值, 即 如 果 插 入 一 行 时 未 指 定 该 列 的 值, 则 其 值 为 空 值。 <br><br>---- 使 用SQL 语 句INSERT 插 入 行, 凡 未 涉 及 到 的 列, 其 值 为 空 值; 涉 及 到 的 列, 如 果 其 值 确 实 为 空 值, 插 入 时 可 以 用NULL 来 表 示( 对 于 字 符 型 的 列, 也 可 以 用'' 来 表 示)。 <br><br>---- 例: 插 入 一 行, 其EMPNO 为1、ENAME 为'JIA'、SAL 为10000、job 和comm 为 空 值。 <br><br>SQL >insert into emp(empno,ename,job,sal,comm) <br>values(1,'JIA',NULL,1000,NULL);<br>SQL >select * from emp where empno=1;<br>EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<br>--------- ---------- --------- --------- --------- ---------<br> 1 JIA 1000<br><br>---- 可 以 看 到 新 插 入 的 一 行, 除job 和comm 为 空 值 外,mgr、hiredate、deptno 三 列 由 于 插 入 时 未 涉 及, 也 为 空 值。 <br><br>---- 使 用SQL 语 句UPDATE 来 修 改 数 据, 空 值 可 用NULL 来 表 示( 对 于 字 符 型 的 列, 也 可 以 用'' 来 表 示)。 例: <br><br>SQL >update emp set ename=NULL,sal=NULL where empno=1;<br><br>---- 2. 空 值 的 特 点 <br><br>---- 空 值 具 有 以 下 特 点: <br><br>---- * 等 价 于 没 有 任 何 值。 <br><br>---- * 与 0、 空 字 符 串 或 空 格 不 同。 <br><br>---- * 在where 条 件 中, Oracle 认 为 结 果 为NULL 的 条 件 为FALSE, 带 有 这 样 条 件 的select 语 句 不 返 回 行, 并 且 不 返 回 错 误 信 息。 但NULL 和FALSE 是 不 同 的。 <br><br>---- * 排 序 时 比 其 他 数 据 都 大。 <br><br>---- * 空 值 不 能 被 索 引。 <br><br>---- 二、 空 值 的 测 试 <br><br>---- 因 为 空 值 表 示 缺 少 数 据, 所 以 空 值 和 其 它 值 没 有 可 比 性, 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 数 值 比 较, 当 然 也 包 括 空 值 本 身( 但 是 在decode 中 例 外, 两 个 空 值 被 认 为 是 等 价)。 测 试 空 值 只 能 用 比 较 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 带 有 其 它 比 较 操 作 符 的 条 件 表 达 式, 并 且 其 结 果 依 赖 于 空 值, 那 么 其 结 果 必 定 是NULL。 在where 条 件 中,Oracle 认 为 结 果 为NULL 的 条 件 为FALSE, 带 有 这 样 条 件 的select 语 句 不 返 回 行, 也 不 返 回 错 误 信 息。 <br><br>---- 例 如 查 询EMP 表 中MGR 为NULL 的 行: <br><br>SQL >select * from emp where mgr=''; <br>no rows selected<br>SQL >select * from emp where mgr=null; <br>no rows selected<br>SQL >select * from emp where mgr is null;<br>EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<br>---------- --------- --------- --------- ---------<br>7839 KING PRESIDENT 17-NOV-81 5000 10<br><br>---- 第1、2 句 写 法 不 妥,WHERE 条 件 结 果 为NULL, 不 返 回 行。 第 三 句 正 确, 返 回MGR 为 空 值 的 行。 <br><br>---- 三、 空 值 和 操 作 符 <br><br>---- 1. 空 值 和 逻 辑 操 作 符 <br><br>---- 逻 辑 操 作 符 <br><br>---- 表 达 式 <br><br>---- 结 果 <br><br>AND<br>NULL AND TRUE<br>NULL<br><br>NULL AND FALSE<br>FALSE<br><br>NULL AND NULL<br>NULL<br>OR<br>NULL OR TRUE<br>TRUE<br><br>NULL OR FALSE<br>NULL<br><br>NULL OR NULL<br>NULL<br>NOT<br>NOT NULL<br>NULL<br><br>---- 可 以 看 到, 在 真 值 表 中, 除NULL AND FALSE 结 果 为FALSE、NULL OR TRUE 结 果 为TRUE 以 外, 其 它 结 果 均 为NULL。 <br><br>---- 虽 然 在where 条 件 中,Oracle 认 为 结 果 为NULL 的WHERE 条 件 为FALSE, 但 在 条 件 表 达 式 中NULL 不 同 于FALSE。 例 如 在NOT ( NULL AND FALSE ) 和NOT ( NULL AND NULL ) 二 者 中 仅 有 一 处FALSE 和TRUE 的 区 别, 但NOT ( NULL AND FALSE ) 的 结 果 为 TRUE, 而NOT ( NULL AND NULL ) 的 结 果 为NULL。 <br><br>---- 下 面 举 例 说 明 空 值 和 逻 辑 操 作 符 的 用 法: <br><br>SQL > select * from emp where not comm=null and comm!=0;<br>no rows selected<br>SQL > select * from emp where not ( not comm=null and comm!=0 );<br>EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO<br> ---------- --------- --------- --------- ---------<br>7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30<br><br>---- 第 一 个Select 语 句, 条 件"not comm=null and comm!=0" 等 价 于NULL AND COMM!=0。 对 于 任 意 一 行, 如 果COMM 为 不 等 于0 的 数 值, 条 件 等 价 于NULL AND TRUE, 结 果 为NULL; 如 果COMM 等 于0, 条 件 等 价 于NULL AND FALSE, 结 果 为FALSE。 所 以, 最 终 结 果 不 返 回 行。 <br><br>---- 第 二 个Select 语 句 的 条 件 为 第 一 个Select 语 句 条 件 的" 非"(NOT), 对 于 任 意 一 行, 如 果COMM 为 不 等 于0 的 数 值, 条 件 等 价 于NOT NULL, 结 果 为NULL; 如 果COMM 等 于0, 条 件 等 价 于NOT FALSE, 结 果 为TRUE。 所 以, 最 终 结 果 返 回 行COMM 等 于0 的 行。 <br><br>---- 2. 空 值 和 比 较 操 作 符 <br><br>---- (1)IS [NOT] NULL: 是 用 来 测 试 空 值 的 唯 一 操 作 符( 见" 空 值 的 测 试")。 <br><br>(2)=、!=、>=、<=、>、<<br>SQL >select ename,sal,comm from emp where sal >comm;<br>ENAME SAL COMM<br>---------- --------- ---------<br>ALLEN 1600 300<br>WARD 1250 500<br>TURNER 1500 0<br><br>---- sal 或comm 为 空 值 的 行,sal>comm 比 较 结 果 为NULL, 所 以 凡 是sal 或comm 为 空 值 的 行 都 没 有 返 回。 <br><br>---- (3)IN 和NOT IN 操 作 符 <br><br>SQL >select ename,mgr from emp where mgr in (7902,NULL);<br>ENAME MGR<br>---------- ---------<br>SMITH 7902<br><br>---- 在 上 述 语 句 中, 条 件"mgr in (7902,NULL)" 等 价 于mgr=7902 or mgr=NULL。 对 于 表EMP 中 的 任 意 一 行, 如 果mgr 为NULL, 则 上 述 条 件 等 价 于NULL OR NULL, 即 为NULL; 如 果mgr 为 不 等 于7902 的 数 值, 则 上 述 条 件 等 价 于FALSE OR NULL, 即 为NULL; 如 果mgr 等 于7902, 则 上 述 条 件 等 价 于TRUE OR NULL, 即 为TRUE。 所 以, 最 终 结 果 能 返 回mgr 等 于7902 的 行。 <br><br>SQL >select deptno from emp where deptno not in ('10',NULL);<br>no rows selected<br><br>---- 在 上 述 语 句 中, 条 件"deptno not in ('10',NULL)" 等 价 于deptno!='10' and deptno!=NULL, 对 于EMP 表 中 的 任 意 一 行, 条 件 的 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。 <br><br>---- (4)any,some <br><br>SQL >select ename,sal from emp where sal > any(3000,null);<br>ENAME SAL<br>---------- ---------<br>KING 5000<br><br>---- 条 件"sal > any(3000,null)" 等 价 于sal >3000 or sal >null。 类 似 前 述(3) 第 一 句, 最 终 结 果 返 回 所 有sal >3000 的 行。 <br><br>---- (5)All <br><br>SQL >select ename,sal from emp where sal > all(3000,null);<br>no rows selected<br><br>---- 条 件"sal> all(3000,null)" 等 价 于sal >3000 and sal >null, 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。 <br><br>---- (6)(not)between <br><br>SQL >select ename,sal from emp where sal between null and 3000;<br>no rows selected<br><br>---- 条 件"sal between null and 3000" 等 价 于sal >=null and sal< =3000, 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。 <br><br>SQL >select ename,sal from emp where sal not between null and 3000;<br>ENAME SAL<br>---------- ---------<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -