<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Oracle中的NULL(八)

    Posted on 2009-06-29 10:59 林光炎 閱讀(1716) 評論(0)  編輯  收藏 所屬分類: ORACLE

    最近在論壇上經常看到,很多人提出和NULL有關的問題。NULL其實是數據庫中特有的類型,Oracle中很多容易出現的錯誤都是和NULL有關的。

    打算簡單的總結一下NULL的相關知識。

    這一篇描述一下在SQL和PLSQL中一些處理NULL的一些問題。

    Oracle中的NULL(一):http://yangtingkun.itpub.net/post/468/244434

    Oracle中的NULL(二):http://yangtingkun.itpub.net/post/468/245107

    Oracle中的NULL(三):http://yangtingkun.itpub.net/post/468/245259

    Oracle中的NULL(四):http://yangtingkun.itpub.net/post/468/245697

    Oracle中的NULL(五):http://yangtingkun.itpub.net/post/468/247492

    Oracle中的NULL(六):http://yangtingkun.itpub.net/post/468/251496

    Oracle中的NULL(七):http://yangtingkun.itpub.net/post/468/258467


    8\![ Q!x;]$Yf0

    NULL的最大的特點就是兩個NULL是不相等的。如果用等號來判斷兩個NULL是否相等得到的結果一定是NULL。從唯一約束的特點也可以看到,對于建立了唯一約束的列,Oracle允許插入多個NULL值,這時因為Oracle不認為這些NULL是相等的。

    SQL> CREATE TABLE T (ID NUMBER, CONSTRAINT UN_T UNIQUE(ID));

    表已創建。

    SQL> INSERT INTO T VALUES (1);

    已創建 1 行。

    SQL> INSERT INTO T VALUES (1);
    | Pw6I)A#P,x_0INSERT INTO T VALUES (1)
    +h:w|3~ N0*
    LCB-P#b{$C0ERROR 位于第 1 行:
    f9i vJ Y%T0ORA-00001: 違反唯一約束條件 (YANGTK.UN_T)


    &rSq _0P7QvYN0SQL> INSERT INTO T VALUES (NULL);

    已創建 1 行。

    SQL> INSERT INTO T VALUES (NULL);

    已創建 1 行。

    但是有的時候,Oracle會認為NULL是相同的,比如在GROUP BY和DISTINCT操作中。這個時候,Oracle會認為所有的NULL都是一類的。

    還有一種情況,就是在DECODE函數中。如果表達式為DECODE(COL, NULL, 0, 1),那么如果COL的值為NULL,Oracle會認為這種情況與第二個參數的NULL值相匹配,會返回0。不過這里只是給人感覺NULL值是相等的,Oracle在實現DECODE函數的時候,仍然是通過IS NULL的方式進行的判斷。

    對于大多數的常用函數來說,如果輸入為NULL,則輸出也是NULL。NVL、NVL2、DECODE和||操作是個例外。他們在輸入參數為NULL的時候,結果可能不是NULL。不過歸結其原因是因為,這些函數都有多個參數,當多個參數不全為NULL時,結果可能不是NULL,如果輸入參數均為NULL,那么得到的輸出結果也是NULL。

    NULL還有一個特點,就是一般聚集函數不會處理NULL值。不管是MAX、MIN、AVG還是SUM,這些聚集函數都不會處理NULL。注意這里說的不會處理NULL,是指聚集函數會直接忽略NULL值記錄的存在。除非是聚集函數處理的列中包含的全部記錄都是NULL,這種情況下,上面這些聚集函數會返回NULL值。

    SQL> DELETE T WHERE ID = 1;

    已刪除 1 行。

    SQL> SELECT NVL(TO_CHAR(ID), 'NULL') FROM T;

    NVL(TO_CHAR(ID),'NULL')ITPUB個人空間 Z,I Pa;o~)t/Tm7L
    ----------------------------------------
    L B d-f-A/o*c0NULLITPUB個人空間(C"}5Q5A#L#t
    NULL

    SQL> SELECT MAX(ID) FROM T;

    MAX(ID)
    !C Cs"Ys5|'`0----------


    G_S.c d5mk)O#c0SQL> SELECT AVG(ID) FROM T;

    AVG(ID)ITPUB個人空間*O.Ylk0OU(Oy4Dq$vQr
    ----------


    RFf+Lf{] y0SQL> INSERT INTO T VALUES (1);

    已創建 1 行。

    聚集函數中比較特殊的是COUNT,第一個特殊點是COUNT不會返回NULL值,即使表中沒有記錄,或者COUNT(COL)中,COL列的記錄全為NULL,COUNT也會返回0值而不是NULL。第二個特殊點就是COUNT(*)或COUNT(常量)的形式。這種形式使得COUNT可以計算包含NULL記錄在內的記錄總數。

    SQL> SELECT COUNT(*), COUNT(1), COUNT('A'), COUNT(ID), COUNT(NULL) FROM T;

    COUNT(*) COUNT(1) COUNT('A') COUNT(ID) COUNT(NULL)ITPUB個人空間-NNOH2z
    ---------- ---------- ---------- ---------- -----------
    ;s t:O8t3o.y0t0 3 3 3 1 0

    最后簡單說一下AVG,AVG(COL)等價于SUM(COL)/COUNT(COL),不等價于SUM(COL)/COUNT(*):

    SQL> SELECT AVG(ID), SUM(ID)/COUNT(ID), SUM(ID)/COUNT(*) FROM T;

    AVG(ID) SUM(ID)/COUNT(ID) SUM(ID)/COUNT(*)
    6~{9O*mL9C7c)p0---------- ----------------- ----------------
    6@:[S'L&k\&V9{VR0 1 1 .333333333


    posts - 104, comments - 33, trackbacks - 0, articles - 0

    Copyright © 林光炎

    主站蜘蛛池模板: 亚洲产国偷V产偷V自拍色戒| 最新国产成人亚洲精品影院| 久久www免费人成看片| 亚洲情A成黄在线观看动漫软件| 四虎影在线永久免费观看| 中文字幕免费人成乱码中国| 亚洲婷婷在线视频| 免费人成无码大片在线观看| 最新仑乱免费视频| 一本到卡二卡三卡免费高| 精品日韩亚洲AV无码一区二区三区| 99精品全国免费观看视频| 亚洲精品黄色视频在线观看免费资源 | 亚洲国产午夜精品理论片在线播放| 夜色阁亚洲一区二区三区| 中文无码亚洲精品字幕| 久久久久亚洲AV无码专区桃色| 国产精品免费视频观看拍拍| 国产精品亚洲片在线va| 亚洲AV无码国产精品麻豆天美| 全免费一级午夜毛片| 免费视频成人片在线观看| 亚洲视频在线不卡| 亚洲高清无码在线观看| 无码国产精品一区二区免费| 国产精品福利片免费看| 亚洲AV日韩AV一区二区三曲| 亚洲午夜在线电影| 亚洲色图综合在线| 永久免费观看的毛片的网站| 蜜臀AV免费一区二区三区| 久久www免费人成看国产片| 亚洲欧美综合精品成人导航| 亚洲综合无码一区二区| 91麻豆精品国产自产在线观看亚洲| 国产福利在线观看免费第一福利| 美女被免费网站91色| 国产成人 亚洲欧洲| 激情综合色五月丁香六月亚洲| 97在线观看永久免费视频| 亚洲成人免费在线|