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

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

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

    posts - 13,  comments - 8,  trackbacks - 0
    一.SQL語言簡(jiǎn)介1. SQL概述
    SQL是一種面向數(shù)據(jù)庫的通用數(shù)據(jù)處理語言規(guī)范,能完成以下幾類功能:提取查詢數(shù)據(jù),插入修改刪除數(shù)據(jù),生成修改和刪除數(shù)據(jù)庫對(duì)象,數(shù)據(jù)庫安全控制,數(shù)據(jù)庫完整性及數(shù)據(jù)保護(hù)控制。

    數(shù)據(jù)庫對(duì)象包括表、視圖、索引、同義詞、簇、觸發(fā)器、函數(shù)、過程、包、數(shù)據(jù)庫鏈、快照等(表空間、回滾段、角色、用戶)。數(shù)據(jù)庫通過對(duì)表的操作來管理存儲(chǔ)在其中的數(shù)據(jù)。
    2. 數(shù)據(jù)庫查詢
    1)    用SELECT語句從表中提取查詢數(shù)據(jù)。語法為

    SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC];

    說明:SELECT子句用于指定檢索數(shù)據(jù)庫的中哪些列,F(xiàn)ROM子句用于指定從哪一個(gè)表或視圖中檢索數(shù)據(jù)。

    2)    SELECT中的操作符及多表查詢WHERE子句。(LIKE,IS,…)

      WHERE子句中的條件可以是一個(gè)包含等號(hào)或不等號(hào)的條件表達(dá)式,也可以是一個(gè)含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比較運(yùn)算符的條件式,還可以是由單一的條件表達(dá)通過邏輯運(yùn)算符組合成復(fù)合條件。

    比較操作符 =  >  <  >=  <=  !=  <>

    SQL操作符 BETWEEN … AND…          IN   LIKE            IS NULL     

                  NOT BETWEEN … AND… NOT IN NOT LIKE   IS NOT NULL

    邏輯操作符 AND      OR  NOT

    3)    ORDER BY   子句

    ORDER BY 子句使得SQL在顯示查詢結(jié)果時(shí)將各返回行按順序排列,返回行的排列順序由ORDER BY 子句指定的表達(dá)式的值確定。

    4)    連接查詢

    利用SELECT語句進(jìn)行數(shù)據(jù)庫查詢時(shí),可以把多個(gè)表、視圖的數(shù)據(jù)結(jié)合起來,使得查詢結(jié)果的每一行中包含來自多個(gè)表達(dá)式或視圖的數(shù)據(jù),這種操作被稱為連接查詢。

    連接查詢的方法是在SELECT命令的FROM子句中指定兩個(gè)或多個(gè)將被連接查詢的表或視圖,并且在WHERE子句告訴ORACLE如何把多個(gè)表的數(shù)據(jù)進(jìn)行合并。根據(jù)WHERE子句中的條件表達(dá)式是等還是不等式,可以把連接查詢分為等式連接和不等式連接。

    5)    子查詢

    如果某一個(gè)SELECT命令(查詢1)出現(xiàn)在另一個(gè)SQL命令(查詢2)的一個(gè)子句中,則稱查詢1是查詢2的子查詢。

     
    3.     基本數(shù)據(jù)類型(NUMBER,VARCHAR2,DATE) 
     ORACEL支持下列內(nèi)部數(shù)據(jù)類型:

    l       VARCHAR2 變長(zhǎng)字符串,最長(zhǎng)為2000字符。

    l       NUMBER   數(shù)值型。

    l       LONG      變長(zhǎng)字符數(shù)據(jù),最長(zhǎng)為2G字節(jié)。

    l       DATE       日期型。

    l       RAW       二進(jìn)制數(shù)據(jù),最長(zhǎng)為255字節(jié)。

    l       LONG RAW  變長(zhǎng)二進(jìn)制數(shù)據(jù),最長(zhǎng)為2G字節(jié)。

    l       ROWID      二六進(jìn)制串,表示表的行的唯一地址。

    l       CHAR       定長(zhǎng)字符數(shù)據(jù),最長(zhǎng)為255。

     
    4.     常用函數(shù)用法:
         一個(gè)函數(shù)類似于一個(gè)算符,它操作數(shù)據(jù)項(xiàng),返回一個(gè)結(jié)果。函數(shù)在格式上不同于算符,它個(gè)具有變?cè)刹僮?個(gè)、一個(gè)、二個(gè)或多個(gè)變?cè)问綖椋?BR>
    函數(shù)名(變?cè)冊(cè)?BR>
    函數(shù)具有下列一般類形:

    l         單行函數(shù)

    l         分組函數(shù)

    1)單行函數(shù)對(duì)查詢的表或視圖的每一行返回一個(gè)結(jié)果行。它有數(shù)值函數(shù),字符函數(shù),日期函數(shù),轉(zhuǎn)換函數(shù)等。

    2)分組函數(shù)返回的結(jié)果是基于行組而不是單行,所以分組函數(shù)不同于單行函數(shù)。在許多分組函數(shù)中可有下列選項(xiàng):

    l         DISTRNCT 該選項(xiàng)使分組函數(shù)只考慮變?cè)磉_(dá)式中的不同值。

    l         ALL該選項(xiàng)使分組函數(shù)考慮全部值,包含全部重復(fù)。

    全部分組函數(shù)(除COUNT(*)外)忽略空值。如果具有分組函數(shù)的查詢,沒有返回行或只有空值(分組函數(shù)的變?cè)≈档男校瑒t分組函數(shù)返回空值。

    l       單行函數(shù)

    1)        數(shù)字函數(shù)

    ABS  取絕對(duì)值  POWER 乘方   LN   10為底數(shù)取冪

    SQRT 平方根     EXP       e的n次乘方  LOG(m,n)   m為底數(shù)n取冪        

    數(shù)學(xué)運(yùn)算函數(shù):ACOS ATAN ATAN2 COS COSH  SIGN SIN SINH TAN TANH

    CEIL   大于或等于取整數(shù)  

    FLOOR        小于或等于取整數(shù)

    MOD          取余數(shù)               

    ROUND(n,m)   按m的位數(shù)取四舍五入值如果round(日期): 中午12以后將是明天的日期. round(sysdate,'Y')是年的第一天

    TRUNC(n,m) 按m的位數(shù)取前面的數(shù)值如果trunc(日期), 確省的是去掉時(shí)間

     

    2)        字符函數(shù)

    CHR                   按數(shù)據(jù)庫的字符集由數(shù)字返回字符 

    CONCAT(c1,c2)              把兩個(gè)字符c1,c2組合成一個(gè)字符, 和 || 相同

    REPLACE(c,s,r)        把字符c里出現(xiàn)s的字符替換成r, 返回新字符

    SUBSTR(c,m,n)           m大于0,字符c從前面m處開始取n位字符,m等于0和1一樣,

                   m小與0,字符c從后面m處開始取n位字符

    TRANSLATE(c,f1,t1)       字符c按f1到t1的規(guī)則轉(zhuǎn)換成新的字符串

    INITCAP             字符首字母大寫,其它字符小寫

    LOWER                     字符全部小寫

    UPPER                 字符全部大寫

    LTRIM(c1,c2)              去掉字符c1左邊出現(xiàn)的字符c2

    RTRIM(c1,c2)

    TRIM(c1,c2)               去掉字符c1左右兩邊的字符c2

    LPAD(c1,n,c2)            字符c1按制定的位數(shù)n顯示不足的位數(shù)用c2字符串替換左邊的空位

    RPAD(c1,n,c2)

     

    3)        日期函數(shù)

    ADD_MONTHS(d,n)                日期值加n月

    LAST_DAY(d)                  返回當(dāng)月的最后一天的日期

    MONTHS_BETWEEN(d1,d2)               兩個(gè)日期值間的月份,d1<d2 返回負(fù)數(shù)

    NEXT_DAY(d)                 返回日期值下一天的日期

    SYSDATE                  當(dāng)前的系統(tǒng)時(shí)間

                          DUAL是SYS用戶下一個(gè)空表,它只有一個(gè)字段dummy

    4)        轉(zhuǎn)換函數(shù)(1)

    TO_CHAR(date,'日期顯示格式')         

    TO_CHAR(number)                 用于顯示或報(bào)表的格式對(duì)齊

    TO_DATE(char,'日期顯示格式')          

    TO_LOB                                 把long字段轉(zhuǎn)換成lob字段

    TO_NUMBER(char)                        用于計(jì)算或者比較大小

     

    5)        轉(zhuǎn)換函數(shù)(2)

    to_date里日期顯示格式

    YYYY          年   YEAR    YYY      YY  Y

    Q           季度     

    MM              月   MONTH       MON    

    W          星期 (week of month)       WW, IW (week of year)   

    (說明:周計(jì)是按ISO標(biāo)準(zhǔn),從1月1日的星期數(shù)到后面七天為一周,不一定是從周一到周日)

    DD         日   DAY             DY 

    HH24            小時(shí)      HH12            HH 

    MI         分鐘     

    SS          秒

    如果想固定日期的顯示格式可以在數(shù)據(jù)庫的參數(shù)文件initorasid.ora里新寫一行參數(shù) NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX環(huán)境變量或者NT的注冊(cè)表里的設(shè)置 NL2005-9-26_FORMAT=yyyy-mm-dd hh24:mi:ss

     

    6)        轉(zhuǎn)換函數(shù)(3)

    如果想固定日期的顯示格式可以用alter session命令改變

    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

    它的作用順序如下:

    initialization parameter

    Environment variable

    ALTER SESSION command

     

    7)        轉(zhuǎn)換函數(shù) (4)

    to_char(number)里數(shù)字顯示格式

    9     數(shù)字位

    0     數(shù)字前面補(bǔ)0                  to_char(-1200,'00000.00')

    .      小數(shù)點(diǎn)的位置   

    ,      標(biāo)記位置的逗號(hào)       用在數(shù)字顯示格式的左邊           

    L     根據(jù)數(shù)據(jù)庫字符集加貨幣符號(hào)    to_char(-1200,'L9999.99')       

    B     把數(shù)字0顯示為空格,用在數(shù)字顯示格式的右邊

           

    MI  右邊的負(fù)數(shù)標(biāo)記                       to_char(-1200,'9999.99MI')

    PR    括起來的負(fù)數(shù)                     to_char(-1200,'9999.99PR')

    EEEE     用指數(shù)方式表示                        to_char(-1200,'9999.99EEEE')

     

    8)        輸入字符,返回?cái)?shù)字的函數(shù)

    instr(c1,c2)     字符c2出現(xiàn)在c1的位置, 不出現(xiàn), 返回0, 常用于模糊查詢

    length(c)  按數(shù)據(jù)庫的字符集,算出字符c的長(zhǎng)度,跟數(shù)據(jù)庫的字符集有關(guān), 一個(gè)漢字長(zhǎng)度為1

     

    9)        有邏輯比較的函數(shù)NVL(EXPR1, EXPR2)函數(shù)

    解釋:      IF EXPR1=NULL      RETURN EXPR2

            ELSE    RETURN EXPR1

    10)    DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函數(shù)

    解釋: IF AA=V1 THEN RETURN R1

              IF AA=V2 THEN RETURN R2

            ..…

      ELSE

      RETURN NULL           

    舉例: decode(id,1,'dept sale',2,'dept tech')

    l        集合函數(shù)      經(jīng)常和group by一起使用

    1)      集合函數(shù)列表

    AVG             (DISTINCT | ALL | N)                     取平均值

    COUNT        (DISTINCT | ALL | N | expr | * )     統(tǒng)計(jì)數(shù)量

    MAX             (DISTINCT | ALL | N)                     取最大值

    MIN             (DISTINCT | ALL | N)                     取最小值

    SUM             (DISTINCT | ALL | N)                     取合計(jì)值

    STDDEV             (DISTINCT | ALL | N)                     取偏差值,如果組里選擇的內(nèi)容都相同,結(jié)果為0

    VARIANCE (DISTINCT | ALL | N)                        取平方偏差值

     

    2)      使用集合函數(shù)的語法

    SELECT column, group_function FROM table

    WHERE condition       GROUP BY group_by_expression

    HAVING group_condition  ORDER BY column;



    3)      使用count時(shí)的注意事項(xiàng)

    SELECT COUNT(*) FROM table;

    SELECT COUNT(常量) FROM table;

     

    都是統(tǒng)計(jì)表中記錄數(shù)量,如果沒有PK后者要好一些

    SELECT COUNT(all 字段名) FROM table;

    SELECT COUNT(字段名) FROM table;

     

    不會(huì)統(tǒng)計(jì)為NULL的字段的數(shù)量

    SUM,AVG時(shí)都會(huì)忽略為NULL的字段

     

    4)    用group by時(shí)的限制條件

    SELECT字段名不能隨意, 要包含在GROUP BY的字段里

     GROUP BY后ORDER BY時(shí)不能用位置符號(hào)和別名

     限制GROUP BY的顯示結(jié)果, 用HAVING條件

     

    5)      例子

    SQL> select title,sum(salary) payroll from s_emp

    where title like 'VP%'   group by title

    having sum(salary)>5000    order by sum(salary) desc;



    找出某表里字段重復(fù)的記錄數(shù), 并顯示

    SQL> select (duplicate field names) from table_name

         group by (list out fields) having count(*)>1;
    5. 數(shù)據(jù)操縱語言命令:
    數(shù)據(jù)庫操縱語言(DML)命令用于查詢和操縱模式對(duì)象中的數(shù)據(jù),它不隱式地提交當(dāng)前事務(wù)。它包含UPDATE、INSERT、DELETE、EXPLAIN PLAN、SELECT和LOCK TABLE 等命令。下面簡(jiǎn)單介紹一下:

    1)        UPDATE tablename SET {column1=expression1,column2=expression2,…} WHERE {conditions};

    例如:S     QL>UPDATE EMP

                SET JOB =’MANAGER’

                 WHERE ENAME=’MAPTIN’;

                  SQL >SELECT * FROM EMP;

    UPDATE子句指明了要修改的數(shù)據(jù)庫是EMP,并用WHERE子句限制了只對(duì)名字(ENAME)為’MARTIN’的職工的數(shù)據(jù)進(jìn)行修改,SET子句則說明修改的方式,即把’MARTION’的工作名稱(JOB)改為’MARAGER’.

     

    2)        INSERT INTO tablename {column1,column2,…} VALUES {expression1,expression2,…};

    例如:SQL>SELECT INTO DEPT(DNAME, DEPTNO)

                         VALUES (‘ACCOUNTING’,10)

     

    3)        DELETE FROM tablename WHERE {conditions};

    例如:SQL>DELETE FROM EMP

                         WHERE EMPNO = 7654;

    DELETE命令刪除一條記錄,而且DELETE命令只能刪除整行,而不能刪除某行中的部分?jǐn)?shù)據(jù).

     

     

    4)        事務(wù)控制命令

    提交命令(COMMIT):可以使數(shù)據(jù)庫的修改永久化.設(shè)置AUTOCOMMIT為允許狀態(tài):SQL >SET AUTOCOMMIT ON;

    回滾命令(ROLLBACK):消除上一個(gè)COMMIT命令后的所做的全部修改,使得數(shù)據(jù)庫的內(nèi)容恢復(fù)到上一個(gè)COMMIT執(zhí)行后的狀態(tài).使用方法是:

    SQL>ROLLBACK;

     
    二.Oracle擴(kuò)展PL/SQL簡(jiǎn)介1. PL/SQL概述。
    PL/SQL是Oracle對(duì)SQL規(guī)范的擴(kuò)展,是一種塊結(jié)構(gòu)語言,即構(gòu)成一個(gè)PL/SQL程序的基本單位(過程、函數(shù)和無名塊)是邏輯塊,可包含任何數(shù)目的嵌套了快。這種程序結(jié)構(gòu)支持逐步求精方法解決問題。一個(gè)塊(或子塊)將邏輯上相關(guān)的說明和語句組合在一起,其形式為:

    DECLARE

    ---說明

    BEGIN

    ---語句序列

    EXCEPTION

    ---例外處理程序

    END;

    它有以下優(yōu)點(diǎn):

    l        支持SQL;

    l        生產(chǎn)率高;

    l        性能好;

    l        可稱植性;

    l        與ORACLE集成.

     
    2. PL/SQL體系結(jié)構(gòu)
    PL/SQL運(yùn)行系統(tǒng)是種技術(shù),不是一種獨(dú)立產(chǎn)品,可認(rèn)為這種技術(shù)是PL/SQL塊和子程序的一種機(jī),它可接收任何有效的PL/SQL塊或子程序。如圖所示:

     

     


    PL/SQL塊

                  PL/SQL機(jī)

     

                         

    PL/SQL塊

    過程性語句

    執(zhí)行器

    SQL語句
     

     

     

     

     

     

     

     

     

     

     

    PL/SQL機(jī)可執(zhí)行過程性語句,而將SQL語句發(fā)送到ORACLE服務(wù)器上的SQL語句執(zhí)行器。在ORACLE預(yù)編譯程序或OCI程序中可嵌入無名的PL/SQL塊。如果ORACLE具有PROCEDURAL選件,有名的PL/SQL塊(子程序)可單獨(dú)編譯,永久地存儲(chǔ)在數(shù)據(jù)庫中,準(zhǔn)備執(zhí)行。

     

     
    3. PL/SQL基礎(chǔ):
    PL/SQL有一字符集、保留字、標(biāo)點(diǎn)、數(shù)據(jù)類型、嚴(yán)密語法等,它與SQL有相同表示,現(xiàn)重點(diǎn)介紹。

    1)        數(shù)據(jù)類型:如下表所示

     

     

    數(shù)據(jù)類型

    子類型

    純量類型

    數(shù)值

    BINARY_INTEGER

    NATURAL,POSITIVE

    NUMBER

    DEC,DECIMAL,DOUBLE PRECISION,PLOAT,INTEGER,INT,NUMERIC,REAL,SMALLINT

    字符

    CHAR

    CHARACTER,STRING

    VARCHAR2

    VARCHAR

    LONG

     

    LONG RAW

     

    RAW

     

    RAWID

     

    邏輯

    BOOLEAN

     

    日期

    DATE

     

    組合

    類型

    記錄

    RECORD

     



    TABLE

     

     

    2)        變量和常量

    在PL/SQL程序中可將值存儲(chǔ)在變量和常量中,當(dāng)程序執(zhí)行時(shí),變量的值可以改變,而常量的值不能改變。

     

    3)        程序塊式結(jié)構(gòu):

    DECLARE

            變量說明部分;

    BEGIN

            執(zhí)行語句部分;

    [EXCEPTION

            例外處理部分;]

    END;

     
    4. 控制語句:
    分支語句:

    IF condition THEN

            Sequence_of_statements;

    END IF;

     

    IF condition THEN

            Sequence_of_statement1;

    ELSE

            Sequence_of_statement2;

    END IF;

     

    IF condition1 THEN

            Sequence_of_statement1;

    ELSIF condition2 THEN

            Sequence_of_statement2;

    ELSIF condition3 THEN

            Sequence_of_statement3;

    END IF;

     

     
    5. 循環(huán)語句:
    LOOP

                  Sequence_of_statements;

                  IF condition THEN

                         EXIT;

                  END IF;

    END LOOP;

          WHILE condition LOOP

                  Sequence_of_statements;

    END LOOP;

     

    FOR counter IN lower_bound..higher_bound LOOP

                  Sequence_of_statements;

    END LOOP;

     
    6. 子程序:
    存儲(chǔ)過程:

                  CREATE PROCEDURE 過程名 (參數(shù)說明1,參數(shù)說明2, 。。。) IS

                         [局部說明]

                  BEGIN

                         執(zhí)行語句;

                  END 過程名;

     

    存儲(chǔ)函數(shù):

                  CREATE FUNCTION 函數(shù)名 (參數(shù)說明1,參數(shù)說明2, 。。。)

    RETURN 類型 IS

                         [局部說明]

                  BEGIN

                         執(zhí)行語句;

                         END 函數(shù)名;
    三.Decode()函數(shù)使用技巧1. 含義解釋:
      DECODE(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)

    該函數(shù)的含義如下:
    IF 條件=值1 THEN
        RETURN(翻譯值1)
    ELSIF 條件=值2 THEN
        RETURN(翻譯值2)
        ......
    ELSIF 條件=值n THEN
        RETURN(翻譯值n)

    ELSE
        RETURN(缺省值)
    END IF
    2. 使用方法:
    1)            比較大小
    select decode(sign(變量1-變量2),-1,變量1,變量2) from dual; --取較小值
    sign()函數(shù)根據(jù)某個(gè)值是0、正數(shù)還是負(fù)數(shù),分別返回0、1、-1

    例如:
    變量1=10,變量2=20
    則sign(變量1-變量2)返回-1,decode解碼結(jié)果為“變量1”,達(dá)到了取較小值的目的。

    表、視圖結(jié)構(gòu)轉(zhuǎn)化
    現(xiàn)有一個(gè)商品銷售表sale,表結(jié)構(gòu)為:
    month    char(6)      --月份
    sell    number(10,2)   --月銷售金額

    現(xiàn)有數(shù)據(jù)為:
    200001  1000
    200002  1100
    200003  1200
    200004  1300
    200005  1400
    200006  1500
    200007  1600
    200101  1100
    200202  1200
    200301  1300

    想要轉(zhuǎn)化為以下結(jié)構(gòu)的數(shù)據(jù):
    year   char(4)      --年份
    month1  number(10,2)   --1月銷售金額
    month2  number(10,2)   --2月銷售金額
    month3  number(10,2)   --3月銷售金額
    month4  number(10,2)   --4月銷售金額
    month5  number(10,2)   --5月銷售金額
    month6  number(10,2)   --6月銷售金額
    month7  number(10,2)   --7月銷售金額
    month8  number(10,2)   --8月銷售金額
    month9  number(10,2)   --9月銷售金額
    month10  number(10,2)   --10月銷售金額
    month11  number(10,2)   --11月銷售金額
    month12  number(10,2)   --12月銷售金額

    結(jié)構(gòu)轉(zhuǎn)化的SQL語句為:
    create or replace view
    v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
    as
        select
        substrb(month,1,4),
        sum(decode(substrb(month,5,2),'01',sell,0)),
        sum(decode(substrb(month,5,2),'02',sell,0)),
        sum(decode(substrb(month,5,2),'03',sell,0)),
        sum(decode(substrb(month,5,2),'04',sell,0)),
        sum(decode(substrb(month,5,2),'05',sell,0)),
        sum(decode(substrb(month,5,2),'06',sell,0)),
        sum(decode(substrb(month,5,2),'07',sell,0)),
        sum(decode(substrb(month,5,2),'08',sell,0)),
        sum(decode(substrb(month,5,2),'09',sell,0)),
        sum(decode(substrb(month,5,2),'10',sell,0)),
        sum(decode(substrb(month,5,2),'11',sell,0)),
        sum(decode(substrb(month,5,2),'12',sell,0))
        from sale
        group by substrb(month,1,4);
    四.NULL 使用詳解1. 含義解釋:
    問:什么是NULL?
    答:在我們不知道具體有什么數(shù)據(jù)的時(shí)候,也即未知,可以用NULL,我們稱它為空,ORACLE中,含有空值的表列長(zhǎng)度為零。
    ORACLE允許任何一種數(shù)據(jù)類型的字段為空,除了以下兩種情況:
    1、主鍵字段(primary key),
    2、定義時(shí)已經(jīng)加了NOT NULL限制條件的字段

    說明:
    1、等價(jià)于沒有任何值、是未知數(shù)。
    2、NULL與0、空字符串、空格都不同。
    3、對(duì)空值做加、減、乘、除等運(yùn)算操作,結(jié)果仍為空。
    4、NULL的處理使用NVL函數(shù)。
    5、比較時(shí)使用關(guān)鍵字用“is null”和“is not null”。
    6、空值不能被索引,所以查詢時(shí)有些符合條件的數(shù)據(jù)可能查不出來,count(*)中,用nvl(列名,0)處理后再查。
    7、排序時(shí)比其他數(shù)據(jù)都大(索引默認(rèn)是降序排列,小→大),所以NULL值總是排在最后。
    2. 使用方法:
    SQL> select 1 from dual where null=null;

     

    沒有查到記錄

     

    SQL> select 1 from dual where null='';

     

    沒有查到記錄

     

    SQL> select 1 from dual where ''='';

     

    沒有查到記錄

     

    SQL> select 1 from dual where null is null;

     

            1

    ---------

            1

     

    SQL> select 1 from dual where nvl(null,0)=nvl(null,0);

     

            1

    ---------

            1

     

    對(duì)空值做加、減、乘、除等運(yùn)算操作,結(jié)果仍為空。

    SQL> select 1+null from dual;

    SQL> select 1-null from dual;

    SQL> select 1*null from dual;

    SQL> select 1/null from dual;

     

     

    查詢到一個(gè)記錄.

     

    注:這個(gè)記錄就是SQL語句中的那個(gè)null

     

    設(shè)置某些列為空值

    update table1 set 列1=NULL where 列1 is not null;

     

     

    現(xiàn)有一個(gè)商品銷售表sale,表結(jié)構(gòu)為:

    month    char(6)      --月份

    sell    number(10,2)   --月銷售金額

     

    create table sale (month char(6),sell number);

    insert into sale values('200001',1000);

    insert into sale values('200002',1100);

    insert into sale values('200003',1200);

    insert into sale values('200004',1300);

    insert into sale values('200005',1400);

    insert into sale values('200006',1500);

    insert into sale values('200007',1600);

    insert into sale values('200101',1100);

    insert into sale values('200202',1200);

    insert into sale values('200301',1300);

    insert into sale values('200008',1000);

    insert into sale(month) values('200009');(注意:這條記錄的sell值為空)

    commit;

    共輸入12條記錄

     

    SQL> select * from sale where sell like '%';

     

    MONTH       SELL

    ------ ---------

    200001      1000

    200002      1100

    200003      1200

    200004      1300

    200005      1400

    200006      1500

    200007      1600

    200101      1100

    200202      1200

    200301      1300

    200008      1000

     

    查詢到11記錄.

     

    結(jié)果說明:

    查詢結(jié)果說明此SQL語句查詢不出列值為NULL的字段

    此時(shí)需對(duì)字段為NULL的情況另外處理。

    SQL> select * from sale where sell like '%' or sell is null;

    SQL> select * from sale where nvl(sell,0) like '%';

     

    MONTH       SELL

    ------ ---------

    200001      1000

    200002      1100

    200003      1200

    200004      1300

    200005      1400

    200006      1500

    200007      1600

    200101      1100

    200202      1200

    200301      1300

    200008      1000

    200009

     

    查詢到12記錄.

     

    Oracle的空值就是這么的用法,我們最好熟悉它的約定,以防查出的結(jié)果不正確。
    五.如何查找、刪除表中重復(fù)的記錄1. 問題提出:
    當(dāng)我們想要為一個(gè)表創(chuàng)建唯一索引時(shí),如果該表有重復(fù)的記錄,則無法創(chuàng)建成功。
    2. 方法原理:
    1)       Oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫中是唯一的,
      rowid確定了每條記錄是在ORACLE中的哪一個(gè)數(shù)據(jù)文件、塊、行上。

    2)       在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中
      那些具有最大rowid的就可以了,其余全部刪除。

    3)       以下語句用到了3項(xiàng)技巧:rowid、子查詢、別名。
    3. 實(shí)現(xiàn)方法:
    SQL> create table a (

      2  bm char(4),            --編碼

      3  mc varchar2(20)               --名稱

      4  )

      5  /

     

    表已建立.

     

    SQL> insert into a values('1111','1111');

    SQL> insert into a values('1112','1111');

    SQL> insert into a values('1113','1111');

    SQL> insert into a values('1114','1111');

     

    SQL> insert into a select * from a;

     

    插入4個(gè)記錄.

     

    SQL> commit;

     

    完全提交.

     

    SQL> select rowid,bm,mc from a;

     

    ROWID              BM   MC

    ------------------ ---- -------

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111

     

    查詢到8記錄.

     

     

    查出重復(fù)記錄

    SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

     

    ROWID              BM   MC

    ------------------ ---- --------------------

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

     

    刪除重復(fù)記錄

    SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

     

    刪除4個(gè)記錄.

     

    SQL> select rowid,bm,mc from a;

     

    ROWID              BM   MC

    ------------------ ---- --------------------

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111
    六.如何正確利用Rownum來限制查詢所返回的行數(shù)1. 含義解釋:
    1)       rownum是oracle系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是1,第二行是2,依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù)。

    2)       rownum不能以任何基表的名稱作為前綴。
    2. 使用方法:
    現(xiàn)有一個(gè)商品銷售表sale,表結(jié)構(gòu)為:

    month    char(6)      --月份

    sell    number(10,2)   --月銷售金額

     

    create table sale (month char(6),sell number);

    insert into sale values('200001',1000);

    insert into sale values('200002',1100);

    insert into sale values('200003',1200);

    insert into sale values('200004',1300);

    insert into sale values('200005',1400);

    insert into sale values('200006',1500);

    insert into sale values('200007',1600);

    insert into sale values('200101',1100);

    insert into sale values('200202',1200);

    insert into sale values('200301',1300);

    insert into sale values('200008',1000);

    commit;

     

    SQL> select rownum,month,sell from sale where rownum=1;(可以用在限制返回記錄條數(shù)的地方,保證不出錯(cuò),如:隱式游標(biāo))

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            1 200001      1000

     

    SQL> select rownum,month,sell from sale where rownum=2;(1以上都查不到記錄)

     

    沒有查到記錄

     

    SQL> select rownum,month,sell from sale where rownum>5;

    (由于rownum是一個(gè)總是從1開始的偽列,Oracle 認(rèn)為這種條件不成立,查不到記錄)

     

     

    沒有查到記錄

     

    只返回前3條紀(jì)錄

    SQL> select rownum,month,sell from sale where rownum<4;

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            1 200001      1000

            2 200002      1100

            3 200003      1200

     

     

    如何用rownum實(shí)現(xiàn)大于、小于邏輯?(返回rownum在4—10之間的數(shù)據(jù))(minus操作,速度會(huì)受影響)

    SQL> select rownum,month,sell from sale where rownum<10

      2  minus

      3  select rownum,month,sell from sale where rownum<5;

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            5 200005      1400

            6 200006      1500

            7 200007      1600

            8 200101      1100

            9 200202      1200

     

    想按日期排序,并且用rownum標(biāo)出正確序號(hào)(有小到大)

    SQL> select rownum,month,sell from sale order by month;

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            1 200001      1000

            2 200002      1100

            3 200003      1200

            4 200004      1300

            5 200005      1400

            6 200006      1500

            7 200007      1600

           11 200008      1000

            8 200101      1100

            9 200202      1200

           10 200301      1300

     

    查詢到11記錄.

     

    可以發(fā)現(xiàn),rownum并沒有實(shí)現(xiàn)我們的意圖,系統(tǒng)是按照記錄入庫時(shí)的順序給記錄排的號(hào),rowid也是順序分配的

     

    SQL> select rowid,rownum,month,sell from sale order by rowid;

     

    ROWID                 ROWNUM MONTH       SELL

    ------------------ --------- ------ ---------

    000000E4.0000.0002         1 200001      1000

    000000E4.0001.0002         2 200002      1100

    000000E4.0002.0002         3 200003      1200

    000000E4.0003.0002         4 200004      1300

    000000E4.0004.0002         5 200005      1400

    000000E4.0005.0002         6 200006      1500

    000000E4.0006.0002         7 200007      1600

    000000E4.0007.0002         8 200101      1100

    000000E4.0008.0002         9 200202      1200

    000000E4.0009.0002        10 200301      1300

    000000E4.000A.0002        11 200008      1000

     

    查詢到11記錄.

     

    正確用法,使用子查詢

    SQL> select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            1 200001      1000

            2 200002      1100

            3 200003      1200

            4 200004      1300

            5 200005      1400

            6 200006      1500

            7 200007      1600

            8 200008      1000

            9 200101      1100

           10 200202      1200

           11 200301      1300

     

    按銷售金額排序,并且用rownum標(biāo)出正確序號(hào)(有小到大)

    SQL> select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;

     

       ROWNUM MONTH       SELL

    --------- ------ ---------

            1 200001      1000

            2 200008      1000

            3 200002      1100

            4 200101      1100

            5 200003      1200

            6 200202      1200

            7 200004      1300

            8 200301      1300

            9 200005      1400

           10 200006      1500

           11 200007      1600

     

    查詢到11記錄.

     

    利用以上方法,如在打印報(bào)表時(shí),想在查出的數(shù)據(jù)中自動(dòng)加上行號(hào),就可以利用rownum。

     

    返回第5—9條紀(jì)錄,按月份排序

    SQL> select * from (select rownum row_id ,month,sell

      2  from (select month,sell from sale group by month,sell))

      3  where row_id between 5 and 9;

     

        ROW_ID MONTH        SELL

    ---------- ------ ----------

             5 200005       1400

             6 200006       1500

             7 200007       1600

             8 200008       1000

             9 200101       1100
    posted on 2005-10-30 17:30 YangRj 閱讀(406) 評(píng)論(0)  編輯  收藏 所屬分類: 精華文章
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(2)

    隨筆分類(5)

    隨筆檔案(13)

    文章分類(14)

    文章檔案(34)

    Apache - Tech Online

    BLOG 收集

    BLOG地址

    DB2

    Eclipse

    IBM - Tech Online

    JAVA

    ORACLE

    OS

    好網(wǎng)址

    文學(xué)網(wǎng)站

    累了 聽聽歌曲吧

    論壇

    積分與排名

    • 積分 - 25626
    • 排名 - 1515

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲韩国在线一卡二卡| 免费无码又爽又刺激高潮| 你懂的网址免费国产| www在线观看播放免费视频日本| 香蕉视频亚洲一级| 美美女高清毛片视频黄的一免费| 亚洲av成人一区二区三区观看在线| 亚洲色大成网站www永久男同| 亚洲欧美国产国产一区二区三区 | 国产午夜免费秋霞影院| 免费无码黄动漫在线观看| 日韩免费高清视频| 国产成人3p视频免费观看 | 免费a级毛片无码a∨免费软件| CAOPORN国产精品免费视频| 成人国产精品免费视频| a级毛片免费在线观看| 国产成人久久AV免费| 久久午夜伦鲁片免费无码| 日本免费xxxx色视频| 成人A级毛片免费观看AV网站| 女人张腿给男人桶视频免费版| 高清国语自产拍免费视频国产| 国产免费69成人精品视频| 久久精品国产亚洲5555| 亚洲AV综合色一区二区三区| 亚洲神级电影国语版| 亚洲精品日韩一区二区小说| 色妞www精品视频免费看| 两性色午夜视频免费网| 免费A级毛片无码视频| 在线观看的免费网站| 四虎影永久在线高清免费| 久久精品亚洲男人的天堂| 夜夜亚洲天天久久| 亚洲人片在线观看天堂无码| 成人精品综合免费视频| 国产精品白浆在线观看免费| 最近最新MV在线观看免费高清| 国产成人精品男人免费| 亚洲av无码国产精品色午夜字幕|