电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

漫 談oracle 中 的 空 值

瀏覽:16日期:2023-11-16 15:53:17
;在 數 據 庫 中, 空 值 用 來 表 示 實 際 值 未 知 或 無 意 義 的 情 況。 在 一 個 表 中, 如 果 一 行 中 的 某 列 沒 有 值, 那 么 就 稱 它 為 空 值(NULL)。 任 何 數 據 類 型 的 列, 只 要 沒 有 使 用 非 空(NOT NULL) 或 主 鍵(PRIMARY KEY) 完 整 性 限 制, 都 可 以 出 現 空 值。 在 實 際 應 用 中, 如 果 忽 略 空 值 的 存 在, 將 會 造 成 造 成 不 必 要 的 麻 煩。 ---- 例 如, 在 下 面 的 雇 員 表(EMP) 中, 雇 員 名(ENAME) 為KING 的 行, 因 為KING 為 最 高 官 員(PRESIDENT), 他 沒 有 主 管(MGR), 所 以 其MGR 為 空 值。 因 為 不 是 所 有 的 雇 員 都 有 手 續 費(COMM), 所 以 列COMM 允 許 有 空 值, 除300、500、1400、0 以 外 的 其 它 各 行COMM 均 為 空 值。 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---- -------- -------- --------- -------- ------ ---------7369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307566 JONES MANAGER 7839 02-APR-81 2975207654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307698 BLAKE MANAGER 7839 01-MAY-81 2850307782 CLARK MANAGER 7839 09-JUN-81 2450107788 SCOTT ANALYST 7566 09-DEC-82 3000207839 KING PRESIDENT 17-NOV-81 5000107844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 12-JAN-83 1100207900 JAMES CLERK 7698 03-DEC-81 950307902 FORD ANALYST 7566 03-DEC-81 3000207934 MILLER CLERK 7782 23-JAN-82 130010---- 本 文 將 以 上 述EMP 表 為 例, 具 體 討 論 一 下 空 值 在 日 常 應 用 中 所 具 有 的 一 些 特 性。 ---- 一、 空 值 的 生 成 及 特 點 ---- 1. 空 值 的 生 成 ---- 如 果 一 列 沒 有 非 空(NOT NULL) 完 整 性 限 制, 那 么 其 缺 省 的 值 為 空 值, 即 如 果 插 入 一 行 時 未 指 定 該 列 的 值, 則 其 值 為 空 值。 ---- 使 用SQL 語 句INSERT 插 入 行, 凡 未 涉 及 到 的 列, 其 值 為 空 值; 涉 及 到 的 列, 如 果 其 值 確 實 為 空 值, 插 入 時 可 以 用NULL 來 表 示( 對 于 字 符 型 的 列, 也 可 以 用'' 來 表 示)。 ---- 例: 插 入 一 行, 其EMPNO 為1、ENAME 為'JIA'、SAL 為10000、job 和comm 為 空 值。 SQL >insert into emp(empno,ename,job,sal,comm) values(1,'JIA',NULL,1000,NULL);SQL >select * from emp where empno=1;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO--------- ---------- --------- --------- --------- ---------1 JIA 1000---- 可 以 看 到 新 插 入 的 一 行, 除job 和comm 為 空 值 外,mgr、hiredate、deptno 三 列 由 于 插 入 時 未 涉 及, 也 為 空 值。 ---- 使 用SQL 語 句UPDATE 來 修 改 數 據, 空 值 可 用NULL 來 表 示( 對 于 字 符 型 的 列, 也 可 以 用'' 來 表 示)。 例: SQL >update emp set ename=NULL,sal=NULL where empno=1;---- 2. 空 值 的 特 點 ---- 空 值 具 有 以 下 特 點: ---- * 等 價 于 沒 有 任 何 值。 ---- * 與 0、 空 字 符 串 或 空 格 不 同。 ---- * 在where 條 件 中, Oracle 認 為 結 果 為NULL 的 條 件 為FALSE, 帶 有 這 樣 條 件 的select 語 句 不 返 回 行, 并 且 不 返 回 錯 誤 信 息。 但NULL 和FALSE 是 不 同 的。 ---- * 排 序 時 比 其 他 數 據 都 大。 ---- * 空 值 不 能 被 索 引。 ---- 二、 空 值 的 測 試 ---- 因 為 空 值 表 示 缺 少 數 據, 所 以 空 值 和 其 它 值 沒 有 可 比 性, 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 數 值 比 較, 當 然 也 包 括 空 值 本 身( 但 是 在decode 中 例 外, 兩 個 空 值 被 認 為 是 等 價)。 測 試 空 值 只 能 用 比 較 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 帶 有 其 它 比 較 操 作 符 的 條 件 表 達 式, 并 且 其 結 果 依 賴 于 空 值, 那 么 其 結 果 必 定 是NULL。 在where 條 件 中,Oracle 認 為 結 果 為NULL 的 條 件 為FALSE, 帶 有 這 樣 條 件 的select 語 句 不 返 回 行, 也 不 返 回 錯 誤 信 息。 ---- 例 如 查 詢EMP 表 中MGR 為NULL 的 行: SQL >select * from emp where mgr='' no rows selectedSQL >select * from emp where mgr=null; no rows selectedSQL >select * from emp where mgr is null;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- --------- --------- --------- ---------7839 KING PRESIDENT 17-NOV-81 500010---- 第1、2 句 寫 法 不 妥,WHERE 條 件 結 果 為NULL, 不 返 回 行。 第 三 句 正 確, 返 回MGR 為 空 值 的 行。 ---- 三、 空 值 和 操 作 符 ---- 1. 空 值 和 邏 輯 操 作 符 ---- 邏 輯 操 作 符 ---- 表 達 式 ---- 結 果 ANDNULL AND TRUENULLNULL AND FALSEFALSENULL AND NULLNULLORNULL OR TRUETRUENULL OR FALSENULLNULL OR NULLNULLNOTNOT NULLNULL---- 可 以 看 到, 在 真 值 表 中, 除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。 ---- 下 面 舉 例 說 明 空 值 和 邏 輯 操 作 符 的 用 法: SQL > select * from emp where not comm=null and comm!=0;no rows selectedSQL > select * from emp where not ( not comm=null and comm!=0 );EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- --------- --------- --------- ---------7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30---- 第 一 個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: 是 用 來 測 試 空 值 的 唯 一 操 作 符( 見' 空 值 的 測 試')。 (2)=、!=、>=、<=、>、<SQL >select ename,sal,comm from emp where sal >comm;ENAME SAL COMM---------- --------- ---------ALLEN 1600 300WARD 1250 500TURNER1500 0---- sal 或comm 為 空 值 的 行,sal>comm 比 較 結 果 為NULL, 所 以 凡 是sal 或comm 為 空 值 的 行 都 沒 有 返 回。 ---- (3)IN 和NOT IN 操 作 符 SQL >select ename,mgr from emp where mgr in (7902,NULL);ENAME MGR---------- ---------SMITH 7902---- 在 上 述 語 句 中, 條 件'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 的 行。 SQL >select deptno from emp where deptno not in ('10',NULL);no rows selected---- 在 上 述 語 句 中, 條 件'deptno not in ('10',NULL)' 等 價 于deptno!='10' and deptno!=NULL, 對 于EMP 表 中 的 任 意 一 行, 條 件 的 結 果 只 能 為NULL 或FALSE, 所 以 不 返 回 行。 ---- (4)any,some SQL >select ename,sal from emp where sal > any(3000,null);ENAME SAL---------- ---------KING 5000---- 條 件'sal > any(3000,null)' 等 價 于sal >3000 or sal >null。 類 似 前 述(3) 第 一 句, 最 終 結 果 返 回 所 有sal >3000 的 行。 ---- (5)All SQL >select ename,sal from emp where sal > all(3000,null);no rows selected---- 條 件'sal> all(3000,null)' 等 價 于sal >3000 and sal >null, 結 果 只 能 為NULL 或FALSE, 所 以 不 返 回 行。 ---- (6)(not)between SQL >select ename,sal from emp where sal between null and 3000;no rows selected---- 條 件'sal between null and 3000' 等 價 于sal >=null and sal< =3000, 結 果 只 能 為NULL 或FALSE, 所 以 不 返 回 行。 SQL >select ename,sal from emp where sal not between null and 3000;ENAME SAL---------- ---------KING 5000---- 條 件'sal not between null and 3000' 等 價 于sal3000, 類 似 前 述(3) 的 第 一 句, 結 果 返 回sal>3000 的 行。 ---- 下 表 為 比 較 操 作 符 和 空 值 的 小 結: ---- 比 較 操 作 符 ---- 表 達 式( 例:A、B 是NULL、C=10) ---- 結 果 IS NULL、IS NOT NULLA IS NULLTRUEA IS NOT NULLFALSEC IS NULLFALSEC IS NOT NULLTRUE=、!=、>=、< =、>、< A = NULLNULLA > NULLNULLC = NULLNULLC > NULLNULLIN (=ANY)A IN (10,NULL)NULLC IN (10,NULL)TRUEC IN (20,NULL)NULLNOT IN ( 等 價 于 !=ALL)A NOT IN (20,NULL)NULLC NOT IN (20,NULL)FALSEC NOT IN (10,NULL)NULLANY,SOMEA > ANY(5,NULL)NULLC > ANY(5,NULL)TRUEC > ANY(15,NULL)NULLALLA > ALL(5,NULL)NULLC > ALL(5,NULL)NULLC > ALL(15,NULL)FALSE(NOT)BETWEENA BETWEEN 5 AND NULLNULLC BETWEEN 5 AND NULLNULLC BETWEEN 15 AND NULLFALSEA NOT BETWEEN 5 AND NULLNULLC NOT BETWEEN 5 AND NULLNULLC NOT BETWEEN 15 AND NULLTRUE---- 3、 空 值 和 算 術、 字 符 操 作 符 ---- (1) 算 術 操 作 符: 空 值 不 等 價 于0, 任 何 含 有 空 值 的 算 術 表 達 式 其 運 算 結 果 都 為 空 值, 例 如 空 值 加10 為 空 值。 ---- (2) 字 符 操 作 符: 因 為ORACLE 目 前 處 理 零 個 字 符 值 的 方 法 與 處 理 空 值 的 方 法 相 同( 日 后 的 版 本 中 不 一 定 仍 然 如 此), 所 以 對 于, 空 值 等 價 于 零 個 字 符 值。 例: SQL >select ename,mgr,enamemgr,sal,comm,sal+comm from emp;ENAME MGR ENAMEMGRSAL COMM SAL+COMM---------- --------- ------------- --------- --------- ---------SMITH 7902 SMITH7902 800 ALLEN 7698 ALLEN76981600 300 1900WARD 7698 WARD7698 1250 500 1750JONES 7839 JONES78392975 MARTIN7698 MARTIN7698 1250 1400 2650BLAKE 7839 BLAKE78392850 CLARK 7839 CLARK78392450 SCOTT 7566 SCOTT75663000 KING KING 5000 TURNER7698 TURNER7698 1500 0 1500ADAMS 7788 ADAMS77881100 JAMES 7698 JAMES7698 950 FORD 7566 FORD7566 3000 MILLER7782 MILLER7782 1300 ---- 我 們 可 以 看 到, 凡mgr 為 空 值 的,enamemgr 結 果 等 于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 800WARD 1250 500 500MARTIN1250 1400 1400ADAMS 1100JAMES 950MILLER1300---- 2. 空 值 和 組 函 數 ---- 組 函 數 忽 略 空 值。 在 實 際 應 用 中, 根 據 需 要 可 利 用nvl 函 數 用 零 代 替 空 值。 例: SQL >select count(comm),sum(comm),avg(comm) from emp;COUNT(COMM) SUM(COMM) AVG(COMM)----------- --------- ---------4 2200 550SQL >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 2200157.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 empgroup 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 1087510875 30 9400 2200 780011600 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 0ALLEN 300WARD 500MARTIN1400BLAKE 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.
標簽: Oracle 數據庫
主站蜘蛛池模板: IP检测-检测您的IP质量| 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 中矗模型-深圳中矗模型设计有限公司 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 我车网|我关心的汽车资讯_汽车图片_汽车生活! | 细石混凝土泵_厂家_价格-烟台九达机械有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 交通气象站_能见度检测仪_路面状况监测站- 天合环境科技 | 安徽华耐泵阀有限公司-官方网站| 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 水性漆|墙面漆|木器家具漆|水漆涂料_晨阳水漆官网 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 影合社-影视人的内容合作平台| 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 宿舍管理系统_智慧园区系统_房屋/房产管理系统_公寓管理系统 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 |