亚洲av色香蕉一区二区三区,十四以下岁毛片带血a级,亚洲 校园 欧美 国产 另类,亚洲av日韩av一区谷露,色欲av无码一区二区三区

  • 相關(guān)軟件
    >SELECT 示例 創(chuàng)建者:webmaster 更新時間:2006-02-16 15:51

    A. 使用 SELECT 檢索行和列


    下例顯示三個代碼示例。第一個代碼示例從 pubs 數(shù)據(jù)庫內(nèi)的 authors 表中返回所有行(沒有指定 WHERE 子句)和所有列(使用 *)。



    USE pubs
    SELECT *
    FROM authors
    ORDER BY au_lname ASC, au_fname ASC

    -- Alternate way.
    USE pubs
    SELECT authors.*
    FROM customers
    ORDER BY au_lname ASC, au_fname ASC


    下例從 pubs 數(shù)據(jù)庫內(nèi)的 authors 表中返回所有行(沒有指定 WHERE 子句)和列的一個子集(au_lname、au_fname、phone、city、state)。另外,還添加列標(biāo)題。



    USE pubs
    SELECT au_fname, au_lname, phone AS Telephone, city, state
    FROM authors
    ORDER BY au_lname ASC, au_fname ASC


    下例只返回居住在加利福尼亞州且不姓 McBadden 的作者列。



    USE pubs
    SELECT au_fname, au_lname, phone AS Telephone
    FROM authors
    WHERE state = 'CA' and au_lname <> 'McBadden'
    ORDER BY au_lname ASC, au_fname ASC


    B. 在列標(biāo)題和列計算中使用 SELECT


    這些示例返回 titles 內(nèi)的所有行。第一個示例返回本年度截止到現(xiàn)在的銷售總額以及應(yīng)付給每個作者和出版商的金額。在第二個示例中,計算每本書的總收入。



    USE pubs
    SELECT ytd_sales AS Sales,
      authors.au_fname + ' '+ authors.au_lname AS Author,
      ToAuthor = (ytd_sales * royalty) / 100,
      ToPublisher = ytd_sales - (ytd_sales * royalty) / 100
    FROM titles INNER JOIN titleauthor
      ON titles.title_id = titleauthor.title_id INNER JOIN authors
      ON titleauthor.au_id = authors.au_id
    ORDER BY Sales DESC, Author ASC


    下面是結(jié)果集:



    Sales       Author                    ToAuthor    ToPublisher 
    ----------- ------------------------- ----------- -----------
    22246     Anne Ringer           5339     16907
    22246     Michel DeFrance       5339     16907
    18722     Marjorie Green         4493     14229
    15096     Reginald Blotchet-Halls   2113     12983
    8780     Cheryl Carson         1404     7376
    4095     Abraham Bennet         409       3686
    4095     Akiko Yokomoto         409       3686
    4095     Ann Dull             409       3686
    4095     Burt Gringlesby       409       3686
    4095     Dean Straight         409       3686
    4095     Marjorie Green         409       3686
    4095     Michael O'Leary       409       3686
    4095     Sheryl Hunter         409       3686
    4072     Johnson White         407       3665
    3876     Michael O'Leary       387       3489
    3876     Stearns MacFeather     387       3489
    3336     Charlene Locksley       333       3003
    2045     Albert Ringer         245       1800
    2045     Anne Ringer           245       1800
    2032     Innes del Castillo     243       1789
    375       Livia Karsen         37       338
    375       Stearns MacFeather     37       338
    375       Sylvia Panteley       37       338
    111       Albert Ringer         11       100
    NULL     Charlene Locksley       NULL     NULL

    (25 row(s) affected)


    下面是用于計算每本書的總收入的查詢:



    USE pubs
    SELECT 'Total income is', price * ytd_sales AS Revenue,
    'for', title_id AS Book#
    FROM titles
    ORDER BY Book# ASC


    下面是結(jié)果集:



    Revenue                                    Book#  
    --------------- --------------------- ---- ------
    Total income is 81859.0500         for BU1032
    Total income is 46318.2000         for BU1111
    Total income is 55978.7800         for BU2075
    Total income is 81859.0500         for BU7832
    Total income is 40619.6800         for MC2222
    Total income is 66515.5400         for MC3021
    Total income is NULL             for MC3026
    Total income is 201501.0000       for PC1035
    Total income is 81900.0000         for PC8888
    Total income is NULL             for PC9999
    Total income is 8096.2500         for PS1372
    Total income is 22392.7500         for PS2091
    Total income is 777.0000         for PS2106
    Total income is 81399.2800         for PS3333
    Total income is 26654.6400         for PS7777
    Total income is 7856.2500         for TC3218
    Total income is 180397.2000       for TC4203
    Total income is 61384.0500         for TC7777

    (18 row(s) affected)


    C. 將 DISTINCT 與 SELECT 一起使用


    下例使用 DISTINCT 防止檢索重復(fù)的作者 ID 號:



    USE pubs
    SELECT DISTINCT au_id
    FROM authors
    ORDER BY au_id


    D. 使用 SELECT INTO 創(chuàng)建表


    第一個示例在tempdb 中創(chuàng)建一個名為 #coffeetabletitles 的臨時表。為使用該表,始終用下面顯示的精確名稱(包括井號 (#))引用它。



    USE pubs
    DROP TABLE #coffeetabletitles
    GO
    SET NOCOUNT ON
    SELECT * INTO #coffeetabletitles
    FROM titles
    WHERE price < $20
    SET NOCOUNT OFF
    SELECT name
    FROM tempdb..sysobjects
    WHERE name LIKE '#c%'


    下面是結(jié)果集:



    name                                                                    
    ------------------------------------------------------------------------
    #coffeetabletitles__________________________________________________________________________________________________000000000028

    (1 row(s) affected)

    CHECKPOINTing database that was changed.

    (12 row(s) affected)

    name                                            
    ------------------------------------------------------------------------
    newtitles

    (1 row(s) affected)

    CHECKPOINTing database that was changed.


    第二個示例創(chuàng)建一個名為 newtitles 的永久表。



    USE pubs
    IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
        WHERE table_name = 'newtitles')
      DROP TABLE newtitles
    GO
    EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'true'
    USE pubs
    SELECT * INTO newtitles
    FROM titles
    WHERE price > $25 OR price < $20
    SELECT name FROM sysobjects WHERE name LIKE 'new%'
    USE master
    EXEC sp_dboption 'pubs', 'select into/bulkcopy', 'false'


    下面是結(jié)果集:



    name                           
    ------------------------------
    newtitles              

    (1 row(s) affected)


    E. 使用相關(guān)子查詢


    下例顯示在語義上相當(dāng)?shù)牟樵儾⒄f明使用 EXISTS 關(guān)鍵字和 IN 關(guān)鍵字的區(qū)別。下面是兩個示例,顯示一個有效子查詢檢索書名為商業(yè)書籍的每個出版商名稱,還檢索 titles 表和 publishers 表之間相匹配的出版商 ID 號。



    USE pubs
    SELECT DISTINCT pub_name
    FROM publishers
    WHERE EXISTS
      (SELECT *
      FROM titles
      WHERE pub_id = publishers.pub_id
      AND type = 'business')

    -- Or
    USE pubs
    SELECT distinct pub_name
    FROM publishers
    WHERE pub_id IN
      (SELECT pub_id
      FROM titles
      WHERE type = 'business')


    下例在一個相關(guān)(或重復(fù))子查詢中使用 IN,該查詢的值取決于外部查詢。它被重復(fù)執(zhí)行,為外部查詢可能選擇的每行各執(zhí)行一次。該查詢在 titleauthor 表中檢索每個版稅為 100% 且作者標(biāo)識號在 titleauthor 表和 authors 中相匹配的作者的名和姓。



    USE pubs
    SELECT DISTINCT au_lname, au_fname
    FROM authors
    WHERE 100 IN
      (SELECT royaltyper
      FROM titleauthor
      WHERE titleauthor.au_id = authors.au_id)


    不能獨立于外部查詢對上述語句中的子查詢?nèi)≈?。它需要一個 authors.au_id 值,但是該值隨 Microsoft® SQL Server™ 檢查 authors 中的不同行而改變。



    相關(guān)子查詢還可以用于外部查詢的 HAVING 子句。下例查找那些預(yù)付款最大金額是組平均值兩倍以上的書籍類型。



    USE pubs
    SELECT t1.type
    FROM titles t1
    GROUP BY t1.type
    HAVING MAX(t1.advance) >= ALL
      (SELECT 2 * AVG(t2.advance)
      FROM titles t2
      WHERE t1.type = t2.type)


    下例使用兩個相關(guān)子查詢查找作者姓名,這些作者至少參與過一本受歡迎的計算機書籍的創(chuàng)作。



    USE pubs
    SELECT au_lname, au_fname
    FROM authors
    WHERE au_id IN
      (SELECT au_id
      FROM titleauthor
      WHERE title_id IN
        (SELECT title_id
        FROM titles
        WHERE type = 'popular_comp'))


    F. 使用 GROUP BY


    下例在數(shù)據(jù)庫內(nèi)查找各出版商的本年度截止到現(xiàn)在的銷售總額。



    USE pubs
    SELECT pub_id, SUM(ytd_sales) AS total
    FROM titles
    GROUP BY pub_id
    ORDER BY pub_id


    下面是結(jié)果集:



    pub_id   total
    ------   -----
    0736     28286
    0877     44219
    1389     24941

    (3 row(s) affected)


    由于使用了 GROUP BY 子句,只為每個出版商各返回一個含有銷售總額的行。



    G. 對多個組使用 GROUP BY


    下例查找按類型和出版商 ID 分組的平均價格和本年度截止到現(xiàn)在的銷售總額。



    USE pubs
    SELECT type, pub_id, AVG(price) AS 'avg', sum(ytd_sales) AS 'sum'
    FROM titles
    GROUP BY type, pub_id
    ORDER BY type, pub_id


    下面是結(jié)果集:



    type         pub_id avg                   sum         
    ------------ ------ --------------------- -----------
    business   0736   2.9900           18722
    business   1389   17.3100           12066
    mod_cook   0877   11.4900           24278
    popular_comp 1389   21.4750           12875
    psychology   0736   11.4825           9564
    psychology   0877   21.5900           375
    trad_cook   0877   15.9633           19566
    UNDECIDED   0877   NULL             NULL

    (8 row(s) affected)

    Warning, null value eliminated from aggregate.


    H. 使用 GROUP BY 和 WHERE


    下例在只檢索預(yù)付款多于 $5,000 的行后,將結(jié)果分成組。



    USE pubs
    SELECT type, AVG(price)
    FROM titles
    WHERE advance > $5000
    GROUP BY type
    ORDER BY type


    下面是結(jié)果集:



    type                                    
    ------------ --------------------------
    business   2.99              
    mod_cook   2.99              
    popular_comp 21.48              
    psychology   14.30              
    trad_cook   17.97              

    (5 row(s) affected)


    I. 將 GROUP BY 與表達(dá)式一起使用


    下例按表達(dá)式分組。如果表達(dá)式不包含聚合函數(shù),則可以按表達(dá)式分組。



    USE pubs
    SELECT AVG(ytd_sales), ytd_sales * royalty
    FROM titles
    GROUP BY ytd_sales * royalty
    ORDER BY ytd_sales * royalty


    下面是結(jié)果集:



    ----------- ----------- 
    NULL     NULL    
    111       1110    
    375       3750    
    2032     24384    
    2045     24540    
    3336     33360    
    3876     38760    
    4072     40720    
    4095     40950    
    8780     140480    
    15096     211344    
    18722     449328    
    22246     533904    

    (13 row(s) affected)


    J. 比較 GROUP BY 和 GROUP BY ALL


    第一個示例只為要求 10% 版稅的書籍生成組。由于沒有含 10% 版稅的現(xiàn)代烹調(diào)書籍,因此結(jié)果中沒有 mod_cook 類型的組。



    第二個示例為所有類型均生成組,包括現(xiàn)代烹調(diào)書籍和 UNDECIDED,盡管現(xiàn)代烹調(diào)書籍組中沒有任何行符合 WHERE 子句中指定的條件。



    對于沒有符合條件的行的組,容納聚合值的列(平均價格)為 NULL。



    USE pubs
    SELECT type, AVG(price)
    FROM titles
    WHERE royalty = 10
    GROUP BY type
    ORDER BY type


    下面是結(jié)果集:



    type                                    
    ------------ --------------------------
    business   17.31              
    popular_comp 20.00              
    psychology   14.14              
    trad_cook   17.97              

    (4 row(s) affected)

    -- Using GROUP BY ALL
    USE pubs
    SELECT type, AVG(price)
    FROM titles
    WHERE royalty = 10
    GROUP BY all type
    ORDER BY type


    下面是結(jié)果集:



    type                                    
    ------------ --------------------------
    business   17.31              
    mod_cook   NULL              
    popular_comp 20.00              
    psychology   14.14              
    trad_cook   17.97              
    UNDECIDED   NULL              

    (6 row(s) affected)


    K. 將 GROUP BY 與 ORDER BY 一起使用


    下例查找各類書籍的平均價格并按平均價格排序結(jié)果。



    USE pubs
    SELECT type, AVG(price)
    FROM titles
    GROUP BY type
    ORDER BY AVG(price)


    下面是結(jié)果集:



    type                                    
    ------------ --------------------------
    UNDECIDED   NULL              
    mod_cook   11.49              
    psychology   13.50              
    business   13.73              
    trad_cook   15.96              
    popular_comp 21.48              

    (6 row(s) affected)


    L. 使用 HAVING 子句


    第一個示例顯示帶聚合函數(shù)的 HAVING 子句。該子句按類型分組 titles 表中的行,并且消除只包含一本書的組。第二個示例顯示不帶聚合函數(shù)的 HAVING 子句。該子句按類型分組 titles 表中的行,并且消除不是以字母 p 開頭的類型。



    USE pubs
    SELECT type
    FROM titles
    GROUP BY type
    HAVING COUNT(*) > 1
    ORDER BY type


    下面是結(jié)果集:



    type         
    ------------
    business  
    mod_cook  
    popular_comp
    psychology  
    trad_cook  

    (5 row(s) affected)


    該查詢在 HAVING 子句中使用 LIKE 子句。



    USE pubs
    SELECT type
    FROM titles
    GROUP BY type
    HAVING type LIKE 'p%'
    ORDER BY type


    下面是結(jié)果集:



    type
    ------------
    popular_comp
    psychology

    (2 row(s) affected)


    M. 使用 HAVING 和 GROUP BY


    下例顯示在一個 SELECT 語句中使用 GROUP BY、HAVING、WHERE 和 ORDER BY 子句。該語句生成組和匯總值,但卻是在消除那些價格低于 $5 的書名后才生成組和匯總值。它還按 pub_id 組織結(jié)果。



    USE pubs
    SELECT pub_id, SUM(advance), AVG(price)
    FROM titles
    WHERE price >= $5
    GROUP BY pub_id
    HAVING SUM(advance) > $15000
      AND AVG(price) < $20
      AND pub_id > '0800'
    ORDER BY pub_id


    下面是結(jié)果集:



    pub_id                                                       
    ------ -------------------------- --------------------------
    0877   26,000.00             17.89              
    1389   30,000.00             18.98              

    (2 row(s) affected)


    N. 將 HAVING 與 SUM 和 AVG 一起使用


    下例按出版商分組 titles 表,并只包括那些支付的預(yù)付款總額超過 $25,000 且平均書價高于 $15 的出版商的組。



    USE pubs
    SELECT pub_id, SUM(advance), AVG(price)
    FROM titles
    GROUP BY pub_id
    HAVING SUM(advance) > $25000
    AND AVG(price) > $15


    若要查看本年度截止到現(xiàn)在的銷售額超過 $40,000 的出版商,請使用下面的查詢:



    USE pubs
    SELECT pub_id, total = SUM(ytd_sales)
    FROM titles
    GROUP BY pub_id
    HAVING SUM(ytd_sales) > 40000


    如果想確保對每個出版商的計算中至少包含六本書,則使用 HAVING COUNT(*) > 5 消除返回的總數(shù)小于六本書的出版商。該查詢是這樣的:



    USE pubs
    SELECT pub_id, SUM(ytd_sales) AS total
    FROM titles
    GROUP BY pub_id
    HAVING COUNT(*) > 5


    下面是結(jié)果集:



    pub_id   total
    ------   -----
    0877     44219
    1389     24941
     
    (2 row(s) affected)


    使用該語句,返回了兩行。消除了 New Moon Books (0736)。



    O. 使用 COMPUTE BY 計算組合計


    下例使用兩個代碼示例顯示 COMPUTE BY 的用法。第一個代碼示例使用一個帶一個聚合函數(shù)的 COMPUTE BY,第二個代碼示例使用一個帶兩個聚合函數(shù)的 COMPUTE BY 函數(shù)。



    下例先按書籍類型,再按書籍價格計算每類烹調(diào)書籍(價格高于 $10)的價格總和。



    USE pubs
    SELECT type, price
    FROM titles
    WHERE price > $10
      AND type LIKE '%cook'
    ORDER BY type, price
    COMPUTE SUM(price) BY type


    下面是結(jié)果集:



    type         price                 
    ------------ ---------------------
    mod_cook   19.9900

    (1 row(s) affected)

    sum            
    ---------------------
    19.9900

    (1 row(s) affected)

    type       price          
    ------------ ---------------------
    trad_cook   11.9500
    trad_cook   14.9900
    trad_cook   20.9500

    (3 row(s) affected)

    sum            
    ---------------------
    47.8900

    (1 row(s) affected)


    下例檢索所有烹飪書籍的書籍類型、出版商標(biāo)識號和價格。COMPUTE BY 子句使用兩個不同的聚合函數(shù)。



    USE pubs
    SELECT type, pub_id, price
    FROM titles
    WHERE type LIKE '%cook'
    ORDER BY type, pub_id
    COMPUTE SUM(price), MAX(pub_id) BY type


    下面是結(jié)果集:



    type         pub_id price                 
    ------------ ------ ---------------------
    mod_cook   0877   19.9900
    mod_cook   0877   2.9900

    (2 row(s) affected)

    sum             max
    --------------------- ----
    22.9800           0877

    (1 row(s) affected)

    type       pub_id price          
    ------------ ------ ---------------------
    trad_cook   0877   20.9500
    trad_cook   0877   11.9500
    trad_cook   0877   14.9900

    (3 row(s) affected)

    sum             max
    --------------------- ----
    47.8900           0877

    (1 row(s) affected)


    P. 使用不帶 BY 的 COMPUTE 計算總計值


    可以使用不帶 BY 的 COMPUTE 關(guān)鍵字生成總計值、總計數(shù),等等。



    該語句查找超過 $20 的所有類型書籍的價格和預(yù)付款總計。



    USE pubs
    SELECT type, price, advance
    FROM titles
    WHERE price > $20
    COMPUTE SUM(price), SUM(advance)


    在同一查詢內(nèi)可以使用 COMPUTE BY 和不帶 BY 的 COMPUTE。該查詢按類型查找價格總和和預(yù)付款總和,然后計算所有類型書籍的價格總計和預(yù)付款總計。



    USE pubs
    SELECT type, price, advance
    FROM titles
    WHERE type LIKE '%cook'
    ORDER BY type, price
    COMPUTE SUM(price), SUM(advance) BY type
    COMPUTE SUM(price), SUM(advance)


    下面是結(jié)果集:



    type         price                 advance               
    ------------ --------------------- ---------------------
    mod_cook   2.9900           15000.0000
    mod_cook   19.9900           .0000

    (2 row(s) affected)

    sum             sum            
    --------------------- ---------------------
    22.9800           15000.0000

    (1 row(s) affected)

    type       price           advance          
    ------------ --------------------- ---------------------
    trad_cook   11.9500           4000.0000
    trad_cook   14.9900           8000.0000
    trad_cook   20.9500           7000.0000

    (3 row(s) affected)

    sum             sum            
    --------------------- ---------------------
    47.8900           19000.0000

    (1 row(s) affected)

    sum             sum            
    --------------------- ---------------------
    70.8700           34000.0000

    (1 row(s) affected)


    Q. 計算所有行上的計算總和


    下例只顯示選擇列表內(nèi)的三列,并在結(jié)果的最后提供基于所有價格和所有預(yù)付款的合計。



    USE pubs
    SELECT type, price, advance
    FROM titles
    COMPUTE SUM(price), SUM(advance)


    下面是結(jié)果集:



    type         price                 advance               
    ------------ --------------------- ---------------------
    business   19.9900           5000.0000
    business   11.9500           5000.0000
    business   2.9900           10125.0000
    business   19.9900           5000.0000
    mod_cook   19.9900           .0000
    mod_cook   2.9900           15000.0000
    UNDECIDED   NULL             NULL
    popular_comp 22.9500           7000.0000
    popular_comp 20.0000           8000.0000
    popular_comp NULL             NULL
    psychology   21.5900           7000.0000
    psychology   10.9500           2275.0000
    psychology   7.0000           6000.0000
    psychology   19.9900           2000.0000
    psychology   7.9900           4000.0000
    trad_cook   20.9500           7000.0000
    trad_cook   11.9500           4000.0000
    trad_cook   14.9900           8000.0000

    (18 row(s) affected)

    sum             sum            
    --------------------- ---------------------
    236.2600         95400.0000

    (1 row(s) affected)

    Warning, null value eliminated from aggregate.


    R. 使用多個 COMPUTE 子句


    下例查找所有心理學(xué)書籍的價格總和,以及按出版商分類的心理學(xué)書籍的價格總和。通過包含一個以上的 COMPUTE BY 子句,可以在同一語句內(nèi)使用不同的聚合函數(shù)。



    USE pubs
    SELECT type, pub_id, price
    FROM titles
    WHERE type = 'psychology'
    ORDER BY type, pub_id, price  
    COMPUTE SUM(price) BY type, pub_id
    COMPUTE SUM(price) BY type


    下面是結(jié)果集:



    type         pub_id price                 
    ------------ ------ ---------------------
    psychology   0736   7.0000
    psychology   0736   7.9900
    psychology   0736   10.9500
    psychology   0736   19.9900

    (4 row(s) affected)

    sum            
    ---------------------
    45.9300

    (1 row(s) affected)

    type       pub_id price          
    ------------ ------ ---------------------
    psychology   0877   21.5900

    (1 row(s) affected)

    sum            
    ---------------------
    21.5900

    (1 row(s) affected)

    sum            
    ---------------------
    67.5200

    (1 row(s) affected)


    S. 比較 GROUP BY 與 COMPUTE


    第一個示例使用 COMPUTE 子句計算不同類型烹調(diào)書籍的價格總和。第二個示例只使用 GROUP BY 生成相同的匯總信息。



    USE pubs
    -- Using COMPUTE
    SELECT type, price
    FROM titles
    WHERE type like '%cook'
    ORDER BY type, price  
    COMPUTE SUM(price) BY type


    下面是結(jié)果集:



    type         price                 
    ------------ ---------------------
    mod_cook   2.9900
    mod_cook   19.9900

    (2 row(s) affected)

    sum            
    ---------------------
    22.9800

    (1 row(s) affected)

    type       price          
    ------------ ---------------------
    trad_cook   11.9500
    trad_cook   14.9900
    trad_cook   20.9500

    (3 row(s) affected)

    sum            
    ---------------------
    47.8900

    (1 row(s) affected)


    下面是另一個使用 GROUP BY 的查詢:



    USE pubs
    -- Using GROUP BY
    SELECT type, SUM(price)
    FROM titles
    WHERE type LIKE '%cook'
    GROUP BY type
    ORDER BY type


    下面是結(jié)果集:



    type                               
    ------------ ---------------------
    mod_cook   22.9800
    trad_cook   47.8900

    (2 row(s) affected)


    T. 將 SELECT 與 GROUP BY、COMPUTE 和 ORDER BY 子句一起使用


    下例只返回含有本年度截止到現(xiàn)在的當(dāng)前銷售額的行,然后按 type 以遞減順序計算書籍的平均價格和預(yù)付款總額。將返回四個數(shù)據(jù)列,包括截斷的書名。所有的計算列都出現(xiàn)在選擇列表內(nèi)。



    USE pubs
    SELECT CAST(title AS char(20)) AS title, type, price, advance
    FROM titles
    WHERE ytd_sales IS NOT NULL
    ORDER BY type DESC
    COMPUTE AVG(price), SUM(advance) BY type
    COMPUTE SUM(price), SUM(advance)


    下面是結(jié)果集:



    title                type         price                 advance               
    -------------------- ------------ --------------------- ----------------
    Onions, Leeks, and G trad_cook   20.9500           7000.0000
    Fifty Years in Bucki trad_cook   11.9500           4000.0000
    Sushi, Anyone?     trad_cook   14.9900           8000.0000

    (3 row(s) affected)

    avg             sum            
    --------------------- ---------------------
    15.9633           19000.0000

    (1 row(s) affected)

    title           type       price           advance          
    -------------------- ------------ --------------------- ----------------
    Computer Phobic AND psychology   21.5900           7000.0000
    Is Anger the Enemy? psychology   10.9500           2275.0000
    Life Without Fear   psychology   7.0000           6000.0000
    Prolonged Data Depri psychology   19.9900           2000.0000
    Emotional Security: psychology   7.9900           4000.0000

    (5 row(s) affected)

    avg             sum            
    --------------------- ---------------------
    13.5040           21275.0000

    (1 row(s) affected)

    title           type       price           advance          
    -------------------- ------------ --------------------- ----------------
    But Is It User Frien popular_comp 22.9500           7000.0000
    Secrets of Silicon V popular_comp 20.0000           8000.0000

    (2 row(s) affected)

    avg             sum            
    --------------------- ---------------------
    21.4750           15000.0000

    (1 row(s) affected)

    title           type       price           advance          
    -------------------- ------------ --------------------- ----------------
    Silicon Valley Gastr mod_cook   19.9900           .0000
    The Gourmet Microwav mod_cook   2.9900           15000.0000

    (2 row(s) affected)

    avg             sum            
    --------------------- ---------------------
    11.4900           15000.0000

    (1 row(s) affected)

    title           type       price           advance          
    -------------------- ------------ --------------------- ----------------
    The Busy Executive's business   19.9900           5000.0000
    Cooking with Compute business   11.9500           5000.0000
    You Can Combat Compu business   2.9900           10125.0000
    Straight Talk About business   19.9900           5000.0000

    (4 row(s) affected)

    avg             sum            
    --------------------- ---------------------
    13.7300           25125.0000

    (1 row(s) affected)

    sum             sum            
    --------------------- ---------------------
    236.2600         95400.0000

    (1 row(s) affected)


    U. 將 SELECT 語句與 CUBE 一起使用


    下例顯示兩個代碼示例。第一個示例使用 CUBE 運算符從 SELECT 語句返回結(jié)果集。SELECT 語句包含每本書的書名與銷售量之間的一對多關(guān)系。通過使用 CUBE 運算符,該語句返回額外的行。



    USE pubs
    SELECT SUBSTRING(title, 1, 65) AS title, SUM(qty) AS 'qty'
    FROM sales INNER JOIN titles
      ON sales.title_id = titles.title_id
    GROUP BY title
    WITH CUBE
    ORDER BY title


    下面是結(jié)果集:



    title                                                             qty         
    ----------------------------------------------------------------- ------
    NULL                                         493      
    But Is It User Friendly?                             30      
    Computer Phobic AND Non-Phobic Individuals: Behavior Variations   20      
    Cooking with Computers: Surreptitious Balance Sheets         25      
    ...
    The Busy Executive's Database Guide                     15      
    The Gourmet Microwave                               40      
    You Can Combat Computer Stress!                       35      

    (17 row(s) affected)


    NULL 代表 title 列中的所有值。結(jié)果集返回每個書名對應(yīng)的銷售量和所有書名對應(yīng)的銷售總量的值。應(yīng)用 CUBE 運算符或 ROLLUP 運算符將返回相同的結(jié)果。



    下例使用 cube_examples 表顯示 CUBE 運算符如何影響結(jié)果集并使用聚合函數(shù) (SUM)。cube_examples 表包含產(chǎn)品名稱、客戶名稱以及每個客戶對某個特定產(chǎn)品下的訂單數(shù)。



    USE pubs
    CREATE TABLE cube_examples
    (product_name varchar(30) NULL,
    customer_name varchar(30) NULL,
    number_of_orders int     NULL
    )

    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Filo Mix', 'Romero y tomillo', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Outback Lager', 'Wilman Kala', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Filo Mix', 'Romero y tomillo', 20)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Ikura', 'Wilman Kala', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Ikura', 'Romero y tomillo', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Outback Lager', 'Wilman Kala', 20)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Filo Mix', 'Wilman Kala', 30)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Filo Mix', 'Eastern Connection', 40)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Outback Lager', 'Eastern Connection', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Ikura', 'Wilman Kala', 40)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Ikura', 'Romero y tomillo', 10)
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Filo Mix', 'Romero y tomillo', 50)


    首先,發(fā)出一個帶 GROUP BY 子句和結(jié)果集的典型查詢。



    USE pubs
    SELECT product_name, customer_name, SUM(number_of_orders)
    FROM cube_examples
    GROUP BY product_name, customer_name
    ORDER BY product_name


    GROUP BY 使結(jié)果集在組內(nèi)形成組。下面是結(jié)果集:



    product_name                   customer_name                              
    ------------------------------ ------------------------------ ----------
    Filo Mix               Eastern Connection         40      
    Filo Mix               Romero y tomillo           80      
    Filo Mix               Wilman Kala             30      
    Ikura                 Romero y tomillo           20      
    Ikura                 Wilman Kala             50      
    Outback Lager             Eastern Connection         10      
    Outback Lager             Wilman Kala             30      

    (7 row(s) affected)


    然后,使用 CUBE 運算符發(fā)出一個帶 GROUP BY 子句的查詢。結(jié)果集應(yīng)包括相同的信息以及各 GROUP BY 列的超聚合信息。



    USE pubs
    SELECT product_name, customer_name, SUM(number_of_orders)
    FROM cube_examples
    GROUP BY product_name, customer_name
    WITH CUBE


    CUBE 運算符的結(jié)果集包含上述簡單 GROUP BY 結(jié)果集的值,并為 GROUP BY 子句中的各行添加超聚合信息。NULL 代表結(jié)果集中所有計算出的聚合值。下面是結(jié)果集:



    product_name                   customer_name                              
    ------------------------------ ------------------------------ ----------
    Filo Mix               Eastern Connection         40      
    Filo Mix               Romero y tomillo           80      
    Filo Mix               Wilman Kala             30      
    Filo Mix               NULL                   150      
    Ikura                 Romero y tomillo           20      
    Ikura                 Wilman Kala             50      
    Ikura                 NULL                   70      
    Outback Lager             Eastern Connection         10      
    Outback Lager             Wilman Kala             30      
    Outback Lager             NULL                   40      
    NULL                   NULL                   260      
    NULL                   Eastern Connection         50      
    NULL                   Romero y tomillo           100      
    NULL                   Wilman Kala             110      

    (14 row(s) affected)


    結(jié)果集的第 4 行表示所有客戶對 Filo Mix 總共下了 150 份訂單。



    結(jié)果集的第 11 行表示所有客戶對所有產(chǎn)品下的訂單總數(shù)為 260。



    結(jié)果集的第 12-14 行表示每個客戶對所有產(chǎn)品下的訂單總數(shù)分別為 100、110 和 50。



    V. 在包含三列的結(jié)果集上使用 CUBE


    下例顯示兩個代碼示例。第一個代碼示例生成包含三列的 CUBE 結(jié)果集,第二個示例生成包含四列的 CUBE 結(jié)果集。



    第一個 SELECT 語句返回所售書籍的發(fā)行名稱、書名和數(shù)量。下例中的 GROUP BY 子句包含兩個分別稱為 pub_nametitle 的列。在 publisherstitles 之間以及 titlessales 之間還存在兩個一對多關(guān)系。



    通過使用 CUBE 運算符,使結(jié)果集中包含有關(guān)出版商售出的書名數(shù)量的更詳細(xì)信息。NULL 代表書名列中的所有值。



    USE pubs
    SELECT pub_name, title, SUM(qty) AS 'qty'
    FROM sales INNER JOIN titles
      ON sales.title_id = titles.title_id INNER JOIN publishers
      ON publishers.pub_id = titles.pub_id
    GROUP BY pub_name, title
    WITH CUBE


    下面是結(jié)果集:



    pub_name             title                                      qty 
    -------------------- ---------------------------------------- ------
    Algodata Infosystems But Is It User Friendly?             30
    Algodata Infosystems Cooking with Computers: Surreptitious Ba   25
    Algodata Infosystems Secrets of Silicon Valley             50
    Algodata Infosystems Straight Talk About Computers           15
    Algodata Infosystems The Busy Executive's Database Guide       15
    Algodata Infosystems NULL                           135
    Binnet & Hardley   Computer Phobic AND Non-Phobic Individu   20
    Binnet & Hardley   Fifty Years in Buckingham Palace Kitche   20
    ...                                 ...
    NULL           Sushi, Anyone?                     20
    NULL           The Busy Executive's Database Guide       15
    NULL           The Gourmet Microwave               40
    NULL           You Can Combat Computer Stress!         35

    (36 row(s) affected)


    增加 GROUP BY 子句中的列數(shù)將顯示 CUBE 運算符是 n 維運算符的原因。使用 CUBE 運算符時,有兩列的 GROUP BY 子句將多返回三種分組。根據(jù)列中的非重復(fù)值,分組的個數(shù)可以多于三個。



    結(jié)果集先按出版商名稱,然后按書名分組。右邊的列中列出每個出版商售出的每個書名的數(shù)量。



    title 列中的 NULL 代表所有書名。有關(guān)如何區(qū)分結(jié)果集中特定值和所有值的更多信息,請參見示例 H。CUBE 運算符從一個 SELECT 語句中返回下列幾組信息:


    • 每個出版商售出的每個書名的數(shù)量



    • 售出的每個書名的數(shù)量



    • 每個出版商售出的書名數(shù)量



    • 所有出版商售出的書名總數(shù)



    GROUP BY 子句中引用的每列已與 GROUP BY 中的所有其它列交叉引用,并已重新應(yīng)用 SUM 聚合,這就在結(jié)果集中生成附加的行。結(jié)果集中返回的信息隨 GROUP BY 子句中列數(shù)的增長在 n 維方向增長。



    說明  請確保在 GROUP BY 子句后列出的列相互之間是有意義的實質(zhì)關(guān)系。例如,如果使用 au_fnameau_lname,CUBE 運算符將返回不相關(guān)的信息,如名字相同的作者售出的書籍?dāng)?shù)目。在實質(zhì)層次結(jié)構(gòu)(如年度銷售額和季度銷售額)上使用 CUBE 運算符將在結(jié)果集中生成無意義的行。使用 ROLLUP 運算符更有效。



    在第二個代碼示例中,GROUP BY 子句包含由 CUBE 運算符交叉引用的三列。在 publishersauthorsauthorstitles 以及 titlessales 之間存在一對多關(guān)系。



    使用 CUBE 運算符將返回有關(guān)出版商售出的書名數(shù)量的更詳細(xì)信息。



    USE pubs
    SELECT pub_name, au_lname, title, SUM(qty)
    FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titles.title_id = titleauthor.title_id INNER JOIN publishers
      ON publishers.pub_id = titles.pub_id INNER JOIN sales
      ON sales.title_id = titles.title_id
    GROUP BY pub_name, au_lname, title
    WITH CUBE


    基于 CUBE 運算符返回的交叉引用分組,CUBE 運算符返回下列信息:


    • 每個出版商為每位作者售出的每個書名的數(shù)量



    • 每個出版商為每位作者售出的所有書名的數(shù)量



    • 每個出版商售出的所有書名的數(shù)量



    • 所有出版商為所有作者售出的所有書名的總數(shù)量



    • 所有出版商為每位作者售出的每個書名的數(shù)量



    • 所有出版商為每位作者售出的所有書名的數(shù)量



    • 每個出版商為所有作者售出的每個書名的數(shù)量



    • 所有出版商為每位作者售出的每個書名的數(shù)量



    說明  所有出版商、所有書名和所有作者的超聚合比銷售總額大,因為許多書的作者不止一位。



    模式隨關(guān)系數(shù)的增長而顯現(xiàn)出來。報表中的值和 NULL 的模式顯示哪些組形成了匯總聚合。有關(guān)組的顯式信息由 GROUPING 函數(shù)提供。



    W. 將 GROUPING 函數(shù)與 CUBE 一起使用


    下例顯示 SELECT 語句使用 SUM 聚合、GROUP BY 子句和 CUBE 運算符的方式。它還在 GROUP BY 子句后列出的兩列上使用 GROUPING 函數(shù)。



    USE pubs
    SELECT pub_name, GROUPING(pub_name),title, GROUPING(title),
      SUM(qty) AS 'qty'
    FROM sales INNER JOIN titles
      ON sales.title_id = titles.title_id INNER JOIN publishers
      ON publishers.pub_id = titles.pub_id
    GROUP BY pub_name, title
    WITH CUBE


    結(jié)果集中有兩個包含 0 和 1 值的列,這兩列由 GROUPING(pub_name) 和 GROUPING(title) 表達(dá)式生成。



    下面是結(jié)果集:



    pub_name                 title                         qty            
    -------------------- --- ------------------------- --- -----------
    Algodata Infosystems   0 But Is It User Friendly?   0       30
    Algodata Infosystems   0 Cooking with Computers: S   0       25
    Algodata Infosystems   0 Secrets of Silicon Valley   0       50
    Algodata Infosystems   0 Straight Talk About Compu   0       15
    Algodata Infosystems   0 The Busy Executive's Data   0       15
    Algodata Infosystems   0 NULL                 1       135
    Binnet & Hardley     0 Computer Phobic AND Non-P   0       20
    Binnet & Hardley     0 Fifty Years in Buckingham   0       20
    ...                                 ...
    NULL             1 The Busy Executive's Data   0       15
    NULL             1 The Gourmet Microwave     0       40
    NULL             1 You Can Combat Computer S   0       35

    (36 row(s) affected)


    X. 使用 ROLLUP 運算符


    下例顯示兩個代碼示例。第一個示例檢索產(chǎn)品名稱、客戶名稱和所下的訂單總數(shù)并使用 ROLLUP 運算符。



    USE pubs
    SELECT product_name, customer_name, SUM(number_of_orders)
      AS 'Sum orders'
    FROM cube_examples
    GROUP BY product_name, customer_name
    WITH ROLLUP


    下面是結(jié)果集:



    product_name                   customer_name                  Sum orders 
    ------------------------------ ------------------------------ ----------
    Filo Mix               Eastern Connection         40            
    Filo Mix               Romero y tomillo           80            
    Filo Mix               Wilman Kala             30            
    Filo Mix               NULL                 150            
    Ikura                 Romero y tomillo           20            
    Ikura                 Wilman Kala             50            
    Ikura                 NULL                   70            
    Outback Lager             Eastern Connection         10            
    Outback Lager             Wilman Kala             30            
    Outback Lager             NULL                   40            
    NULL                   NULL                   260            

    (11 row(s) affected)


    第二個示例顯示在公司列和部門列上執(zhí)行 ROLLUP 運算并合計出雇員總數(shù)。



    ROLLUP 運算符生成聚合匯總。該運算符用在需要匯總信息但完整的 CUBE 提供的都是無關(guān)的數(shù)據(jù)時,或者用在集內(nèi)有集的情況中,例如公司內(nèi)的部門就是集內(nèi)的集。



    USE pubs
    CREATE TABLE personnel
    (
    company_name varchar(20),
    department   varchar(15),
    num_employees int
    )

    INSERT personnel VALUES ('Du monde entier', 'Finance', 10)
    INSERT personnel VALUES ('Du monde entier', 'Engineering', 40)
    INSERT personnel VALUES ('Du monde entier', 'Marketing', 40)
    INSERT personnel VALUES ('Piccolo und mehr', 'Accounting', 20)
    INSERT personnel VALUES ('Piccolo und mehr', 'Personnel', 30)
    INSERT personnel VALUES ('Piccolo und mehr', 'Payroll', 40)


    在該查詢中,除了 ROLLUP 計算結(jié)果外,公司名稱、部門和公司內(nèi)所有雇員的總數(shù)也成為結(jié)果集的一部分。



    SELECT company_name, department, SUM(num_employees)
    FROM personnel
    GROUP BY company_name, department WITH ROLLUP


    下面是結(jié)果集:



    company_name         department                  
    -------------------- --------------- -----------
    Du monde entier     Engineering   40      
    Du monde entier     Finance       10      
    Du monde entier     Marketing     40      
    Du monde entier     NULL         90      
    Piccolo und mehr   Accounting     20      
    Piccolo und mehr   Payroll       40      
    Piccolo und mehr   Personnel     30      
    Piccolo und mehr   NULL         90      
    NULL           NULL         180      

    (9 row(s) affected)


    Y. 使用 GROUPING 函數(shù)


    下例將三個新行添加進 cube_examples 表中。三行中的每行都在一個或多個列中記錄 NULL,以便只顯示 ROLLUP 函數(shù)在分組列中生成值 1。另外,下例修改了在前面的示例中使用的 SELECT 語句。



    USE pubs
    -- Add first row with a NULL customer name and 0 orders.
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES ('Ikura', NULL, 0)

    -- Add second row with a NULL product and NULL customer with real value
    -- for orders.
    INSERT cube_examples (product_name, customer_name, number_of_orders)
      VALUES (NULL, NULL, 50)

    -- Add third row with a NULL product, NULL order amount, but a real
    -- customer name.
    INSERT cube_examples (product_name, customer_name, number_of_orders)
    VALUES (NULL, 'Wilman Kala', NULL)

    SELECT product_name AS Prod, customer_name AS Cust,
      SUM(number_of_orders) AS 'Sum Orders',
      GROUPING(product_name) AS 'Grp prod_name',
      GROUPING(customer_name) AS 'Grp cust_name'
    FROM cube_examples
    GROUP BY product_name, customer_name
    WITH ROLLUP


    GROUPING 函數(shù)只能與 CUBE 或 ROLLUP 一起使用。表達(dá)式取值為 NULL 時,GROUPING 函數(shù)返回值 1,因為列值是 NULL 且代表所有值的設(shè)置。當(dāng)相應(yīng)的列(不管是否是 NULL)不是來自作為語法值的 CUBE 或 ROLLUP 選項時,GROUPING 函數(shù)返回值 0。返回值的數(shù)據(jù)類型為 tinyint。



    下面是結(jié)果集:



    Prod          Cust               Sum Orders  Grp prod_name Grp cust_name 
    ------------- ------------------ ----------- ------------- -------------
    NULL       NULL           50       0         0        
    NULL       Wilman Kala     NULL     0         0        
    NULL       NULL           50       0         1        
    Filo Mix     Eastern Connection 40       0         0        
    Filo Mix     Romero y tomillo   80       0         0        
    Filo Mix     Wilman Kala     30       0         0        
    Filo Mix     NULL           150       0         1        
    Ikura       NULL           0       0         0        
    Ikura       Romero y tomillo   20       0         0        
    Ikura       Wilman Kala     50       0         0        
    Ikura       NULL           70       0         1        
    Outback Lager Eastern Connection 10       0         0        
    Outback Lager Wilman Kala     30       0         0        
    Outback Lager NULL           40       0         1        
    NULL       NULL           310       1         1        

    (15 row(s) affected)


    Z. 在 SELECT 中使用 GROUP BY、聚合函數(shù)和 ROLLUP


    下例使用包含聚合函數(shù)和 GROUP BY 子句的 SELECT 查詢,GROUP BY 子句按順序先后列出 pub_name、au_lname title。



    USE pubs
    SELECT pub_name, au_lname, title, SUM(qty) AS 'SUM'
    FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titles.title_id = titleauthor.title_id INNER JOIN publishers
      ON publishers.pub_id = titles.pub_id INNER JOIN sales
      ON sales.title_id = titles.title_id
    GROUP BY pub_name, au_lname, title
    WITH ROLLUP


    通過使用 ROLLUP 運算符,沿列的列表從右到左移動以創(chuàng)建這些分組。



    pub_name      au_lname      title   SUM(qty)
    pub_name     au_lname     NULL     SUM(qty)
    pub_name     NULL       NULL     SUM(qty)
    NULL       NULL       NULL     SUM(qty)


    NULL 代表該列中的所有值。



    如果使用不帶 ROLLUP 運算符的 SELECT 語句,該語句則創(chuàng)建單個分組。該查詢返回每個 pub_name、au_lnametitle 唯一組合的總和值。



    pub_name       au_lname       title   SUM(qty)


    將這些示例與在同一查詢上使用 CUBE 運算符所創(chuàng)建的分組進行比較。



    pub_name      au_lname      title   SUM(qty)
    pub_name     au_lname     NULL     SUM(qty)
    pub_name     NULL       NULL     SUM(qty)
    NULL       NULL       NULL     SUM(qty)
    NULL       au_lname     title   SUM(qty)
    NULL       au_lname     NULL     SUM(qty)
    pub_name     NULL       title   SUM(qty)
    NULL       NULL       title   SUM(qty)


    分組對應(yīng)于結(jié)果集中返回的信息。結(jié)果集中的 NULL 代表列中的所有值。當(dāng)列(pub_nameau_lnametitle)的順序和 GROUP BY 子句中列出的順序一樣時,ROLLUP 運算符返回下列數(shù)據(jù):


    • 每個出版商為每位作者售出的每個書名的數(shù)量



    • 每個出版商為每位作者售出的所有書名的數(shù)量



    • 每個出版商售出的所有書名的數(shù)量



    • 所有出版商為所有作者售出的所有書名的總數(shù)量



    下面是結(jié)果集:



    pub_name          au_lname     title                                SUM
    ----------------- ------------ ------------------------------------ ---
    Algodata Infosys Bennet     The Busy Executive's Database Guide 15
    Algodata Infosys Bennet     NULL                       15
    Algodata Infosys Carson     NULL                       30
    Algodata Infosys Dull       Secrets of Silicon Valley         50
    Algodata Infosys Dull       NULL                       50
    ...                                   ...
    New Moon Books   White     Prolonged Data Deprivation: Four   15
    New Moon Books   White     NULL                       15
    New Moon Books   NULL       NULL                     316
    NULL         NULL       NULL                     791

    (49 row(s) affected)


    GROUPING 函數(shù)可以與 ROLLUP 運算符或 CUBE 運算符一起使用。該函數(shù)可以應(yīng)用于選擇列表中的一列。根據(jù)該列是否由 ROLLUP 運算符分組,該函數(shù)返回 1 或 0。



    a. 使用 INDEX 優(yōu)化程序提示


    下例顯示使用 INDEX 優(yōu)化程序提示的兩種方式。第一個示例顯示強制優(yōu)化程序使用非聚集索引檢索表中的行,第二個示例顯示強制使用 0 索引執(zhí)行表掃描。



    -- Use the specifically named INDEX.
    USE pubs
    SELECT au_lname, au_fname, phone
    FROM authors WITH (INDEX(aunmind))
    WHERE au_lname = 'Smith'


    下面是結(jié)果集:



    au_lname                               au_fname             phone        
    -------------------------------------- -------------------- ----------
    Smith                       Meander         913 843-0462

    (1 row(s) affected)

    -- Force a table scan by using INDEX = 0.
    USE pubs
    SELECT emp_id, fname, lname, hire_date
    FROM employee (index = 0)
    WHERE hire_date > '10/1/1994'


    b. 使用 OPTION 和 GROUP 提示


    下例顯示如何與 GROUP BY 子句一起使用 OPTION (GROUP) 子句。



    USE pubs
    SELECT a.au_fname, a.au_lname, SUBSTRING(t.title, 1, 15)
    FROM authors a INNER JOIN titleauthor ta
      ON a.au_id = ta.au_id INNER JOIN titles t
      ON t.title_id = ta.title_id
    GROUP BY a.au_lname, a.au_fname, t.title
    ORDER BY au_lname ASC, au_fname ASC
    OPTION (HASH GROUP, FAST 10)


    c. 使用 UNION 查詢提示


    下例顯示使用 MERGE UNION 查詢提示。



    USE pubs
    SELECT *
    FROM authors a1
    OPTION (MERGE UNION)
    SELECT *
    FROM authors a2


    d. 使用簡單 UNION


    下例中的結(jié)果集包括 CustomersSouthAmericanCustomers 這兩個表的 ContactNameCompanyName、City Phone 列的內(nèi)容。



    USE Northwind
    GO
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'SouthAmericanCustomers')
      DROP TABLE SouthAmericanCustomers
    GO
    -- Create SouthAmericanCustomers table.
    SELECT ContactName, CompanyName, City, Phone
    INTO SouthAmericanCustomers
    FROM Customers
    WHERE Country IN ('USA', 'Canada')
    GO
    -- Here is the simple union.
    USE Northwind
    SELECT ContactName, CompanyName, City, Phone
    FROM Customers
    WHERE Country IN ('USA', 'Canada')
    UNION
    SELECT ContactName, CompanyName, City, Phone
    FROM SouthAmericanCustomers
    ORDER BY CompanyName, ContactName ASC
    GO


    e. 將 SELECT INTO 與 UNION 一起使用


    在下例中,第一個 SELECT 語句中的 INTO 子句指定名為 CustomerResults 的表包含由 Customers SouthAmericanCustomers 表中指定列的并集組成的最終結(jié)果集。



    USE Northwind
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'CustomerResults')
      DROP TABLE CustomerResults
    GO
    USE Northwind
    SELECT ContactName, CompanyName, City, Phone INTO CustomerResults
    FROM Customers
    WHERE Country IN ('USA', 'Canada')
    UNION
    SELECT ContactName, CompanyName, City, Phone
    FROM SouthAmericanCustomers
    ORDER BY CompanyName, ContactName ASC
    GO


    f. 在兩個 SELECT 語句中將 UNION 與 ORDER BY 一起使用


    與 UNION 子句一起使用的某些參數(shù)的順序非常重要。下例通過兩個 SELECT 語句說明不正確和正確的 UNION 用法,并重命名這些語句輸出的列。



    /* INCORRECT */
    USE Northwind
    GO
    SELECT City
    FROM Customers
    ORDER BY Cities
    UNION
    SELECT Cities = City
    FROM SouthAmericanCustomers
    GO

    /* CORRECT */
    USE Northwind
    GO
    SELECT Cities = City
    FROM Customers
      UNION
    SELECT City
    FROM SouthAmericanCustomers
    ORDER BY Cities
    GO


    g. 在三個 SELECT 語句中使用 UNION 以顯示 ALL 和圓括號的作用


    這些示例使用 UNION 組合三個表的結(jié)果,這三個表都有相同的 5 行數(shù)據(jù)。第一個示例使用 UNION ALL 顯示重復(fù)的記錄并返回全部 15 行。第二個示例使用不帶 ALL 的 UNION,從組合的三個 SELECT 語句結(jié)果集中刪除重復(fù)的行。



    最后一個示例在第一個 UNION 中使用 ALL,在第二個不帶 ALL 的 UNION 中用圓括號將 UNION 括在里面。第二個 UNION 因位于圓括號內(nèi)而首先得到處理,并且因為沒有使用 ALL 選項而返回 5 行且刪除重復(fù)的行。這 5 行通過 UNION ALL 關(guān)鍵字與第一個 SELECT 的結(jié)果組合,且不刪除這兩個由 5 行組成的結(jié)果集之間重復(fù)的行。最終結(jié)果有 10 行。



    USE Northwind
    GO
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'CustomersOne')
      DROP TABLE CustomersOne
    GO
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'CustomersTwo')
      DROP TABLE CustomersTwo
    GO
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'CustomersThree')
      DROP TABLE CustomersThree
    GO
    USE Northwind
    GO
    SELECT ContactName, CompanyName, City, Phone INTO CustomersOne
    FROM Customers
    WHERE Country = 'Mexico'
    GO
    SELECT ContactName, CompanyName, City, Phone INTO CustomersTwo
    FROM Customers
    WHERE Country = 'Mexico'
    GO
    SELECT ContactName, CompanyName, City, Phone INTO CustomersThree
    FROM Customers
    WHERE Country = 'Mexico'
    GO
    -- Union ALL
    SELECT ContactName
    FROM CustomersOne
      UNION ALL
    SELECT ContactName
    FROM CustomersTwo
      UNION ALL
    SELECT ContactName
    FROM CustomersThree
    GO

    USE Northwind
    GO
    SELECT ContactName
    FROM CustomersOne
      UNION
    SELECT ContactName
    FROM CustomersTwo
      UNION
    SELECT ContactName
    FROM CustomersThree
    GO

    USE Northwind
    GO
    SELECT ContactName
    FROM CustomersOne
      UNION ALL
      (
        SELECT ContactName
        FROM CustomersTwo
          UNION
        SELECT ContactName
        FROM CustomersThree
      )
    GO
    相關(guān)文章
    本頁查看次數(shù):