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

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

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

    Vincent.Chan‘s Blog

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    網(wǎng)站

    最新評(píng)論

    高級(jí) SQL(轉(zhuǎn)載:約束+觸發(fā)器)

    用約束和觸發(fā)器實(shí)施商業(yè)規(guī)則

    在商界,我們的確通常需要確保始終實(shí)施某些規(guī)則。例如,參與項(xiàng)目的雇員必須被雇用?;蛘呦胍承┦录杏?jì)劃地發(fā)生。例如,如果銷(xiāo)售員售出一批商品,則應(yīng)增加其傭金。

    DB2 通用數(shù)據(jù)庫(kù)為此提供了一套有用的方法。 唯一約束是禁止在表的一列或多列中出現(xiàn)重復(fù)值的規(guī)則。 參考完整性約束確保在整個(gè)指定的表中數(shù)據(jù)一致性。 表檢查約束是一些條件,它們定義為表定義的一部分,限制一列或多列中使用的值。觸發(fā)器允許您定義一組操作,這些操作通過(guò)對(duì)指定的表進(jìn)行刪除、插入或更新操作來(lái)執(zhí)行或觸發(fā)。觸發(fā)器可用于寫(xiě)入其他表、修改輸入值以及發(fā)布警報(bào)信息。

    第一節(jié)提供關(guān)鍵字的概念性概述。接著,通過(guò)示例和圖表進(jìn)一步探討參考完整性、約束以及觸發(fā)器。

    關(guān)鍵字

    關(guān)鍵字是可用來(lái)標(biāo)識(shí)或存取特定行的一組列。

    由不止一列組成的關(guān)鍵字稱(chēng)為組合關(guān)鍵字。在具有組合關(guān)鍵字的表中,組合關(guān)鍵字中各列的排序不受這些列在表中排序的約束。

    唯一關(guān)鍵字

    唯一關(guān)鍵字被定義為它的任何值都不相同。唯一關(guān)鍵字的列不能包含空值。在執(zhí)行 INSERT 和 UPDATE 語(yǔ)句期間,數(shù)據(jù)庫(kù)管理程序強(qiáng)制執(zhí)行該約束。一個(gè)表可以有多個(gè)唯一關(guān)鍵字。唯一關(guān)鍵字是可選的,并且可在 CREATE TABLE 或 ALTER TABLE 語(yǔ)句中定義。

    主關(guān)鍵字

    主關(guān)鍵字是一種唯一關(guān)鍵字,表定義的一部分。一個(gè)表不能有多個(gè)主關(guān)鍵字,并且主關(guān)鍵字的列不能包含空值。主關(guān)鍵字是可選的,并且可在 CREATE TABLE 或 ALTER TABLE 語(yǔ)句中定義。

    外部關(guān)鍵字

    外部關(guān)鍵字在參考約束的定義中指定。一個(gè)表可以有零個(gè)或多個(gè)外部關(guān)鍵字。如果組合外部關(guān)鍵字的值的任何部分為空,則該值為空。外部關(guān)鍵字是可選的,并且可在 CREATE TABLE 語(yǔ)句或 ALTER TABLE 語(yǔ)句中定義。

    唯一約束

    唯一約束確保關(guān)鍵字的值在表中是唯一的。唯一約束是可選的,并且可以通過(guò)使用指定 PRIMARY KEY 或 UNIQUE 子句的 CREATE TABLE 或 ALTER TABLE 語(yǔ)句來(lái)定義唯一約束。例如,可在一個(gè)表的雇員編號(hào)列上定義一個(gè)唯一約束,以確保每個(gè)雇員有唯一的編號(hào)。

    參考完整性約束

    通過(guò)定義唯一約束和外部關(guān)鍵字,可以定義表與表之間的關(guān)系,從而實(shí)施某些商業(yè)規(guī)則。唯一關(guān)鍵和外部關(guān)鍵字約束的組合通常稱(chēng)為參考完整性約束。外部關(guān)鍵字所引用的唯一約束稱(chēng)為父關(guān)鍵字。 外部關(guān)鍵字表示特定的父關(guān)鍵字,或與特定的父關(guān)鍵字相關(guān)。例如,某規(guī)則可能規(guī)定每個(gè)雇員(EMPLOYEE 表)必須屬于某現(xiàn)存的部門(mén)(DEPARTMENT 表)。因此,將 EMPLOYEE 表中的“部門(mén)號(hào)”定義為外部關(guān)鍵字,而將 DEPARTMENT 表中的“部門(mén)號(hào)”定義為主關(guān)鍵字。下列圖表提供參考完整性約束的直觀說(shuō)明。

    圖 4. 外部約束和主約束定義關(guān)系并保護(hù)數(shù)據(jù)

    表檢查約束

    表檢查約束指定對(duì)于表的每行都要進(jìn)行判定的條件??蓪?duì)個(gè)別列指定檢查約束。可使用 CREATE 或 ALTER TABLE 語(yǔ)句添加檢查約束。

    下列語(yǔ)句創(chuàng)建具有下列約束的表:

    • 部門(mén)編號(hào)的值必須在范圍 10 至 100 內(nèi)
    • 雇員的職務(wù)只能為下列之一: "Sales"、"Mgr"或"Clerk"
    • 1986 年之前雇用的每個(gè)雇員的工資必須超過(guò) $40,500。
     
    CREATE TABLE EMP
    (ID SMALLINT NOT NULL,
    NAME VARCHAR(9),
    DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),
    JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),
    HIREDATE DATE,
    SALARY DECIMAL(7,2),
    COMM DECIMAL(7,2),
    PRIMARY KEY (ID),
    CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) )

    僅當(dāng)條件判定為假時(shí)才會(huì)違反約束。例如,如果插入行的 DEPT 為空值,則插入繼續(xù)進(jìn)行而不出錯(cuò),盡管 DEPT 的值應(yīng)該象約束中定義的那樣在 10 和 100 之間。

    下列語(yǔ)句將一個(gè)約束添加至名為 COMP 的 EMPLOYEE 表中,該約束為雇員的總報(bào)酬必須超過(guò) $15,000:

     
    ALTER TABLE EMP
    ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)

    將檢查表中現(xiàn)存的行以確保這些行不違反新約束??赏ㄟ^(guò)使用如下的 SET CONSTRAINTS 語(yǔ)句將此檢查延期:

         SET CONSTRAINTS FOR EMP OFF
    ALTER TABLE EMP ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)
    SET CONSTRAINTS FOR EMP IMMEDIATE CHECKED

    首先使用 SET CONSTRAINTS 語(yǔ)句以延期對(duì)表的約束檢查。然后可將一個(gè)或多個(gè)約束添加至表而不檢查這些約束。接著再次發(fā)出 SET CONSTRAINTS 語(yǔ)句,反過(guò)來(lái)將約束檢查打開(kāi)并執(zhí)行任何延期的約束檢查。

    觸發(fā)器

    一個(gè)觸發(fā)器定義一組操作,這組操作通過(guò)修改指定基表中數(shù)據(jù)的操作來(lái)激活。

    可使用觸發(fā)器來(lái)執(zhí)行對(duì)輸入數(shù)據(jù)的驗(yàn)證;自動(dòng)生成新插入行的值;為了交叉引用而讀取其他表;為了審查跟蹤而寫(xiě)入其他表;或通過(guò)電子郵件信息支持警報(bào)。使用觸發(fā)器將導(dǎo)致應(yīng)用程序開(kāi)發(fā)及商業(yè)規(guī)則的全面實(shí)施更快速并且應(yīng)用程序和數(shù)據(jù)的維護(hù)更容易。

    DB2 通用數(shù)據(jù)庫(kù)支持幾種類(lèi)型的觸發(fā)器??啥x觸發(fā)器在 DELETE、INSERT 或 UPDATE 操作之前或之后激活。每個(gè)觸發(fā)器包括一組稱(chēng)為觸發(fā)操作的 SQL 語(yǔ)句,這組語(yǔ)句可包括一個(gè)可選的搜索條件。

    可進(jìn)一步定義后觸發(fā)器以對(duì)每一行都執(zhí)行觸發(fā)操作,或?qū)φZ(yǔ)句執(zhí)行一次觸發(fā)操作,而前觸發(fā)器總是對(duì)每一行都執(zhí)行觸發(fā)操作。

    在 INSERT、UPDATE 或 DELETE 語(yǔ)句之前使用觸發(fā)器,以便在執(zhí)行觸發(fā)操作之前檢查某些條件,或在將輸入值存儲(chǔ)在表中之前更改輸入值。使用后觸發(fā)器,以便在必要時(shí)傳播值或執(zhí)行其他任務(wù),如發(fā)送信息等,這些任務(wù)可能是觸發(fā)器操作所要求的。

    下列示例說(shuō)明了前觸發(fā)器和后觸發(fā)器的使用。考慮一個(gè)記錄并跟蹤股票價(jià)格波動(dòng)的應(yīng)用程序。該數(shù)據(jù)庫(kù)包含兩個(gè)表,CURRENTQUOTE 和 QUOTEHISTORY,定義如下:

     
    CREATE TABLE CURRENTQUOTE
    (SYMBOL VARCHAR(10),
    QUOTE DECIMAL(5,2),
    STATUS VARCHAR(9))

    CREATE TABLE QUOTEHISTORY
    (SYMBOL VARCHAR(10),
    QUOTE DECIMAL(5,2),
    TIMESTAMP TIMESTAMP)

    當(dāng)使用如下語(yǔ)句更新 CURRENTQUOTE 的 QUOTE 列時(shí):

     
    UPDATE CURRENTQUOTE
    SET QUOTE = 68.5
    WHERE SYMBOL = 'IBM'

    應(yīng)更新 CURRENTQUOTE 的 STATUS 列以反映股票是否:

    • 在升值
    • 處于本年度的新高
    • 在下跌
    • 處于本年度的新低
    • 價(jià)位穩(wěn)定

    這通過(guò)使用下列前觸發(fā)器來(lái)實(shí)現(xiàn):

    (1)

         CREATE TRIGGER STOCK_STATUS
    NO CASCADE BEFORE UPDATE OF QUOTE ON CURRENTQUOTE
    REFERENCING NEW AS NEWQUOTE OLD AS OLDQUOTE
    FOR EACH ROW MODE DB2SQL

    (2)

          SET NEWQUOTE.STATUS =

    (3)

             CASE
    

    (4)

                WHEN NEWQUOTE.QUOTE >=
    (SELECT MAX(QUOTE)
    FROM QUOTEHISTORY
    WHERE SYMBOL = NEWQUOTE.SYMBOL
    AND YEAR(TIMESTAMP) = YEAR(CURRENT DATE) )
    THEN 'High'

    (5)

              WHEN NEWQUOTE.QUOTE <=                             
    (SELECT MIN(QUOTE)
    FROM QUOTEHISTORY
    WHERE SYMBOL = NEWQUOTE.SYMBOL
    AND YEAR(TIMESTAMP) = YEAR(CURRENT DATE) )
    THEN 'Low'

    (6)

              WHEN NEWQUOTE.QUOTE > OLDQUOTE.QUOTE
    THEN 'Rising'
    WHEN NEWQUOTE.QUOTE < OLDQUOTE.QUOTE
    THEN 'Dropping'
    WHEN NEWQUOTE.QUOTE = OLDQUOTE.QUOTE
    THEN 'Steady'
    END

    (1)
    此代碼塊將名為 STOCK_STATUS 的觸發(fā)器定義為一個(gè)應(yīng)該在更新 CURRENTQUOTE 表的 QUOTE 列之前激活的觸發(fā)器。第二行指定,在將 CURRENTQUOTE 表的實(shí)際更新所引起的任何更改應(yīng)用于數(shù)據(jù)庫(kù)之前,要應(yīng)用觸發(fā)操作。第二行也意味著觸發(fā)操作將不會(huì)激活任何其他觸發(fā)器。第三行指定一些名稱(chēng),必須將這些名稱(chēng) 作為列名的限定符用于新值 (NEWQUOTE) 和舊值 (OLDQUOTE)。用這些相關(guān)名(NEWQUOTE 和 OLDQUOTE)限定的列名稱(chēng)為轉(zhuǎn)換變量。第四行表示應(yīng)對(duì)每一行都執(zhí)行觸發(fā)操作。
    (2)
    這標(biāo)記此觸發(fā)器的觸發(fā)操作中第一個(gè)也是唯一的一個(gè) SQL 語(yǔ)句的開(kāi)始。 SET 轉(zhuǎn)換變量語(yǔ)句在一個(gè)觸發(fā)器中用來(lái)將值賦給表的行中的列,該表正在由激活該觸發(fā)器的語(yǔ)句進(jìn)行更新。此語(yǔ)句正將一個(gè)值賦給 CURRENTQUOTE 表的 STATUS 列。
    (3)
    該賦值語(yǔ)句右邊使用的表達(dá)式為 CASE 表達(dá)式。 CASE 表達(dá)式擴(kuò)充為 END 關(guān)鍵字。
    (4)
    第一種情況檢查新報(bào)價(jià) (NEWQUOTE.QUOTE) 是否超過(guò)當(dāng)前日歷年度中股票符號(hào)的最高價(jià)。子查詢(xún)正在使用由跟在后面的后觸發(fā)器更新的 QUOTEHISTORY 表。
    (5)
    第二種情況檢查新報(bào)價(jià) (NEWQUOTE.QUOTE) 是否小于當(dāng)前日歷年度中股票符號(hào)的最低價(jià)。子查詢(xún)正在使用由跟在后面的后觸發(fā)器更新的 QUOTEHISTORY 表。
    (6)
    最后三種情況將新報(bào)價(jià) (NEWQUOTE.QUOTE) 與表 (OLDQUOTE.QUOTE) 中的報(bào)價(jià)比較,以確定新報(bào)價(jià)是大于、小于還是等于舊報(bào)價(jià)。 SET 轉(zhuǎn)換變量語(yǔ)句在此處結(jié)束。

    除了更新 CURRENTQUOTE 表中的項(xiàng)之外,還需要通過(guò)將新報(bào)價(jià)連同時(shí)間戳記一起復(fù)制到 QUOTEHISTORY 表中來(lái)創(chuàng)建一個(gè)審查記錄。這通過(guò)使用下列后觸發(fā)器來(lái)實(shí)現(xiàn):

    (1)

         CREATE TRIGGER RECORD_HISTORY
    AFTER UPDATE OF QUOTE ON CURRENTQUOTE
    REFERENCING NEW AS NEWQUOTE
    FOR EACH ROW MODE DB2SQL
    BEGIN ATOMIC

    (2)

         INSERT INTO QUOTEHISTORY
    VALUES (NEWQUOTE.SYMBOL, NEWQUOTE.QUOTE, CURRENT TIMESTAMP);
    END

    (1)
    此代碼塊將命名為 RECORD_HISTORY 的觸發(fā)器定義為應(yīng)該在更新 CURRENTQUOTE 表的 QUOTE 列之后激活的觸發(fā)器。第三行指定應(yīng)該作為列名的限定符用于新值 (NEWQUOTE) 的名稱(chēng)。第四行表示應(yīng)對(duì)每一行都執(zhí)行觸發(fā)操作。
    (2)
    此觸發(fā)器的觸發(fā)操作包括單個(gè) SQL 語(yǔ)句,該語(yǔ)句使用已更新的行中的數(shù)據(jù)(NEWQUOTE.SYMBOL 和 NEWQUOTE.QUOTE)和當(dāng)前的時(shí)間戳記將該行插入 QUOTEHISTORY 表。

    CURRENT TIMESTAMP 是包含時(shí)間戳記的專(zhuān)用寄存器。專(zhuān)用寄存器中提供了列表和解釋。

    連接

    從兩個(gè)或更多個(gè)表中組合數(shù)據(jù)的過(guò)程稱(chēng)為連接表。數(shù)據(jù)庫(kù)管理程序從指定的表中形成行的所有組合。對(duì)于每個(gè)組合,它都測(cè)試連接條件。連接條件是帶有一些約束的搜索條件。有關(guān)約束的列表,參考 SQL Reference。

    注意:連接條件涉及的列的數(shù)據(jù)類(lèi)型不必相同;然而,這些數(shù)據(jù)類(lèi)型必須相容。計(jì)算連接條件的方式與計(jì)算其他搜索條件的方式相同,并且使用相同的比較規(guī)則。

    如果未指定連接條件,則返回在 FROM 子句中列出的表中行的所有組合,即使這些行可能完全不相關(guān)。該結(jié)果稱(chēng)為這兩個(gè)表的交叉積。

    本節(jié)中的示例基于下面兩個(gè)表。這兩個(gè)表只是樣本數(shù)據(jù)庫(kù)中表的簡(jiǎn)化形式,在樣本數(shù)據(jù)庫(kù)中并不存在。這兩個(gè)表一般用來(lái)概述關(guān)于連接的重點(diǎn)。 SAMP_STAFF 列出未作為合同工雇用的雇員的姓名以及這些雇員的職務(wù)說(shuō)明,而 SAMP_PROJECT 則列出雇員(合同工和全職人員)的姓名以及這些雇員所參與的項(xiàng)目。

    這些表如下:

    下列示例產(chǎn)生兩個(gè)表的交叉積。因未指定連接條件,所以給出了行的所有組合:

         SELECT SAMP_PROJECT.NAME,
    SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT, SAMP_STAFF

    此語(yǔ)句產(chǎn)生下列結(jié)果:

         NAME       PROJ   NAME       JOB
    ---------- ------ ---------- --------
    Haas AD3100 Haas PRES
    Thompson PL2100 Haas PRES
    Walker MA2112 Haas PRES
    Lutz MA2111 Haas PRES
    Haas AD3100 Thompson MANAGER
    Thompson PL2100 Thompson MANAGER
    Walker MA2112 Thompson MANAGER
    Lutz MA2111 Thompson MANAGER
    Haas AD3100 Lucchessi SALESREP
    Thompson PL2100 Lucchessi SALESREP
    Walker MA2112 Lucchessi SALESREP
    Lutz MA2111 Lucchessi SALESREP
    Haas AD3100 Nicholls ANALYST
    Thompson PL2100 Nicholls ANALYST
    Walker MA2112 Nicholls ANALYST
    Lutz MA2111 Nicholls ANALYST

    兩個(gè)主要的連接類(lèi)型是內(nèi)連接外連接。到目前為止,所有示例中使用的都是內(nèi)連接。內(nèi)連接只保留交叉積中滿(mǎn)足連接條件的那些行。如果某行在一個(gè)表中存在,但在另一個(gè)表中不存在,則結(jié)果表中不包括該信息。

    下列示例產(chǎn)生兩個(gè)表的內(nèi)連接。該內(nèi)連接列出分配給某個(gè)項(xiàng)目的全職雇員信息:

         SELECT SAMP_PROJECT.NAME,
    SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT, SAMP_STAFF
    WHERE SAMP_STAFF.NAME = SAMP_PROJECT.NAME

    或者,也可以指定如下內(nèi)連接:

         SELECT SAMP_PROJECT.NAME,
    SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT INNER JOIN SAMP_STAFF
    ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME

    結(jié)果是:

         NAME       PROJ   NAME       JOB
    ---------- ------ ---------- --------
    Haas AD3100 Haas PRES
    Thompson PL2100 Thompson MANAGER

    注意:該內(nèi)連接的結(jié)果由右表和左表中姓名列的值匹配的行組成- 'Haas' 和 'Thompson' 都包括在列出所有全職雇員的 SAMP_STAFF 表中以及列出分配給某個(gè)項(xiàng)目的專(zhuān)職和合同雇員的 SAMP_PROJECT 表中。

    外連接是內(nèi)連接和左表和/或右表中未包括內(nèi)連接中的那些行的并置。當(dāng)對(duì)兩個(gè)表執(zhí)行外連接時(shí),可任意將一個(gè)表指定為左表而將另一個(gè)表指定為右表。外連接有三種類(lèi)型:

    1. 左外連接包括內(nèi)連接和左表中未包括在內(nèi)連接中的那些行。
    2. 右外連接包括內(nèi)連接和右表中未包括在內(nèi)連接中的那些行。
    3. 全外連接包括內(nèi)連接以及左表和右表中未包括在內(nèi)連接中的行。

    使用 SELECT 語(yǔ)句來(lái)指定要顯示的列。在 FROM 子句中,列出后跟關(guān)鍵字 LEFT OUTER JOIN、RIGHT OUTER JOIN 或 FULL OUTER JOIN 的第一個(gè)表的名稱(chēng)。接著需要指定后跟 ON 關(guān)鍵字的第二個(gè)表。在 ON 關(guān)鍵字后面,指定表示要連接的表之間關(guān)系的連接條件。

    在下列示例中,將 SAMP_STAFF 指定為右表,而 SAMP_PROJECT 則被指定為左表。通過(guò)使用 LEFT OUTER JOIN,列出所有全職和合同雇員(在 SAMP_PROJECT 中列出)的姓名和項(xiàng)目編號(hào),如果是全職雇員(在 SAMP_STAFF 中列出),還列出這些雇員的職位:

         SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
    SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT LEFT OUTER JOIN SAMP_STAFF
    ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME

    此語(yǔ)句產(chǎn)生下列結(jié)果:

         NAME       PROJ                 NAME       JOB
    ---------- -------------------- ---------- --------------------
    Haas AD3100 Haas PRES
    Lutz MA2111 - -
    Thompson PL2100 Thompson MANAGER
    Walker MA2112 - -

    所有列中都具有值的那些行是該內(nèi)連接的結(jié)果。這些都是滿(mǎn)足連接條件的行: 'Haas' 和 'Thompson' 既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。對(duì)于不滿(mǎn)足連接條件的行,右表的列上出現(xiàn)空值: 'Lutz' 和 'Walker' 都是在 SAMP_PROJECT 表中列出的合同雇員,因而未在 SAMP_STAFF 表中列出。注意:左表中的所有行都包括在結(jié)果集中。

    在下一個(gè)示例中,將 SAMP_STAFF 指定為右表而 SAMP_PROJECT 則被指定為左表。通過(guò)使用 RIGHT OUTER JOIN 列出所有專(zhuān)職雇員(在 SAMP_STAFF 中列出)的姓名和工作職位,如果將這些雇員分配給了某個(gè)項(xiàng)目(在 SAMP_PROJECT 中列出),還列出他們的項(xiàng)目編號(hào):

         SELECT SAMP_PROJECT.NAME,
    SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT RIGHT OUTER JOIN SAMP_STAFF
    ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME

    結(jié)果為:

        NAME       PROJ                 NAME       JOB
    ---------- -------------------- ---------- --------------------
    Haas AD3100 Haas PRES
    - - Lucchessi SALESREP
    - - Nicholls ANALYST
    Thompson PL2100 Thompson MANAGER

    象在左外連接中一樣,所有列中都具有值的那些行是內(nèi)連接的結(jié)果。這些都是滿(mǎn)足連接條件的行: 'Haas'和'Thompson'既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。對(duì)于不滿(mǎn)足連接條件的行,右表的列上出現(xiàn)空值: 'Lucchessi'和'Nicholls'都是未分配項(xiàng)目的專(zhuān)職雇員。雖然他們?cè)?SAMP_STAFF 中列出,但未在 SAMP_PROJECT 中列出。注意:右表中的所有行都包括在結(jié)果集中。

    下一個(gè)示例對(duì) SAMP_PROJECT 表和 SAMP_STAFF 表使用 FULL OUTER JOIN。該示例列出所有專(zhuān)職雇員(包括未分配項(xiàng)目的雇員)和合同雇員的姓名:

         SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
    SAMP_STAFF.NAME, SAMP_STAFF.JOB
    FROM SAMP_PROJECT FULL OUTER JOIN SAMP_STAFF
    ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME

    結(jié)果為:

         NAME       PROJ                 NAME       JOB
    ---------- -------------------- ---------- --------------------
    Haas AD3100 Haas PRES
    - - Lucchessi SALESREP
    - - Nicholls ANALYST
    Thompson PL2100 Thompson MANAGER
    Lutz MA2111 - -
    Walker MA2112 - -

    此結(jié)果包括左外連接、右外連接以及內(nèi)連接。列出所有專(zhuān)職雇員和合同雇員。正如左外連接和右外連接一樣,對(duì)于不滿(mǎn)足連接條件的值,相應(yīng)列中出現(xiàn)空值。 SAMP_STAFF 和 SAMP_PROJECT 中的每一行都包括在結(jié)果集中。

    復(fù)雜查詢(xún)

    DB2 通用數(shù)據(jù)庫(kù)允許您通過(guò)使用 ROLLUP 和 CUBE 分組、合并及查看單個(gè)結(jié)果集中的多列。這種新型而強(qiáng)大的功能增強(qiáng)并簡(jiǎn)化了基于數(shù)據(jù)分析的 SQL。

    有很多方法可從數(shù)據(jù)庫(kù)中抽取有用信息。可執(zhí)行遞歸查詢(xún)從現(xiàn)存數(shù)據(jù)集中產(chǎn)生結(jié)果表。

    ROLLUP 和 CUBE 查詢(xún)

    在查詢(xún)的 GROUP BY 子句中指定 ROLLUP 和 CUBE 運(yùn)算。 ROLLUP 分組產(chǎn)生包含常規(guī)分組行和小計(jì)行的結(jié)果集。CUBE 分組產(chǎn)生包含來(lái)自 ROLLUP 和交叉制表行中的行的結(jié)果集。所以對(duì)于 ROLLUP,可獲取每人每月的銷(xiāo)售量以及每月銷(xiāo)售總量和總部總量。對(duì)于 CUBE,將包括每人銷(xiāo)售總量的附加行。參見(jiàn) SQL Reference 以了解更詳細(xì)的情況。

    遞歸查詢(xún)

    遞歸查詢(xún)是迭代使用結(jié)果數(shù)據(jù)來(lái)確定進(jìn)一步結(jié)果的查詢(xún)。可以把這想象成在一棵樹(shù)上或一幅圖中來(lái)回移動(dòng)。使用遞歸查詢(xún)的常見(jiàn)示例包括材料單應(yīng)用程序、訂票系統(tǒng)、網(wǎng)絡(luò)計(jì)劃和調(diào)度。遞歸查詢(xún)是使用包括引用自己名稱(chēng)的的公共表表達(dá)式來(lái)編寫(xiě)的。參見(jiàn) SQL Reference 以獲取遞歸查詢(xún)的示例。

    posted on 2006-01-10 23:27 Vincent.Chen 閱讀(586) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Database

    主站蜘蛛池模板: 国产99视频精品免费专区| 亚洲日本中文字幕天堂网| 免费亚洲视频在线观看| 亚洲AV人无码综合在线观看 | 午夜亚洲国产理论秋霞| 日本免费人成视频播放| 2022久久国产精品免费热麻豆| 特a级免费高清黄色片 | 日本成人免费在线| 免费观看黄色的网站| 免费久久人人爽人人爽av| 特级毛片全部免费播放a一级| 97久久国产亚洲精品超碰热| 亚洲日本在线观看| 亚洲精品成人片在线观看精品字幕 | 亚洲香蕉免费有线视频| 13小箩利洗澡无码视频网站免费| 日本一区二区三区在线视频观看免费| 久久精品亚洲AV久久久无码| 91在线亚洲精品专区| 亚洲日韩国产精品第一页一区| 免费在线观看一级毛片| 国产成人在线观看免费网站| 成人免费看片又大又黄| 亚洲免费综合色在线视频| 18级成人毛片免费观看| 无码午夜成人1000部免费视频| a级在线免费观看| 一个人看的www免费高清| 美女裸免费观看网站| 亚洲A∨精品一区二区三区下载| 中文日韩亚洲欧美制服| 亚洲综合色区中文字幕| 国产精品亚洲专区在线观看| 亚洲性色高清完整版在线观看| 久久久久亚洲AV无码专区首JN| 亚洲嫩模在线观看| 亚洲白色白色永久观看| 亚洲理论片在线中文字幕| 亚洲欧洲视频在线观看| 麻豆狠色伊人亚洲综合网站 |