在 数 据 库 中, 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况。 在 一 个 表 中, 如 果 一 行 中 的 某 列 没 有 值, 那 么 就 称 它 为 空 值(NULL)。 任 何 数 据 类 型 的 列, 只 要 没 有 使 用 非 空(NOT NULL) 或 主 键(PRIMARY KEY) 完 整 性 限 制, 都 可 以 出 现 空 值。 在 实 际 应 用 中, 如 果 忽 略 空 值 的 存 在, 将 会 造 成 造 成 不 必 要 的 麻 烦。

---- 例 如, 在 下 面 的 雇 员 表(EMP) 中, 雇 员 名(ENAME) 为KING 的 行, 因 为KING 为 最 高 官 员(PRESIDENT), 他 没 有 主 管(MGR), 所 以 其MGR 为 空 值。 因 为 不 是 所 有 的 雇 员 都 有 手 续 费(COMM), 所 以 列COMM 允 许 有 空 值, 除300、500、1400、0 以 外 的 其 它 各 行COMM 均 为 空 值。

---- 本 文 将 以 上 述EMP 表 为 例, 具 体 讨 论 一 下 空 值 在 日 常 应 用 中 所 具 有 的 一 些 特 性。

---- 一、 空 值 的 生 成 及 特 点

---- 1. 空 值 的 生 成

---- 如 果 一 列 没 有 非 空(NOT NULL) 完 整 性 限 制, 那 么 其 缺 省 的 值 为 空 值, 即 如 果 插 入 一 行 时 未 指 定 该 列 的 值, 则 其 值 为 空 值。

---- 使 用SQL 语 句INSERT 插 入 行, 凡 未 涉 及 到 的 列, 其 值 为 空 值; 涉 及 到 的 列, 如 果 其 值 确 实 为 空 值, 插 入 时 可 以 用NULL 来 表 示( 对 于 字 符 型 的 列, 也 可 以 用'' 来 表 示)。

---- 例: 插 入 一 行, 其EMPNO 为1、ENAME 为'JIA'、SAL 为10000、job 和comm 为 空 值。

---- 可 以 看 到 新 插 入 的 一 行, 除job 和comm 为 空 值 外,mgr、hiredate、deptno 三 列 由 于 插 入 时 未 涉 及, 也 为 空 值。

---- 使 用SQL 语 句UPDATE 来 修 改 数 据, 空 值 可 用NULL 来 表 示( 对 于 字 符 型 的 列, 也 可 以 用'' 来 表 示)。 例:

---- 2. 空 值 的 特 点

---- 空 值 具 有 以 下 特 点:

---- * 等 价 于 没 有 任 何 值。

---- * 与 0、 空 字 符 串 或 空 格 不 同。

---- * 在where 条 件 中, Oracle 认 为 结 果 为NULL 的 条 件 为FALSE, 带 有 这 样 条 件 的select 语 句 不 返 回 行, 并 且 不 返 回 错 误 信 息。 但NULL 和FALSE 是 不 同 的。

---- * 排 序 时 比 其 他 数 据 都 大。

---- * 空 值 不 能 被 索 引。

---- 二、 空 值 的 测 试

---- 因 为 空 值 表 示 缺 少 数 据, 所 以 空 值 和 其 它 值 没 有 可 比 性, 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 数 值 比 较, 当 然 也 包 括 空 值 本 身( 但 是 在decode 中 例 外, 两 个 空 值 被 认 为 是 等 价)。 测 试 空 值 只 能 用 比 较 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 带 有 其 它 比 较 操 作 符 的 条 件 表 达 式, 并 且 其 结 果 依 赖 于 空 值, 那 么 其 结 果 必 定 是NULL。 在where 条 件 中,Oracle 认 为 结 果 为NULL 的 条 件 为FALSE, 带 有 这 样 条 件 的select 语 句 不 返 回 行, 也 不 返 回 错 误 信 息。

---- 例 如 查 询EMP 表 中MGR 为NULL 的 行:

---- 第1、2 句 写 法 不 妥,WHERE 条 件 结 果 为NULL, 不 返 回 行。 第 三 句 正 确, 返 回MGR 为 空 值 的 行。

---- 三、 空 值 和 操 作 符

---- 1. 空 值 和 逻 辑 操 作 符

---- 逻 辑 操 作 符

---- 表 达 式

---- 结 果

---- 可 以 看 到, 在 真 值 表 中, 除NULL AND FALSE 结 果 为FALSE、NULL OR TRUE 结 果 为TRUE 以 外, 其 它 结 果 均 为NULL。

---- 虽 然 在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。

---- 下 面 举 例 说 明 空 值 和 逻 辑 操 作 符 的 用 法:

---- 第 一 个Select 语 句, 条 件"not comm=null and comm!=0" 等 价 于NULL AND COMM!=0。 对 于 任 意 一 行, 如 果COMM 为 不 等 于0 的 数 值, 条 件 等 价 于NULL AND TRUE, 结 果 为NULL; 如 果COMM 等 于0, 条 件 等 价 于NULL AND FALSE, 结 果 为FALSE。 所 以, 最 终 结 果 不 返 回 行。

---- 第 二 个Select 语 句 的 条 件 为 第 一 个Select 语 句 条 件 的" 非"(NOT), 对 于 任 意 一 行, 如 果COMM 为 不 等 于0 的 数 值, 条 件 等 价 于NOT NULL, 结 果 为NULL; 如 果COMM 等 于0, 条 件 等 价 于NOT FALSE, 结 果 为TRUE。 所 以, 最 终 结 果 返 回 行COMM 等 于0 的 行。

---- 2. 空 值 和 比 较 操 作 符

---- (1)IS [NOT] NULL: 是 用 来 测 试 空 值 的 唯 一 操 作 符( 见" 空 值 的 测 试")。

---- sal 或comm 为 空 值 的 行,sal>comm 比 较 结 果 为NULL, 所 以 凡 是sal 或comm 为 空 值 的 行 都 没 有 返 回。

---- (3)IN 和NOT IN 操 作 符

---- 在 上 述 语 句 中, 条 件"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 的 行。

---- 在 上 述 语 句 中, 条 件"deptno not in ('10',NULL)" 等 价 于deptno!='10' and deptno!=NULL, 对 于EMP 表 中 的 任 意 一 行, 条 件 的 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。

---- (4)any,some

---- 条 件"sal > any(3000,null)" 等 价 于sal >3000 or sal >null。 类 似 前 述(3) 第 一 句, 最 终 结 果 返 回 所 有sal >3000 的 行。

---- (5)All

---- 条 件"sal> all(3000,null)" 等 价 于sal >3000 and sal >null, 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。

---- (6)(not)between

---- 条 件"sal between null and 3000" 等 价 于sal >=null and sal< =3000, 结 果 只 能 为NULL 或FALSE, 所 以 不 返 回 行。

---- 条 件"sal not between null and 3000" 等 价 于sal3000, 类 似 前 述(3) 的 第 一 句, 结 果 返 回sal>3000 的 行。

---- 下 表 为 比 较 操 作 符 和 空 值 的 小 结:

---- 比 较 操 作 符

---- 表 达 式( 例:A、B 是NULL、C=10)

---- 结 果

---- 3、 空 值 和 算 术、 字 符 操 作 符

---- (1) 算 术 操 作 符: 空 值 不 等 价 于0, 任 何 含 有 空 值 的 算 术 表 达 式 其 运 算 结 果 都 为 空 值, 例 如 空 值 加10 为 空 值。

---- (2) 字 符 操 作 符||: 因 为ORACLE 目 前 处 理 零 个 字 符 值 的 方 法 与 处 理 空 值 的 方 法 相 同( 日 后 的 版 本 中 不 一 定 仍 然 如 此), 所 以 对 于||, 空 值 等 价 于 零 个 字 符 值。 例:

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

---- 四、 空 值 和 函 数

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

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

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

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

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

---- 可 以 看 到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. 空 值 在 排 序 时 大 于 任 何 值。 例 如:

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

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

作者Blog:http://blog.csdn.net/chensheng913/

转载于:https://www.cnblogs.com/xiaotaoliang/archive/2005/02/05/102260.html

漫 谈oracle 中 的 空 值相关推荐

  1. oracle表里面空值要填满,漫 谈oracle 中 的 空 值(转)

    漫 谈oracle 中 的 空 值 河 北 省 统 计 局 贾 书 民 ---- 在 数 据 库 中, 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况. 在 一 个 表 中, ...

  2. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  3. Oracle中对空字符串的判断

    目录 1.在Oracle中,将长度为零的字符值视为NULL 2.在PL/SQL中判断空字符串 2.1 使用nvl函数空值处理 2.2 使用is not null改写 写在最前面:在Oracle 11g ...

  4. oracle里的to_nchar,浅谈Oracle中的CHAR与NCHAR数据类型 .

    CHAR与NCHAR在Oracle数据库是常用的类型,不过两种数据类型是互相不兼容的,这里大概简要谈一下这2种数据类型吧. 在Oracle中,CHAR类型是一种固定长度的字符串类型,最大长度是2000 ...

  5. 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)

    初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...

  6. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  7. oracle中 合并列值 将一列的多个值合并成一行

    大家平时在查询数据的时候,肯定会遇到需要将一列的多个值变成一行: 第一种情况:显示在同一行的同一列上 1.新建一个表test 可以参考:https://blog.csdn.net/heqiang525 ...

  8. oracle中分析函数range值范围,Oracle 分析函数

    --每一个值占总数的百分比 SELECT x, y, z,round(z/sum(z) over()*100,2)||'%' propn , sum(z) over() sum FROM t1; -- ...

  9. 浅谈oracle中for update 和 for update nowait 和 for update wait x的区别

    在执行update的时候,不加nowait/wait x的时候,当数据记录被锁住的时候,会一直处于等待状态,直到资源锁定被释放: 而加了nowait的时候,马上就会进行反馈"ORA-0005 ...

最新文章

  1. NLP语义标注模型数据准备及实战
  2. c语言二十四点游戏,C语言解24点游戏程序
  3. JAVA单态设计模式
  4. 翻译Raywenderlich 最新文章What’s New in Swift 4
  5. c/c++宏函数的定义与使用(宏定义函数)(macro definition)
  6. servlet里面为什么有时候覆_为什么新来的经理强烈推荐?前后端分离知识,学到了...
  7. java连接sqlserver非默认实例连接字符串设置
  8. java 16进制_JAVA 十六进制与字符串的转换
  9. 1553B 调试记录
  10. php设计一个盒子类代码_PHP白盒审计工具RIPS源码简析
  11. 【转】将HTML5封装成android应用APK 文件若干方法
  12. 通向Golang的捷径【21. Go 语言的实际应用】
  13. 如何破解Aspose.word带水印问题
  14. QQ登录提示:登录超时,请检查您的网络或者本机防火墙设置(错误码:0x00000001)
  15. 第一部分 利用opencv基于hsv颜色的目标提取效果和python代码
  16. Anaconda搭建TensorFlow2.x(win环境)
  17. HF-Net初探之一:简介与配置使用
  18. 怎么用python扒网页?新手入门爬虫第一篇!
  19. python定义函数需要保留字def_Python保留字简单释义
  20. python输入q结束程序_试图让一个Python程序以字母“q”退出,但是输入是一个整数?...

热门文章

  1. python项目开发实战网盘-python项目开发实战 第2版
  2. python numpy库安装-Python Numpy库安装与基本操作示例
  3. python散点图拟合曲线-使用python通过点拟合曲线
  4. python的用途-python“ with”语句的用途是什么?
  5. python3-Python3 zip() 函数
  6. python课程将主要介绍哪些内容-Python课程详细介绍
  7. python linux命令-Python之路【第三篇】:Linux常用命令
  8. python教程廖雪峰云-Python教程
  9. python编程入门p-Python是什么?简单了解pythonp-入门
  10. python的none是什么-python 中None,is和==的深入探讨