テーブル結合
SQLでは、「join」を使用しテーブルを結合して表示させることができます。以下の2つの表を用いて3つの種類を説明していきます。
「商品」表
| 商品コード | 商品名 | 単価 |
|---|---|---|
| 101 | メロン | 800 |
| 102 | いちご | 150 |
| 103 | りんご | 120 |
| 104 | レモン | 200 |
| 555 | なし | 555 |
「売上明細」表
| 報告書コード | 商品コード | 個数 |
|---|---|---|
| 1101 | 101 | 1100 |
| 1101 | 102 | 300 |
| 1102 | 103 | 1700 |
| 1103 | 104 | 500 |
| 1104 | 101 | 2500 |
| 1105 | 103 | 2000 |
| 1105 | 104 | 700 |
| 9999 | 999 | 999 |
内部結合 (inner join)
inner joinは、それぞれのテーブルの指定したカラムの値が一致するものだけを結合します。
SELECT * FROM 商品 INNER JOIN 売上明細 ON 商品 . 商品コード = 売上明細 . 商品コード ;
| 商品コード | 商品名 | 単価 | 報告書コード | 商品コード | 個数 |
|---|---|---|---|---|---|
| 101 | メロン | 800 | 1101 | 101 | 1100 |
| 102 | いちご | 150 | 1101 | 102 | 300 |
| 103 | りんご | 120 | 1102 | 103 | 1700 |
| 104 | レモン | 200 | 1103 | 104 | 500 |
| 101 | メロン | 800 | 1104 | 101 | 2500 |
| 103 | りんご | 120 | 1105 | 103 | 200 |
| 104 | レモン | 200 | 1105 | 104 | 700 |
「商品」表の商品コード[ 555 ]、「売上明細」表の商品コード[ 999 ]はそれぞれお互いの表に存在していないので、削除されています。
内部結合の場合、ベースとなるテーブルから、条件にマッチするレコードがないものは削除されるのです。
左外部結合 (left join)
left joinでは、左側のテーブルを基準にして外部結合します。以下の場合、「商品」表が基準となります。
SELECT * FROM 商品 LEFT JOIN 売上明細 ON 商品 . 商品コード = 売上明細 . 商品コード;
| 商品コード | 商品名 | 単価 | 報告書コード | 商品コード | 個数 |
|---|---|---|---|---|---|
| 101 | メロン | 800 | 1104 | 101 | 2500 |
| 101 | メロン | 800 | 1101 | 101 | 2500 |
| 102 | いちご | 150 | 1101 | 102 | 300 |
| 103 | りんご | 120 | 1105 | 103 | 2000 |
| 103 | りんご | 120 | 1102 | 103 | 1700 |
| 104 | レモン | 200 | 1105 | 104 | 700 |
| 104 | レモン | 200 | 1103 | 104 | 500 |
| 555 | なし | 555 | NULL | NULL | NULL |
内部結合の際は一致するデータが無かったため削除されていた[ なし ]が、外部結合の場合はデータとして残っています。
また、左の「商品」表が基準となっているため、並び順も「商品」表の商品コードがベースになっています。
右外部結合 (right join)
right joinでは、右側のテーブルを基準にして外部結合します。以下の場合、「売上明細」表が基準となります。
SELECT * FROM 商品 RIGHT JOIN 売上明細 ON 商品 . 商品コード = 売上明細 . 商品コード;
| 商品コード | 商品名 | 単価 | 報告書コード | 商品コード | 個数 |
|---|---|---|---|---|---|
| 101 | メロン | 800 | 1101 | 101 | 1100 |
| 102 | いちご | 150 | 1101 | 102 | 300 |
| 103 | りんご | 120 | 1102 | 103 | 1700 |
| 104 | レモン | 200 | 1103 | 104 | 500 |
| 101 | メロン | 800 | 1104 | 101 | 2500 |
| 103 | りんご | 120 | 1105 | 103 | 2000 |
| 104 | レモン | 200 | 1105 | 104 | 700 |
| NULL | NULL | NULL | 9999 | 999 | 9999 |
右側の「売上明細」が基準となるため、「売上明細」の全件は漏れなく取得されます。
そして、それに対応するデータを「商品」表から探した結果、このような形となりました。
練習問題
上記の「商品」表と「売上明細」表を使用し、質問を作成してください。
問1: 「商品」表を基準に左外部結合をして、売上明細データを表示してください。
問2: 「売上明細」表を基準に右外部結合をして、単価が150以上の果物の売上明細を表示してください。
問3: 内部結合をして、個数が1000以上の全データを表示してください。
