SELECT の例

A.    SELECT を使用して行および列を取得する

ここでは、3 つのプログラム例を示します。最初の例では、pubs データベース内の 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 データベース内の authors から、WHERE 句を指定せずにすべての行と、au_lnameau_fnamephonecitystate という列のサブセットだけを返しています。さらに列ヘッダーが追加されています。

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.    列ヘッダーおよび計算処理と共に SELECT を使用する

以下の例では titles のすべての行を返します。最初の例では、今年のこれまでの売り上げ合計と、著者、出版社別の総額を返しています。2 番目の例では、それぞれの書籍に対する合計収入を返しています。

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

以下に結果セットを示します。

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

以下に結果セットを示します。

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 を使って重複している著者の ID 番号を取得しないようにしています。

USE pubs
SELECT DISTINCT au_id
FROM authors
ORDER BY au_id
D.    SELECT INTO を使用してテーブルを作成する

最初の例では、tempdb 内に #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%'

以下に結果セットを示します。

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.

2 番目の例では、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'

以下に結果セットを示します。

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

(1 row(s) affected)
E.    相関サブクエリを使用する

この例では、EXISTS キーワードと IN キーワードを使用した意味的に等しいクエリを示し、その違いを示しています。どちらも、書籍のタイトルがビジネス書であり、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')

この例では、相関サブクエリ、つまり繰り返しサブクエリ内で IN を使用しています。相関サブクエリの値は外側のクエリによって決まります。相関サブクエリは、外側のクエリが選択する行に対して 1 回ずつ、繰り返し実行されます。次のクエリでは、titleauthor テーブル内の印税率が 100 であり、authors テーブルと titleauthor テーブルの間で著者の ID 番号が一致する著者の名字と名前を重複なしに取得しています。

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

上記のステートメントのサブクエリは、外側のクエリから独立して評価できません。このサブクエリは authors.au_id の値を必要としますが、この値は、Microsoft® SQL Server™ が調べる authors の行によって変化します。

相関サブクエリは、1 つ上のレベルのクエリの HAVING 句でも使えます。この例では、最大の前払い金がグループの平均値の 2 倍以上である本の種類を検索します。

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)

この例では、2 つの相関サブクエリを使って、少なくとも 1 冊以上の一般向けコンピュータ書籍の執筆に参加した経験を持つ著者の名前を検索しています。

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 を使用する

この例では、データベース内の各出版社の、今年に入ってからの売り上げの合計を返します。

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

以下に結果セットを示します。

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

(3 row(s) affected)

GROUP BY 句があるため、各出版社につき 1 行だけが返され、この行にその出版社のすべての売り上げの合計が含まれます。

G.    GROUP BY を複数のグループと共に使用する

この例では、平均価格および今年に入ってからの売り上げの合計を、書籍の種類と出版社 ID でグループ化して返します。

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

以下に結果セットを示します。

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 を使用する

この例では、前払い金が $5,000 より多い行だけを取得した後、結果をグループ化します。

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

以下に結果セットを示します。

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

(5 row(s) affected)
I.    1 つの式と共に GROUP BY を使用する

この例では、式によってグループ化します。式に集計関数が含まれない限り、式によってグループ化することができます。

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

以下に結果セットを示します。

----------- -----------
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% のものがないため、mod_cook タイプのグループは結果に表示されません。

2 番目の例では、現代料理に関する書籍のグループには WHERE 句で指定された条件を満たす行はありませんが、現代料理および UNDECIDED を含むすべての種類に対し、グループが生成されます。

条件を満たす行がないグループに対しては、集計値 (平均価格) の列は NULL になります。

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

以下に結果セットを示します。

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

以下に結果セットを示します。

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 と共に使用する

この例では、それぞれの書籍のタイプ別の平均価格を求め、その結果を平均価格の順序で表示しています。

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

以下に結果セットを示します。

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 句を使用する

最初の例では、HAVING 句を集計関数と共に使用しています。titles テーブルの行が種類によってグループ化され、書籍が 1 冊しか含まれないグループは除外されます。2 番目の例では、HAVING 句を集計関数なしで使用しています。titles テーブルの行が種類によってグループ化され、頭文字が "p" でない種類は除去されます。

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

以下に結果セットを示します。

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

以下に結果セットを示します。

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

(2 row(s) affected)
M.    HAVING と GROUP BY を使用する

この例では、1 つの SELECT ステートメントの中で GROUP BY 句、HAVING 句、WHERE 句、および ORDER BY 句を使用しています。グループおよび集計値が生成されますが、その前に、価格が $5 未満のタイトルが除去されます。また、結果は pub_id の順序で表示されます。

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

以下に結果セットを示します。

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

(2 row(s) affected)
N.    HAVING を SUM および AVG と共に使用する

この例では、titles テーブルを出版社別にグループ化しますが、前払いを合計で $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

今年に入ってからの売り上げが $40,000 を超えた出版社を出力するには、次のクエリを使用します。

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

各出版社の集計に最低 6 冊の書籍が含まれているようにするには、HAVING COUNT(*) > 5 を使って、6 冊未満の合計を返す出版社を除去します。クエリは次のようになります。

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

以下に結果セットを示します。

pub_id   total
------   -----
0877      44219
1389      24941

(2 row(s) affected)

このステートメントでは、2 行が返されます。New Moon Books (0736) は除去されます。

O.    COMPUTE BY でグループ合計を計算する

ここでは、COMPUTE BY を使った 2 つのプログラム例を示します。最初の例では、1 つの COMPUTE BY に 1 つの集計関数を使用し、2 番目の例では 1 つの COMPUTE BY に 2 つの集計関数を使用しています。

この例では、$10 を超える料理関係の書籍に対して、価格の合計を種類別に計算し、順序はまず書籍の種類、次に書籍の価格を指定しています。

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

以下に結果セットを示します。

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)

この例では、すべての料理関係書籍の種類、出版社の ID 番号、および価格を取得しています。COMPUTE BY 句では、異なる 2 つの集計関数を使用しています。

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

以下に結果セットを示します。

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 を使用して総計値を計算する

COMPUTE キーワードは、総計や総数などを作成するために、BY なしで使うことができます。

次のステートメントは、$20 を超えるすべての種類の書籍の価格および前払い金の総計を返します。

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

COMPUTE BY および BY なしの COMPUTE は同じクエリの中で使うことができます。このクエリは、各種類の価格および前払い金の合計を計算し、次に、すべての種類の書籍の価格および前払い金の総計を計算します。

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)

以下に結果セットを示します。

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.    すべての行で計算済みの総計を計算する

この例では、選択リストに指定されているのは 3 列のみで、すべての価格およびすべての前払い金に基づいた合計値が結果の終わりに表示されます。

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

以下に結果セットを示します。

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 句を使用する

この例では、心理学関係の書籍の価格の合計が出版社ごとに計算されるだけでなく、心理学関係の書籍すべての価格の合計も計算されます。複数の COMPUTE 句を含めることにより、同じステートメントの中で異なる集計関数を使うことができます。

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

以下に結果セットを示します。

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 句を使って、異なるタイプの料理関係の書籍の価格の合計を計算しています。2 番目の例では、GROUP BY だけを使って同じ集計情報を生成しています。

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

以下に結果セットを示します。

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 を使った 2 番目のクエリを示します。

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

以下に結果セットを示します。

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

(2 row(s) affected)
T.    GROUP BY 句、COMPUTE 句、および ORDER BY 句を含む SELECT を使用する

この例では、今年に入ってからの売り上げがある行のみを返し、type の降順に、平均の書籍の価格および前払い金の合計を計算します。切り詰められたタイトルを含めて 4 列のデータが返されます。選択リストにすべての計算列が指定されています。

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)

以下に結果セットを示します。

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 と共に使用する

ここでは、2 つのプログラム例を示します。最初の例では、CUBE 演算子を使用している SELECT ステートメントから結果セットを返しています。SELECT ステートメントは、本のタイトルと各本の販売数の間に 1 対多の関係を持っています。CUBE 演算子を使用することにより、ステートメントは 1 行余分に返します。

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

以下に結果セットを示します。

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 列のすべての値を表します。結果セットは、各タイトルの販売数とすべてのタイトルの合計販売数を返します。CUBE または ROLLUP 演算子を使用した場合は、同じ結果を返します。

この例では、cube_examples テーブルを使って CUBE 演算子が結果セットにどのように作用するかを示し、また集計関数 SUM を使用しています。cube_examples テーブルには製品名、顧客名、それぞれの顧客による特定の製品の注文数が含まれます。

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)

最初に GROUP BY 句を指定した通常のクエリを実行すると結果セットは次のようになります。

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 句によって結果セットはグループ内にグループを作ります。以下に結果セットを示します。

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 演算子を使った GROUP BY 句を指定したクエリを実行します。結果セットには前の例と同じ情報と 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 演算子の結果セットには上記の単純な GROUP BY の結果セットに、GROUP BY の各列についての特殊集計情報が付加されます。NULL 値は集計が計算された組のすべての列を表します。以下に結果セットを示します。

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)

結果セットの 4 行目は、全顧客による Filo Mix の注文数が 150 であることを示しています。

結果セットの 11 行目は、全顧客による全製品の注文数の合計が 260 であることを示しています。

結果セットの 12 ~ 14 行目は、それぞれの顧客による全製品の注文数がそれぞれ 100、110、50 であることを示しています。

V.    3 つの列を含む結果セットで CUBE を使用する

ここでは、2 つのプログラム例を示します。最初の例では 3 つの列の CUBE 結果セットを生成し、2 番目の例では 4 つの列の CUBE 結果セットを生成しています。

最初の SELECT ステートメントは、出版社名、タイトルおよび販売数を返します。この例の GROUP BY 句には 2 つの列 pub_nametitle が含まれます。publishers titles の間、および titles sales の間に 2 つの 1 対多関係があります。

CUBE 演算子を使用することにより、結果セットに出版社が販売したタイトルの数に関する詳細情報が含まれます。NULL は title 列のすべての値を表します。

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

以下に結果セットを示します。

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 句内の列数を増加すると、CUBE 演算子がなぜ n 次元演算子であるかがわかります。CUBE 演算子を使用しているときに、GROUP BY 句内に 2 つの列があると GROUP BY ではさらに 3 つのグループを追加して返します。列の値がまったく異なる場合は、グループの数が 3 より大きくなることがあります。

結果セットは、出版社名と本のタイトルによりグループ化されます。各出版社による各タイトルの販売数が右端の列に一覧されます。

title 列内の NULL はすべてのタイトルを表します。結果セット内の特定の値とすべての値を識別する方法については、「例 H」を参照してください。CUBE 演算子では 1 つの SELECT ステートメントから以下の情報グループを返します。

  • 各出版社が販売した各タイトルの販売数

  • 各タイトルの販売数

  • 各出版社が販売した各タイトルの数

  • すべての出版社が販売した総タイトル

GROUP BY 句で参照される各列は、GROUP BY 句内のほかのすべての列と相互参照され、SUM 集計が再適用されます。SUM 集計は結果セットにさらに行を追加します。結果セットに返される情報は GROUP BY 句内の列の数にしたがって n 次元まで増加します。

  GROUP BY 句に続く列は、互いに実用的で意味のある関係になるようにしてください。たとえば、au_fnameau_lname が使用されている場合、CUBE 演算子は同じ姓を持つ著者ごとに販売された本の数など、無意味な情報を返すことになります。このような状態で、年間の販売数や四半期の販売数などの実用的な関係に CUBE 演算子を使用しても、結果セットには無意味な行が生成されるだけです。この場合は、ROLLUP 演算子の方が有効です。

2 番目のプログラム例では、GROUP BY 句には CUBE 演算子が相互参照する 3 つの列が含まれています。publishers authorsauthors titlestitles sales の 3 つの 1 対多関係があります。

CUBE 演算子を使用することにより、結果セットに出版社が販売したタイトルの数に関する詳細情報が含まれます。

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 演算子が返す相互参照グループを基に以下の情報を返します。

  • 各出版社が著者ごとに販売した各タイトルの数

  • 各出版社が著者ごとに販売したすべてのタイトルの数

  • 各出版社が販売したすべてのタイトルの数

  • すべての出版社がすべての著者のすべてのタイトルを販売した総合計

  • 各著者ごとにすべての出版社が販売した各タイトルの数

  • 各著者ごとにすべての出版社が販売したすべてのタイトル数

  • すべての著者に対して各出版社が販売した各タイトルの数

  • 各著者ごとにすべての出版社が販売した各タイトルの数

  一部の本は複数の著者の共著なので、すべての出版社、すべてのタイトル、およびすべての著者の特殊集計は総販売数よりも多くなります。

関係の数が多くなると、パターン数も多くなります。レポート内の値と NULL 値のパターンは集計しているグループを示します。GROUPING 関数を使用してグループの情報を明示的に提供できます。

W.    GROUPING 関数を CUBE と共に使用する

この例では、SELECT ステートメントが SUM 集計、GROUP BY 句、および CUBE 演算子を使用する方法を示しています。さらに GROUP BY 句に続く 2 つの列に GROUPING 関数を使用しています。

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

結果セットには GROUPING(pub_name) 式と GROUPING(title) 式が作成した 0 と 1 の値を持つ 2 つの列があります。

以下に結果セットを示します。

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 演算子の使用

ここでは、2 つのプログラム例を示します。最初の例では、製品名、顧客名、合計注文数を取得し、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

以下に結果セットを示します。

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)

この 2 番目の例では、企業列と部門列で ROLLUP 演算を実行し、従業員の総数を求めています。

ROLLUP 演算子は集計の総計を計算します。この演算子は、総計情報が必要だが、完全な CUBE 演算では余分なデータが得られたり、集合の中に集合が含まれる場合に効果的です。たとえば、集合内の集合として、企業内の部門などが考えられます。

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 計算処理のほかに、会社名、部門、会社の全従業員数が結果セットの一部に含まれます。

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

以下に結果セットを示します。

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 関数の使用

この例では、cube_examples テーブルに新しく 3 行を追加します。3 行それぞれが、1 つ以上の列に NULL を記録し、ROLLUP 関数だけがグループ化列に 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 関数を使用できるのは、CUBE または ROLLUP と併用する場合だけです。列値が NULL であり、すべての値のセットを表しているので、式の値が NULL になるときには、GROUPING 関数は 1 を返します。該当する列が NULL であるかどうかにかかわらず、構文値として CUBE または ROLLUP オプションで生成されたものでない場合、GROUPING 関数は 0 を返します。返される値のデータ型は tinyint 型です。

以下に結果セットを示します。

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、集計関数、および ROLLUP と共に使用する

この例では、集計関数および pub_nameau_lnametitle の順に並べられている GROUP BY 句を含む SELECT クエリを使用しています。

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 演算子を使用することにより、列のリストを左から右に移動して以下のグループが作成されます。

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 ステートメントを使用すると、ステートメントは 1 つのグループを作成します。クエリは、pub_nameau_lnametitle の一意な組み合せの合計値を返します。

pub_name       au_lname       title   SUM(qty)

これらの例を同じクエリで CUBE 演算子を使用して作成されたグループと比較してみます。

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)

グループ化は、結果セットに返される情報と関連しています。結果セット内の NULL は、列内のすべての値を表しています。ROLLUP 演算子は、GROUP BY 句で列 (pub_nameau_lnametitle) がこの順番で並べられているとき以下のデータを返します。

  • 各出版社が著者ごとに販売した各タイトルの数

  • 各出版社が著者ごとに販売したすべてのタイトルの数

  • 各出版社が販売したすべてのタイトルの数

  • すべての出版社がすべての著者のすべてのタイトルを販売した総合計

以下に結果セットを示します。

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 関数は、ROLLUP 演算子、または CUBE 演算子と併用できます。この関数を、選択リスト内の列の 1 つに適用できます。ROLLUP 演算子によって列がグループ化されたかどうかによって 1 または 0 を返します。

a.    インデックス オプティマイザ ヒントを使用する

この例では、INDEX オプティマイザ ヒントの使用方法を 2 とおり示します。最初の例では、オプティマイザで非クラスタ化インデックスを使用し、テーブルから行を取得しています。2 番目の例では、index = 0 を使ってテーブル スキャンを実行しています。

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

以下に結果セットを示します。

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 ヒントを使用する

この例では、OPTION (GROUP) 句を GROUP BY 句と併せて使用する方法を示します。

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 を使用する

この例では、結果セットは Customers および SouthAmericanCustomers テーブルの ContactNameCompanyNameCityPhone の各列のデータで構成されます。

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 句で、Customers および SouthAmericanCustomers テーブルの指定された列のユニオンの最終的な結果セットを CustomerResults という名前のテーブルに格納することを指定します。

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.    ORDER BY 句を指定した 2 つの SELECT ステートメントで UNION 句を使用する

UNION 句で使用するある種のパラメータの順序には重要な意味があります。この例では、出力時に列名を変更する 2 つの 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.    3 つの SELECT ステートメントで UNION を使用して、ALL とかっこの効果を示す

これらの例では、UNION を使用して 3 つのテーブルのクエリ結果を結合します。これらのテーブルはすべて同じ 5 行のデータで構成されます。最初の例では、UNION ALL を使用して、重複するレコードも含めて 15 行すべてを返します。2 番目の例では、ALL を指定せずに UNION を使用して、3 つの SELECT ステートメントの結果を結合したものから重複する行を削除し、5 行を返します。

最後の例では、最初の UNION で ALL を使用し、2 番目の UNION では ALL を使用せずにかっこを使用します。2 番目の UNION はかっこで囲まれているので、最初に処理されます。また、ALL オプションを使用せずに重複を削除するので、5 行を返します。これらの 5 行は、UNION ALL キーワードにより最初の SELECT ステートメントの結果に結合されます。また、UNION ALL キーワードが指定されているので、重複する 2 組の 5 行は削除されません。最終的な結果は 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

関連項目

CREATE TRIGGER

CREATE VIEW

DELETE

EXECUTE

Expressions (式)

INSERT

LIKE

sp_dboption

UNION

UPDATE

WHERE

表示: