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ā)生。例如,如果銷售員售出一批商品,則應(yīng)增加其傭金。

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

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

          關(guān)鍵字

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

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

          唯一關(guān)鍵字

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

          主關(guān)鍵字

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

          外部關(guān)鍵字

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

          唯一約束

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

          參考完整性約束

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

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

          表檢查約束

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

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

          • 部門編號(hào)的值必須在范圍 10 至 100 內(nèi)
          • 雇員的職務(wù)只能為下列之一: "Sales"、"Mgr"或"Clerk"
          • 1986 年之前雇用的每個(gè)雇員的工資必須超過 $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 之間。

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

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

          將檢查表中現(xiàn)存的行以確保這些行不違反新約束。可通過使用如下的 SET CONSTRAINTS 語句將此檢查延期:

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

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

          觸發(fā)器

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

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

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

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

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

          下列示例說明了前觸發(fā)器和后觸發(fā)器的使用。考慮一個(gè)記錄并跟蹤股票價(jià)格波動(dòng)的應(yīng)用程序。該數(shù)據(jù)庫包含兩個(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)使用如下語句更新 CURRENTQUOTE 的 QUOTE 列時(shí):

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

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

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

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

          除了更新 CURRENTQUOTE 表中的項(xiàng)之外,還需要通過將新報(bào)價(jià)連同時(shí)間戳記一起復(fù)制到 QUOTEHISTORY 表中來創(chuàng)建一個(gè)審查記錄。這通過使用下列后觸發(fā)器來實(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) 的名稱。第四行表示應(yīng)對(duì)每一行都執(zhí)行觸發(fā)操作。
          (2)
          此觸發(fā)器的觸發(fā)操作包括單個(gè) SQL 語句,該語句使用已更新的行中的數(shù)據(jù)(NEWQUOTE.SYMBOL 和 NEWQUOTE.QUOTE)和當(dāng)前的時(shí)間戳記將該行插入 QUOTEHISTORY 表。

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

          連接

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

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

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

          本節(jié)中的示例基于下面兩個(gè)表。這兩個(gè)表只是樣本數(shù)據(jù)庫中表的簡(jiǎn)化形式,在樣本數(shù)據(jù)庫中并不存在。這兩個(gè)表一般用來概述關(guān)于連接的重點(diǎn)。 SAMP_STAFF 列出未作為合同工雇用的雇員的姓名以及這些雇員的職務(wù)說明,而 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

          此語句產(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è)主要的連接類型是內(nèi)連接外連接。到目前為止,所有示例中使用的都是內(nèi)連接。內(nèi)連接只保留交叉積中滿足連接條件的那些行。如果某行在一個(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)目的專職和合同雇員的 SAMP_PROJECT 表中。

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

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

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

          在下列示例中,將 SAMP_STAFF 指定為右表,而 SAMP_PROJECT 則被指定為左表。通過使用 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

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

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

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

          在下一個(gè)示例中,將 SAMP_STAFF 指定為右表而 SAMP_PROJECT 則被指定為左表。通過使用 RIGHT OUTER JOIN 列出所有專職雇員(在 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é)果。這些都是滿足連接條件的行: 'Haas'和'Thompson'既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。對(duì)于不滿足連接條件的行,右表的列上出現(xiàn)空值: 'Lucchessi'和'Nicholls'都是未分配項(xiàng)目的專職雇員。雖然他們?cè)?SAMP_STAFF 中列出,但未在 SAMP_PROJECT 中列出。注意:右表中的所有行都包括在結(jié)果集中。

          下一個(gè)示例對(duì) SAMP_PROJECT 表和 SAMP_STAFF 表使用 FULL OUTER JOIN。該示例列出所有專職雇員(包括未分配項(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)連接。列出所有專職雇員和合同雇員。正如左外連接和右外連接一樣,對(duì)于不滿足連接條件的值,相應(yīng)列中出現(xiàn)空值。 SAMP_STAFF 和 SAMP_PROJECT 中的每一行都包括在結(jié)果集中。

          復(fù)雜查詢

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

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

          ROLLUP 和 CUBE 查詢

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

          遞歸查詢

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

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

          主站蜘蛛池模板: 秦皇岛市| 苏尼特左旗| 介休市| 铜山县| 五河县| 留坝县| 柳河县| 宜黄县| 苗栗县| 鄂托克前旗| 嘉兴市| 类乌齐县| 遵化市| 曲麻莱县| 玛沁县| 门源| 德阳市| 淅川县| 浮梁县| 新泰市| 土默特左旗| 怀仁县| 富源县| 灌云县| 武清区| 平江县| 霍州市| 湖南省| 德惠市| 武山县| 芒康县| 岱山县| 龙州县| 建水县| 云林县| 南涧| 富锦市| 沅陵县| 潮州市| 丁青县| 铜川市|