打印本文 打印本文 关闭窗口 关闭窗口
漫 谈oracle 中 的 空 值
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1679  更新时间:2009/4/22 22:05:30  文章录入:mintao  责任编辑:mintao
如 此), 所 以 对 于||, 空 值 等 价 于 零 个 字 符 值。 例:
SQL >select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;
ENAME            MGR ENAME||MGR          SAL      COMM  SAL+COMM
---------- --------- ------------- --------- --------- ---------
SMITH           7902 SMITH7902           800 
ALLEN           7698 ALLEN7698          1600       300      1900
WARD            7698 WARD7698           1250       500      1750
JONES           7839 JONES7839          2975 
MARTIN          7698 MARTIN7698         1250      1400      2650
BLAKE           7839 BLAKE7839          2850 
CLARK           7839 CLARK7839          2450 
SCOTT           7566 SCOTT7566          3000 
KING                 KING               5000 
TURNER          7698 TURNER7698         1500         0      1500
ADAMS           7788 ADAMS7788          1100 
JAMES           7698 JAMES7698           950 
FORD            7566 FORD7566           3000 
MILLER          7782 MILLER7782         1300 

---- 我 们 可 以 看 到, 凡mgr 为 空 值 的,ename||mgr 结 果 等 于ename; 凡 是comm 为 空 值 的 行,sal+comm 均 为 空 值。

---- 四、 空 值 和 函 数

---- 1 . 空 值 和 度 量 函 数

---- 对 于 度 量 函 数, 如 果 给 定 的 参 数 为 空 值, 则 其(NVL、TRANSLATE 除 外) 返 回 值 为 空 值。 如 下 例 中 的ABS(COMM), 如 果COMM 为 空 值,ABS(COMM) 为 空 值。

SQL > select ename,sal,comm,abs(comm) from emp where sal< 1500;
ENAME            SAL      COMM ABS(COMM)
---------- --------- --------- ---------
SMITH            800
WARD            1250       500       500
MARTIN          1250      1400      1400
ADAMS           1100
JAMES            950
MILLER          1300

---- 2. 空 值 和 组 函 数

---- 组 函 数 忽 略 空 值。 在 实 际 应 用 中, 根 据 需 要 可 利 用nvl 函 数 用 零 代 替 空 值。 例:

SQL >select count(comm),sum(comm),avg(comm) from emp;
COUNT(COMM) SUM(COMM) AVG(COMM)
----------- --------- ---------
          4      2200       550
SQL >select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;
COUNT(NVL(COMM,0)) SUM(NVL(COMM,0)) AVG(NVL(COMM,0))
------------------ ---------------- ----------------
                14             2200        157.14286

---- 第 一 个SELECT 语 句 忽 略COMM 为 空 值 的 行, 第 二 个SELECT 语 句 使 用NVL 函 数 统 计 了 所 有 的COMM, 所 以 它 们 统 计 的 个 数、 平 均 值 都 不 相 同。 另 外 需 要 注 意 的 是, 在 利 用 组 函 数 进 行 数 据 处 理 时, 不 同 的 写 法 具 有 不 同 的 不 同 含 义, 在 实 际 应 用 中 应 灵 活 掌 握。 例 如:

SQL >select deptno,sum(sal),sum(comm), 
sum(sal+comm),sum(sal)+sum(comm),sum(nvl(sal,0)+nvl(comm,0)) 
from emp
group by deptno;
   DEPTNO  SUM(SAL) SUM(COMM) SUM(SAL+COMM) SUM(SAL)
+SUM(COMM) SUM(NVL(SAL,0)+NVL(COMM,0))
--------- --------- --------- ------------- ------- 
       10   8750                             8750
       20   10875                            10875
       30   9400      2200       7800        11600 11600

---- 可 以 看 到SUM(SAL+COMM)、SUM(SAL)+SUM(COMM)、 SUM(NVL(SAL,0)+NVL(COMM,0)) 的 区 别:SUM(SAL+COMM) 为 先 加 然 后 计 算 各 行 的 和, 如 果SAL、COMM 中 有 一 个 为NULL, 则 该 行 忽 略 不 计;SUM(SAL)+SUM(COMM) 为 先 计 算 各 行 的 合 计 然 后 再 加,SAL、COMM 中 的NULL 都 忽 略 不 计, 但 如 果 SUM(SAL)、SUM(COMM) 二 者 的 结 果 之 中 有 一 个 为NULL, 则 二 者 之 和 为NULL; 在SUM(NVL(SAL,0)+NVL(COMM,0)) 里,SAL、COMM 中 的NULL 按0 处 理。

---- 五、 空 值 的 其 它 特 性

---- 1. 空 值 在 排 序 时 大 于 任 何 值。 例 如:

SQL > select ename,comm from emp where deptno=''''30'''' order by comm;
ENAME           COMM
---------- ---------
TURNER             0
ALLEN            300
WARD             500
MARTIN          1400
BLAKE 
JAMES

---- 2. 空 值 不 能 被 索 引。 虽 然 在 某 列 上 建 立 了 索 引, 但 是 对 该 列 的 空 值 查 询 来 说, 因 为 空 值 没 有 被 索 引, 所 以 不 能 改 善 查 询 的 效 率。 例 如 下 面 的 查 询 不 能 利 用 在MGR 列 上 创 建 的 索 引。

SQL >select ename from emp where mgr is null;
ENAME
----------
KING

---- 另 外 正 是 因 为 空 值 不 被 索 引, 所 以 可 在 含 有 空 值 的 列 上 建 立 唯 一 性 索 引(UNIQUE INDEX)。 例 如, 可 以 在EMP 表 的COMM 列 上 建 立 唯 一 性 索 引:

SQL >  create unique index emp_comm on emp(comm);
Index created.

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口