「テーブルの集合」の版間の差分
(ページの作成:「== 概要 == SQL Serverでは、複数のSELECT文の結果を、統合(和集合)、重複(積集合)を抽出、差(差集合)を抽出することができる。<br> *…」) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
51行目: | 51行目: | ||
テーブルは2つだけでなく、複数のテーブルを統合できる。<br> | テーブルは2つだけでなく、複数のテーブルを統合できる。<br> | ||
注意点としては、テーブルのカラムは同じ数であること。<br> | 注意点としては、テーブルのカラムは同じ数であること。<br> | ||
< | <syntaxhighlight lang="sql"> | ||
--野球部とサッカー部のメンバー全員を取得する | --野球部とサッカー部のメンバー全員を取得する | ||
SELECT studentno, name FROM act_baseball | SELECT studentno, name FROM act_baseball | ||
88行目: | 88行目: | ||
このように、重複をそのまま取得したい場合はUNION ALL句、重複を排除したい場合はUNION句を使用する。 | このように、重複をそのまま取得したい場合はUNION ALL句、重複を排除したい場合はUNION句を使用する。 | ||
< | <syntaxhighlight lang="sql"> | ||
--野球部とサッカー部のメンバー全員を取得する | --野球部とサッカー部のメンバー全員を取得する | ||
SELECT studentno,name FROM act_baseball | SELECT studentno,name FROM act_baseball | ||
124行目: | 124行目: | ||
テーブルは2つだけでなく、INTERSECT句でそれ以上のテーブルの重複レコードを取得できる。<br> | テーブルは2つだけでなく、INTERSECT句でそれ以上のテーブルの重複レコードを取得できる。<br> | ||
注意点としては、テーブルの列は同じ数でないといけない。<br> | 注意点としては、テーブルの列は同じ数でないといけない。<br> | ||
< | <syntaxhighlight lang="sql"> | ||
--野球部とサッカー部の両方に所属しているメンバーを取得する | --野球部とサッカー部の両方に所属しているメンバーを取得する | ||
SELECT studentno,name FROM act_baseball | SELECT studentno,name FROM act_baseball | ||
151行目: | 151行目: | ||
注意点としては、テーブルの列は同じ数でないといけない。<br> | 注意点としては、テーブルの列は同じ数でないといけない。<br> | ||
ここでは、1つ目のSELECT文がstudentnoカラムとnameカラムの2列なので、それ以降のSELECT文も2列である必要がある。<br> | ここでは、1つ目のSELECT文がstudentnoカラムとnameカラムの2列なので、それ以降のSELECT文も2列である必要がある。<br> | ||
< | <syntaxhighlight lang="sql"> | ||
--野球部にだけ所属しサッカー部には所属していないメンバーを取得する | --野球部にだけ所属しサッカー部には所属していないメンバーを取得する | ||
SELECT studentno, name FROM act_baseball | SELECT studentno, name FROM act_baseball |
2021年11月24日 (水) 18:06時点における版
概要
SQL Serverでは、複数のSELECT文の結果を、統合(和集合)、重複(積集合)を抽出、差(差集合)を抽出することができる。
- 統合(和集合)
- テーブル1とテーブル2の結果をまとめて検索したい時に、UNION句やUNION ALL句を使用する。
- 重複の抽出(積集合)
- テーブル1とテーブル2の両方に重複しているレコードを検索したい時に、INTERSECT句を使用する。
(重複レコードの抽出)
- テーブル1とテーブル2の両方に重複しているレコードを検索したい時に、INTERSECT句を使用する。
- 差(差集合)
- テーブル1とテーブル2があり、テーブル1だけに存在するレコードを検索したい時に、EXCEPT句を使用する。
(特定テーブルだけに存在するレコードの抽出)
- テーブル1とテーブル2があり、テーブル1だけに存在するレコードを検索したい時に、EXCEPT句を使用する。
サンプルデータ
act_baseballテーブル
no | name |
---|---|
15 | 佐藤太郎 |
20 | 山田一郎 |
44 | 田中花子 |
act_soccerテーブル
no | name |
---|---|
8 | 伊藤一 |
10 | 加藤和也 |
44 | 田中花子 |
UNION句
複数のSELECT結果を統合する。
重複レコードは1行にまとめられる。
例 UNION句で2つのテーブルを検索する
UNION句を使用することで、別テーブル同士のSELECT文の結果をまとめて表示することができる。
以下の例では、野球部とサッカー部に所属しているメンバーを全てすべて取得する。
テーブルは2つだけでなく、複数のテーブルを統合できる。
注意点としては、テーブルのカラムは同じ数であること。
<syntaxhighlight lang="sql"> --野球部とサッカー部のメンバー全員を取得する SELECT studentno, name FROM act_baseball UNION SELECT studentno, name FROM act_soccer order by 1; </source>
結果
no | name |
---|---|
8 | 伊藤一 |
10 | 加藤和也 |
15 | 佐藤太郎 |
20 | 山田一郎 |
44 | 田中花子 |
UNION ALL句
複数のSELECT結果を統合する。
重複レコードはそのまま検索される。
例 UNION ALL句で2つのテーブルを検索する
UNION ALL句を使用すると、重複レコードも含めて表示することができる。 以下の例では、野球部とサッカー部に所属しているメンバーを全て取得するが、 野球部とサッカー部の両方に所属している"44, 田中花子"が2件取得される。
このように、重複をそのまま取得したい場合はUNION ALL句、重複を排除したい場合はUNION句を使用する。
<syntaxhighlight lang="sql"> --野球部とサッカー部のメンバー全員を取得する SELECT studentno,name FROM act_baseball UNION ALL SELECT studentno,name FROM act_soccer order by 1; </source>
結果
no | name |
---|---|
8 | 伊藤一 |
10 | 加藤和也 |
15 | 佐藤太郎 |
20 | 山田一郎 |
44 | 田中花子 |
44 | 田中花子 |
INTERSECT句
例 INTERSECTで2つのテーブルを検索する
INTERSECT句を使用することで、別テーブル同士のSELECT文の結果の重複レコードを取得することができる。
以下の例では、野球部とサッカー部の両方に所属しているメンバーを取得する。
テーブルは2つだけでなく、INTERSECT句でそれ以上のテーブルの重複レコードを取得できる。
注意点としては、テーブルの列は同じ数でないといけない。
<syntaxhighlight lang="sql"> --野球部とサッカー部の両方に所属しているメンバーを取得する SELECT studentno,name FROM act_baseball INTERSECT SELECT studentno,name FROM act_soccer order by 1; </source>
結果
no | name |
---|---|
44 | 田中花子 |
EXCEPT句
例 EXCEPT句で2つのテーブルの差を検索する
EXCEPT句を使用することで、複数テーブル同士のSELECT文の結果の差を取得することができる。
以下の例では、野球部に所属しサッカー部に所属していないメンバー、つまり野球部だけに所属しているメンバーを取得する。
EXCEPT句で差を抽出するテーブルは、2つだけでなくそれ以上でも差を取得できる。
注意点としては、テーブルの列は同じ数でないといけない。
ここでは、1つ目のSELECT文がstudentnoカラムとnameカラムの2列なので、それ以降のSELECT文も2列である必要がある。
<syntaxhighlight lang="sql"> --野球部にだけ所属しサッカー部には所属していないメンバーを取得する SELECT studentno, name FROM act_baseball EXCEPT SELECT studentno, name FROM act_soccer order by 1; </source>
結果
no | name |
---|---|
15 | 佐藤太郎 |
20 | 山田一郎 |