av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

漫 談oracle 中 的 空 值

瀏覽:2日期:2023-11-16 15:53:17
;在 數(shù) 據(jù) 庫 中, 空 值 用 來 表 示 實(shí) 際 值 未 知 或 無 意 義 的 情 況。 在 一 個(gè) 表 中, 如 果 一 行 中 的 某 列 沒 有 值, 那 么 就 稱 它 為 空 值(NULL)。 任 何 數(shù) 據(jù) 類 型 的 列, 只 要 沒 有 使 用 非 空(NOT NULL) 或 主 鍵(PRIMARY KEY) 完 整 性 限 制, 都 可 以 出 現(xiàn) 空 值。 在 實(shí) 際 應(yīng) 用 中, 如 果 忽 略 空 值 的 存 在, 將 會(huì) 造 成 造 成 不 必 要 的 麻 煩。 ---- 例 如, 在 下 面 的 雇 員 表(EMP) 中, 雇 員 名(ENAME) 為KING 的 行, 因 為KING 為 最 高 官 員(PRESIDENT), 他 沒 有 主 管(MGR), 所 以 其MGR 為 空 值。 因 為 不 是 所 有 的 雇 員 都 有 手 續(xù) 費(fèi)(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 表 為 例, 具 體 討 論 一 下 空 值 在 日 常 應(yīng) 用 中 所 具 有 的 一 些 特 性。 ---- 一、 空 值 的 生 成 及 特 點(diǎn) ---- 1. 空 值 的 生 成 ---- 如 果 一 列 沒 有 非 空(NOT NULL) 完 整 性 限 制, 那 么 其 缺 省 的 值 為 空 值, 即 如 果 插 入 一 行 時(shí) 未 指 定 該 列 的 值, 則 其 值 為 空 值。 ---- 使 用SQL 語 句INSERT 插 入 行, 凡 未 涉 及 到 的 列, 其 值 為 空 值; 涉 及 到 的 列, 如 果 其 值 確 實(shí) 為 空 值, 插 入 時(shí) 可 以 用NULL 來 表 示( 對(duì) 于 字 符 型 的 列, 也 可 以 用'' 來 表 示)。 ---- 例: 插 入 一 行, 其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 三 列 由 于 插 入 時(shí) 未 涉 及, 也 為 空 值。 ---- 使 用SQL 語 句UPDATE 來 修 改 數(shù) 據(jù), 空 值 可 用NULL 來 表 示( 對(duì) 于 字 符 型 的 列, 也 可 以 用'' 來 表 示)。 例: SQL >update emp set ename=NULL,sal=NULL where empno=1;---- 2. 空 值 的 特 點(diǎn) ---- 空 值 具 有 以 下 特 點(diǎn): ---- * 等 價(jià) 于 沒 有 任 何 值。 ---- * 與 0、 空 字 符 串 或 空 格 不 同。 ---- * 在where 條 件 中, Oracle 認(rèn) 為 結(jié) 果 為NULL 的 條 件 為FALSE, 帶 有 這 樣 條 件 的select 語 句 不 返 回 行, 并 且 不 返 回 錯(cuò) 誤 信 息。 但NULL 和FALSE 是 不 同 的。 ---- * 排 序 時(shí) 比 其 他 數(shù) 據(jù) 都 大。 ---- * 空 值 不 能 被 索 引。 ---- 二、 空 值 的 測(cè) 試 ---- 因 為 空 值 表 示 缺 少 數(shù) 據(jù), 所 以 空 值 和 其 它 值 沒 有 可 比 性, 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 數(shù) 值 比 較, 當(dāng) 然 也 包 括 空 值 本 身( 但 是 在decode 中 例 外, 兩 個(gè) 空 值 被 認(rèn) 為 是 等 價(jià))。 測(cè) 試 空 值 只 能 用 比 較 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 帶 有 其 它 比 較 操 作 符 的 條 件 表 達(dá) 式, 并 且 其 結(jié) 果 依 賴 于 空 值, 那 么 其 結(jié) 果 必 定 是NULL。 在where 條 件 中,Oracle 認(rèn) 為 結(jié) 果 為NULL 的 條 件 為FALSE, 帶 有 這 樣 條 件 的select 語 句 不 返 回 行, 也 不 返 回 錯(cuò) 誤 信 息。 ---- 例 如 查 詢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 條 件 結(jié) 果 為NULL, 不 返 回 行。 第 三 句 正 確, 返 回MGR 為 空 值 的 行。 ---- 三、 空 值 和 操 作 符 ---- 1. 空 值 和 邏 輯 操 作 符 ---- 邏 輯 操 作 符 ---- 表 達(dá) 式 ---- 結(jié) 果 ANDNULL AND TRUENULLNULL AND FALSEFALSENULL AND NULLNULLORNULL OR TRUETRUENULL OR FALSENULLNULL OR NULLNULLNOTNOT NULLNULL---- 可 以 看 到, 在 真 值 表 中, 除NULL AND FALSE 結(jié) 果 為FALSE、NULL OR TRUE 結(jié) 果 為TRUE 以 外, 其 它 結(jié) 果 均 為NULL。 ---- 雖 然 在where 條 件 中,Oracle 認(rèn) 為 結(jié) 果 為NULL 的WHERE 條 件 為FALSE, 但 在 條 件 表 達(dá) 式 中NULL 不 同 于FALSE。 例 如 在NOT ( NULL AND FALSE ) 和NOT ( NULL AND NULL ) 二 者 中 僅 有 一 處FALSE 和TRUE 的 區(qū) 別, 但NOT ( NULL AND FALSE ) 的 結(jié) 果 為 TRUE, 而NOT ( NULL AND NULL ) 的 結(jié) 果 為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---- 第 一 個(gè)Select 語 句, 條 件'not comm=null and comm!=0' 等 價(jià) 于NULL AND COMM!=0。 對(duì) 于 任 意 一 行, 如 果COMM 為 不 等 于0 的 數(shù) 值, 條 件 等 價(jià) 于NULL AND TRUE, 結(jié) 果 為NULL; 如 果COMM 等 于0, 條 件 等 價(jià) 于NULL AND FALSE, 結(jié) 果 為FALSE。 所 以, 最 終 結(jié) 果 不 返 回 行。 ---- 第 二 個(gè)Select 語 句 的 條 件 為 第 一 個(gè)Select 語 句 條 件 的' 非'(NOT), 對(duì) 于 任 意 一 行, 如 果COMM 為 不 等 于0 的 數(shù) 值, 條 件 等 價(jià) 于NOT NULL, 結(jié) 果 為NULL; 如 果COMM 等 于0, 條 件 等 價(jià) 于NOT FALSE, 結(jié) 果 為TRUE。 所 以, 最 終 結(jié) 果 返 回 行COMM 等 于0 的 行。 ---- 2. 空 值 和 比 較 操 作 符 ---- (1)IS [NOT] NULL: 是 用 來 測(cè) 試 空 值 的 唯 一 操 作 符( 見' 空 值 的 測(cè) 試')。 (2)=、!=、>=、<=、>、<SQL >select ename,sal,comm from emp where sal >comm;ENAME SAL COMM---------- --------- ---------ALLEN 1600 300WARD 1250 500TURNER1500 0---- sal 或comm 為 空 值 的 行,sal>comm 比 較 結(jié) 果 為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)' 等 價(jià) 于mgr=7902 or mgr=NULL。 對(duì) 于 表EMP 中 的 任 意 一 行, 如 果mgr 為NULL, 則 上 述 條 件 等 價(jià) 于NULL OR NULL, 即 為NULL; 如 果mgr 為 不 等 于7902 的 數(shù) 值, 則 上 述 條 件 等 價(jià) 于FALSE OR NULL, 即 為NULL; 如 果mgr 等 于7902, 則 上 述 條 件 等 價(jià) 于TRUE OR NULL, 即 為TRUE。 所 以, 最 終 結(jié) 果 能 返 回mgr 等 于7902 的 行。 SQL >select deptno from emp where deptno not in ('10',NULL);no rows selected---- 在 上 述 語 句 中, 條 件'deptno not in ('10',NULL)' 等 價(jià) 于deptno!='10' and deptno!=NULL, 對(duì) 于EMP 表 中 的 任 意 一 行, 條 件 的 結(jié) 果 只 能 為NULL 或FALSE, 所 以 不 返 回 行。 ---- (4)any,some SQL >select ename,sal from emp where sal > any(3000,null);ENAME SAL---------- ---------KING 5000---- 條 件'sal > any(3000,null)' 等 價(jià) 于sal >3000 or sal >null。 類 似 前 述(3) 第 一 句, 最 終 結(jié) 果 返 回 所 有sal >3000 的 行。 ---- (5)All SQL >select ename,sal from emp where sal > all(3000,null);no rows selected---- 條 件'sal> all(3000,null)' 等 價(jià) 于sal >3000 and sal >null, 結(jié) 果 只 能 為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' 等 價(jià) 于sal >=null and sal< =3000, 結(jié) 果 只 能 為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' 等 價(jià) 于sal3000, 類 似 前 述(3) 的 第 一 句, 結(jié) 果 返 回sal>3000 的 行。 ---- 下 表 為 比 較 操 作 符 和 空 值 的 小 結(jié): ---- 比 較 操 作 符 ---- 表 達(dá) 式( 例:A、B 是NULL、C=10) ---- 結(jié) 果 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 ( 等 價(jià) 于 !=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、 空 值 和 算 術(shù)、 字 符 操 作 符 ---- (1) 算 術(shù) 操 作 符: 空 值 不 等 價(jià) 于0, 任 何 含 有 空 值 的 算 術(shù) 表 達(dá) 式 其 運(yùn) 算 結(jié) 果 都 為 空 值, 例 如 空 值 加10 為 空 值。 ---- (2) 字 符 操 作 符: 因 為ORACLE 目 前 處 理 零 個(gè) 字 符 值 的 方 法 與 處 理 空 值 的 方 法 相 同( 日 后 的 版 本 中 不 一 定 仍 然 如 此), 所 以 對(duì) 于, 空 值 等 價(jià) 于 零 個(gè) 字 符 值。 例: 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 結(jié) 果 等 于ename; 凡 是comm 為 空 值 的 行,sal+comm 均 為 空 值。 ---- 四、 空 值 和 函 數(shù) ---- 1 . 空 值 和 度 量 函 數(shù) ---- 對(duì) 于 度 量 函 數(shù), 如 果 給 定 的 參 數(shù) 為 空 值, 則 其(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. 空 值 和 組 函 數(shù) ---- 組 函 數(shù) 忽 略 空 值。 在 實(shí) 際 應(yīng) 用 中, 根 據(jù) 需 要 可 利 用nvl 函 數(shù) 用 零 代 替 空 值。 例: 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---- 第 一 個(gè)SELECT 語 句 忽 略COMM 為 空 值 的 行, 第 二 個(gè)SELECT 語 句 使 用NVL 函 數(shù) 統(tǒng) 計(jì) 了 所 有 的COMM, 所 以 它 們 統(tǒng) 計(jì) 的 個(gè) 數(shù)、 平 均 值 都 不 相 同。 另 外 需 要 注 意 的 是, 在 利 用 組 函 數(shù) 進(jìn) 行 數(shù) 據(jù) 處 理 時(shí), 不 同 的 寫 法 具 有 不 同 的 不 同 含 義, 在 實(shí) 際 應(yīng) 用 中 應(yīng) 靈 活 掌 握。 例 如: 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)) 的 區(qū) 別:SUM(SAL+COMM) 為 先 加 然 后 計(jì) 算 各 行 的 和, 如 果SAL、COMM 中 有 一 個(gè) 為NULL, 則 該 行 忽 略 不 計(jì);SUM(SAL)+SUM(COMM) 為 先 計(jì) 算 各 行 的 合 計(jì) 然 后 再 加,SAL、COMM 中 的NULL 都 忽 略 不 計(jì), 但 如 果 SUM(SAL)、SUM(COMM) 二 者 的 結(jié) 果 之 中 有 一 個(gè) 為NULL, 則 二 者 之 和 為NULL; 在SUM(NVL(SAL,0)+NVL(COMM,0)) 里,SAL、COMM 中 的NULL 按0 處 理。 ---- 五、 空 值 的 其 它 特 性 ---- 1. 空 值 在 排 序 時(shí) 大 于 任 何 值。 例 如: SQL > select ename,comm from emp where deptno='30' order by comm;ENAME COMM---------- ---------TURNER 0ALLEN 300WARD 500MARTIN1400BLAKE JAMES---- 2. 空 值 不 能 被 索 引。 雖 然 在 某 列 上 建 立 了 索 引, 但 是 對(duì) 該 列 的 空 值 查 詢 來 說, 因 為 空 值 沒 有 被 索 引, 所 以 不 能 改 善 查 詢 的 效 率。 例 如 下 面 的 查 詢 不 能 利 用 在MGR 列 上 創(chuàng) 建 的 索 引。 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.
標(biāo)簽: Oracle 數(shù)據(jù)庫
主站蜘蛛池模板: 色偷偷人人澡人人爽人人模 | av av在线 | 国产精品国产精品国产专区不蜜 | 亚洲精品日日夜夜 | 亚洲国产成人精品久久 | 99国产视频 | 91精品久久久久久久久中文字幕 | 老妇激情毛片免费 | 99久久99| 亚洲国产成人精品久久 | 日韩a视频 | 日韩欧美国产成人一区二区 | 亚洲国产91| 二区在线观看 | 亚洲视频中文字幕 | 日本人爽p大片免费看 | 亚洲一区免费在线 | 蜜臀久久99精品久久久久久宅男 | 亚洲免费人成在线视频观看 | 国产精品美女久久久 | 日韩欧美在线一区 | av av在线| av网站在线看 | av影音资源| 91在线精品视频 | 日本在线中文 | 美女在线一区二区 | 中文字幕一区二区三区在线观看 | 9999精品视频 | 亚洲视频一区在线观看 | av在线播放网址 | 人成在线视频 | 国产精品久久av | 在线观看中文字幕 | 九九热视频这里只有精品 | 黄网站免费在线看 | 亚洲国产片 | 国产亚洲精品91 | 午夜精品久久久久久不卡欧美一级 | 五月婷婷 六月丁香 | 日韩电影一区 |