前回は1つのテーブルに対してSelect文を実行するという、基本中の基本について解説しました。
今回は2つ以上のテーブルを結合する Join 文について説明したいと思います。
SQLを試すためのツールは、あらかじめ こちら からダウンロードをお願いします。
テーブル結合(Join)とは
テーブル結合とは、指定した条件で2つ以上のテーブルを連結し、1つのテーブルとして扱う方法のことです。
結合対象のテーブルに共通するカラムに対して、同じ値を持つレコード同士が結合されます。

書き方は次の通りです。
select * from table1 join table2 on 結合条件
結合条件は、前回の記事で説明した where の指定方法と同じですが、どのテーブルのカラム名かを指定する記述が余分に必要となります。
例えば、商品マスタ.商品コード や 商品仕様.商品コード という風に、テーブル名+ピリオド+カラム名で指定します。
これは、多くの場合、結合に使うカラム名が共通であることが理由です。
例えば、商品マスタと商品仕様という2つのテーブルを、「商品コード」で結合したい場合は次の様になります。
では、さっそくツールを使って検証してみましょう。
1 2 |
select * from 商品マスタ join 商品仕様 on 商品マスタ.商品コード = 商品仕様.商品コード |
結果は以下の通りになります。

「商品コード」というカラム名で結合していますので、それぞれのテーブルにある「商品コード」のカラムが表示されるのですが、同じカラム名が重複する場合は自動的に番号が付加するようにツール側で処理していますので、「商品コード1」というカラム名になっています。
テーブル名の省略方法について
結合条件を記述する際、商品マスタ.商品コード = 商品仕様.商品コード などのように毎回テーブル名とカラム名を記述するのは面倒ですよね。
ということで、通常は省略文字を使って記述します。
省略の方法は簡単で、テーブル名を記述する際、空白を開けて任意の名前(1文字でも可)を記述しておくだけです。
例えば、商品マスタは m 、商品仕様は p という名前(文字)に置き換えたい場合は、次の用意に記述します。
1 2 |
select * from 商品マスタ m join 商品仕様 p on m.商品コード = p.商品コード |
もしよければ、ツール上でお試しください。
ちなみに、省略文字を考えるのも面倒と言う場合によく使うのが t に添え字を付ける方法です。
1 2 |
select * from 商品マスタ t1 join 商品仕様 t2 on t1.商品コード = t2.商品コード |
キー項目について
テーブルを結合する際の条件に指定するカラムのことを、キー とか キー項目と呼ぶことが有ります。
基本的に、結合条件に指定するカラムは、型を合わせてあげさえすれば、どのカラムを指定してもOKなのですが、データ量が多いテーブル同士を結合する場合、処理に時間が掛かることがあります。
そこで、通常は検索したいカラムに索引(=インデックス)を作っておくことで、検索の効率化(高速化)を図ります。

この索引(=インデックス)のことを、キーと呼ぶのですが、テーブル結合の条件にもキーを指定する事が多いため、キーとかキー項目という名前も使われています。
テーブル結合(Join)の種類
テーブル結合には、大きく分けて、外部結合、内部結合の2種類があり、結合した結果が異なります。
left join は外部結合とも呼ばれており、一方 inner join は外部結合とも呼ばれています。

ちなみに、先ほどの説明では join の前に left も inner も付けませんでしたが、join だけを指定した場合は 外部結合(left join)の扱いになります。
外部結合(left join)
最も一般的に使われる結合で、次の様に記述します。
select * from テーブル名1 left join テーブル名2 on 結合条件
左側に記述したテーブルを主に、右に書いたテーブルを結合することから、left join という書き方をします。
データベースの種類によっては、 outer join という記述ができるものもあります。
外部結合でテーブルを結合すると、左に書いたテーブルは全レコードが表示されますが、右に書いたテーブルに紐づくレコードが存在しない場合、その部分はNULLになります。

内部結合
内部結合は次の様に記述します。
select * from テーブル名1 left join テーブル名2 on 結合条件
内部結合でテーブルを結合すると、左右両方のテーブルに紐づくレコードのみ表示されるようになります。

抽出条件の指定
テーブル結合した結果に対して、特定の条件で絞り込みたい場合、where 区はどこにかけばいいでしょう?
答えは、全ての join が終わった後に書きます。
例えば、商品マスタと商品仕様を結合し、メーカーが SONY のものだけを抽出したい場合、次の様になります。
1 2 3 |
select * from 商品マスタ m left join 商品仕様 p on m.商品コード = p.商品コード where m.メーカー = 'SONY' |
結果は以下の通りです。

ちなみに、テーブルを結合した結果、カラムが重複しない場合は、テーブル名を省略することができます。
今回の場合、 where m.メーカー = ‘SONY’ の部分から m. を省略できます。
では、折角テーブルを結合したので、結合相手のテーブル(商品仕様)だけに存在するカラムを使って検索してみましょう。
例えば、商品仕様にだけ存在する「幅」が 100~105 の範囲のものだけを抽出する場合、次の様に記述できます。
1 2 3 |
select * from 商品マスタ m left join 商品仕様 p on m.商品コード = p.商品コード where 幅 between 100 and 105 |
結果は次の通りです。

3つのテーブルを結合してみよう
では、最後に3つのテーブルを結合し、指定した条件で絞り込みを行ってみましょう。
ツールの初期データとして用意されているのは、下記の3テーブルであり、それぞれ商品コードが共通ですので、これを使って結合が可能です。

では、売上データを主にして、商品マスタと商品仕様を結合し、製品名に RX の文字が含まれていて、売上日が 2020/07/10 のデータを抽出してみましょう。
1 2 3 4 5 |
select 売上日,t1.商品コード,製品名,メーカー,総画素数,光学ズーム from 売上データ t1 left join 商品マスタ t2 on t2.商品コード = t1.商品コード left join 商品仕様 t3 on t3.商品コード = t1.商品コード where 製品名 like '%RX%' and 売上日 = '2020/07/10' |
答えは次の様になります。

まとめ
今回はテーブル結合について解説しました。
趣味だけでの利用に限定するなら、テーブル結合を避けて通る事はできるかもしれませんが、実務で使う場合は数個のテーブルを結合するケースが多いので、これを知っていると出来る事の幅が広がると思います。
色々と試して理解の手助けになれば幸いです。
コメント