技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

情報処理技術者試験対策「SQL(テーブル結合)」

今回はSQL文のテーブル結合について、例を出して簡単にまとめます。
 
情報処理技術者試験で出題されるのもありますが、内部結合と左外部結合は実務でも頻出です。
プログラムを作る時に必要になるだけでなく、テストデータを確認する時に使用することもありますし、障害対応で時間が限られている時にアドリブで打つこともあります。
慣れておいて損はない文法なので、開発作業で使う機会があれば積極的に使うことを勧めます。
 
以下では、結合の種類について簡単に書いた後、結合例を記載します。
 
【結合の種類】
結合には下記の四種類があります。
 
・内部結合
 JOIN句の左側のテーブルと右側のテーブルについて、
 結合条件に合致するレコードのみ出力する。
 
・左外部結合
 JOIN句の左側のテーブルについては、
 結合条件に合致するレコードのみでなく、
 結合条件に合致しないレコードも出力する。
 結合条件に合致しないレコードについては、
 右側のテーブルの項目は全項目NULLとする。
 
・右外部結合
 JOIN句の左側のテーブルについては、
 結合条件に合致するレコードのみでなく、
 結合条件に合致しないレコードも出力する。
 結合条件に合致しないレコードについては、
 左側のテーブルの項目は全項目NULLとする。
 
・完全外部結合
 JOIN句の左側のテーブルと右側のテーブルについて、
 結合条件に合致するレコードのみでなく、
 結合条件に合致しないレコードも出力する。
 結合条件に合致しないレコードについては、
 片方のテーブルの項目は全項目NULLとする。
 
【対象テーブル例】
・子会社A取扱商品
  +--------+----------+
  | 商品ID | 商品名   |
  +--------+----------+
  | 1      | 商品A1 |
  | 2      | 商品A2 |
  | 3      | 商品A3 |
  +--------+----------+
・子会社B取扱商品
  +--------+----------+
  | 商品ID | 商品名   |
  +--------+----------+
  | 1      | 商品B1 |
  | 2      | 商品B2 |
  | 4      | 商品B4 |
  +--------+----------+
   ※両テーブル共に商品IDは主キー
 
【結合例】
※「AS」「INNER」「OUTER」は省略可能
※「AS」でテーブル別名を使用しない場合は、
 正式なテーブル名をカラム名の前につけて参照する
※ON句の代わりにWHERE句で結合条件を指定することも可能
 
・内部結合
  SELECT     A.商品ID,
             A.商品名 AS A社商品名,
             B.商品名 AS B社商品名
  FROM       子会社A取扱商品 AS A
  INNER JOIN 子会社B取扱商品 AS B
  ON         A.商品ID = B.商品ID;
  ORDER BY   A.商品ID;
  ↓
  +--------+-----------+-----------+
  | 商品ID | A社商品名 | B社商品名 |
  +--------+-----------+-----------+
  | 1      | 商品A1  | 商品B1  |
  | 2      | 商品A2  | 商品B2  |
  +--------+-----------+-----------+
 
・左外部結合
  SELECT          A.商品ID,
                  A.商品名 AS A社商品名,
                  B.商品名 AS B社商品名
  FROM            子会社A取扱商品 AS A
  LEFT OUTER JOIN 子会社B取扱商品 AS B
  ON              A.商品ID = B.商品ID;
  ORDER BY        A.商品ID;
  ↓
  +--------+-----------+-----------+
  | 商品ID | A社商品名 | B社商品名 |
  +--------+-----------+-----------+
  | 1      | 商品A1  | 商品B1  |
  | 2      | 商品A2  | 商品B2  |
  | 3      | 商品A3  | NULL      |
  +--------+-----------+-----------+
 
・右外部結合
  SELECT           B.商品ID,
                   A.商品名 AS A社商品名,
                   B.商品名 AS B社商品名
  FROM             子会社A取扱商品 AS A
  RIGHT OUTER JOIN 子会社B取扱商品 AS B
  ON               A.商品ID = B.商品ID;
  ORDER BY         B.商品ID;
  ↓
  +--------+-----------+-----------+
  | 商品ID | A社商品名 | B社商品名 |
  +--------+-----------+-----------+
  | 1      | 商品A1  | 商品B1  |
  | 2      | 商品A2  | 商品B2  |
  | 4      | NULL      | 商品B4  |
  +--------+-----------+-----------+
 
・完全外部結合
  SELECT          A.商品ID AS A社商品ID,
                  A.商品名 AS A社商品名,
                  B.商品ID AS B社商品ID,
                  B.商品名 AS B社商品名
  FROM            子会社A取扱商品 AS A
  FULL OUTER JOIN 子会社B取扱商品 AS B
  ON              A.商品ID = B.商品ID;
  ORDER BY        A.商品ID,B.商品ID;
  ↓
  +-----------+-----------+-----------+-----------+
  | A社商品ID | A社商品名 | B社商品ID | B社商品名 |
  +-----------+-----------+-----------+-----------+
  | 1         | 商品A1  | 1         | 商品B1  |
  | 2         | 商品A2  | 2         | 商品B2  |
  | 3         | 商品A3  | NULL      | NULL      |
  | NULL      | NULL      | 4         | 商品B4  |
  +-----------+-----------+-----------+-----------+ 
---------------------
なお、これは実務上の話ですが、外部結合は存在チェックに使うこともあります。
結合条件に主キーを指定した場合、結合条件に合致しないケース以外で主キー項目がNULLになることはないので、主キー項目がNULLなら存在しない、NULLでなければ存在する、と判定することができます。
教科書的には存在チェックは副問い合わせ(IN句)やEXISTS句で行うのですが、外部結合を使うと他テーブルの情報を取得しつつ存在チェックも同時に行えるので、取得結果を一つにまとめたい時やCURSOR文で順次回していく時等に効果を発揮します。
 
もちろん、これだけを覚えれば良いというわけでなく、プログラムの可読性を考えると本当に存在チェックだけをしたい時は副問い合わせ(IN句)やEXISTS句を使うべきですし、性能要件がシビアな時もどれを採用するのがベストか調査・検討する必要があります。
---------------------
2018/09/18 追記
直積結合を挙げ忘れました…。
実務ではまず見かけないと思う(少なくとも私は見かけたことがない)のですが、何故か情報処理技術者試験では出ることがあります。
 
内容についてはこちらのページがわかりやすいので、リンクを貼ってお茶を濁します。
 
直積結合とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

https://wa3.i-3-i.info/word15315.html
---------------------
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM