6.1 テーブル結合の基本
まずは基本的なテーブル結合の考え方と使用方法を説明します。
6.1.1 内部結合
前章ではリレーショナルデータベースと外部キー制約の概念を解説しましたが、テーブルを分割しただけで実際にデータとして連携して使用できなければ意味がありません。このような場合、SQLを使ってテーブル同士を結合し、擬似的にひとつの表のようにして取り出すことができます。これを表(テーブル)の結合(またはジョイン)といいます。
「bookinfo」と「orderinfo」を例に説明します。前章では表の正規化に触れましたが、テーブルの結合はこの逆をイメージすると分かりやすいでしょう。現在「bookinfo」と「orderinfo」はそれぞれのisbn列で関連付けることができます。つまり「bookinfo」のisbn列と「orderinfo」のisbn列で、同じデータを持つもの同士を結合することができるわけです。 そして結合されたテーブルを、あたかもひとつのテーブルのように扱えるのです。
テーブルの結合にはSELECT文を使います。書式は下記のようになります。
「FROM」句で連携させたいテーブル名1とテーブル名2の名前を「INNER JOIN」で結びます。その後「ON」に続けて、テーブル1のどの列とテーブル2のどの列を基準に結合するかを指定します。「SELECT」句では、表示させたいテーブルの列名を、「テーブル名.列名」という記述で表現します。
「bookinfo」と「orderinfo」を結合して表示してみましょう。
まず、両方のテーブルをisbn列を基準に結合し、全列を表示してみます。
両方のテーブルのデータが結合され、「bookinfo」テーブルのデータが左側に、「orderinfo」テーブルのデータが右側に表示されます。このように、「SELECT」句に列を指定しない場合、左側に「INNER JOIN」で指定したはじめのテーブルの内容が表示され、右側に2番目に指定したテーブルの内容が表示されます。
では、下の表のようなイメージ(列の並び順を変更)で、データを取得してみましょう。
orderno | user | isbn | title | price | quantity | date |
---|---|---|---|---|---|---|
1 | kanda | 00001 | SQL入門テキスト | 1050 | 1 | 2010-07-01 |
5 | kanda | 00002 | SQL基礎テキスト | 2300 | 1 | 2010-08-22 |
これには、「SELECT」句で列の並びを指定する必要があります。
上記のように「テーブル名.列名」のように表記します。
isbn列は「orderinfo」にも「bookinfo」にもありますが、今回の場合はどちらの列を使っても同じデータが取得できるので、どちらを指定しても同じです。例では「bookinfo」のisbn列を使用しています。
この形が基本形ですが、テーブル名に別名をつけることで、SQL文をもう少し短くすることもできます。
この例では、「bookinfo」に「A」、「orderinfo」に「B」という別名を付けています。
今回は「bookinfo」のisbn列と「orderinfo」のisbn列で、データが一致するものだけを結合しました。 このように、結合対象のテーブル同士の結合のキーとなる列で、データが同じものだけを結合することを特に「内部結合(もしくはINNER JOIN)」と呼びます。
TIPS
テーブルを結合する場合の「SELECT」句では、「テーブル名.列名」という指定がルールになっていますが、片方のテーブルにしか存在しない列はテーブル名を省略することができます。
例えば「bookinfo」のtitle列とprice列、「orderinfo」のorderno列・user列・quantity列・date列は片方の列にしか存在しませんので、DML文は下記のように書き換えることができます。