6.1 テーブル結合の基本

まずは基本的なテーブル結合の考え方と使用方法を説明します。

6.1.1 内部結合

前章ではリレーショナルデータベースと外部キー制約の概念を解説しましたが、テーブルを分割しただけで実際にデータとして連携して使用できなければ意味がありません。このような場合、SQLを使ってテーブル同士を結合し、擬似的にひとつの表のようにして取り出すことができます。これを表(テーブル)の結合(またはジョイン)といいます。

「bookinfo」と「orderinfo」を例に説明します。前章では表の正規化に触れましたが、テーブルの結合はこの逆をイメージすると分かりやすいでしょう。現在「bookinfo」と「orderinfo」はそれぞれのisbn列で関連付けることができます。つまり「bookinfo」のisbn列と「orderinfo」のisbn列で、同じデータを持つもの同士を結合することができるわけです。 そして結合されたテーブルを、あたかもひとつのテーブルのように扱えるのです。

テーブルの結合にはSELECT文を使います。書式は下記のようになります。

   SELECT テーブル名1もしくは2.列名,・・・ FROM テーブル名1 INNER JOIN テーブル名2
   ON テーブル名1.列名1 = テーブル名2.列名2;

「FROM」句で連携させたいテーブル名1とテーブル名2の名前を「INNER JOIN」で結びます。その後「ON」に続けて、テーブル1のどの列とテーブル2のどの列を基準に結合するかを指定します。「SELECT」句では、表示させたいテーブルの列名を、「テーブル名.列名」という記述で表現します。

「bookinfo」と「orderinfo」を結合して表示してみましょう。

まず、両方のテーブルをisbn列を基準に結合し、全列を表示してみます。

    SELECT * FROM bookinfo INNER JOIN orderinfo ON bookinfo.isbn=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」句で列の並びを指定する必要があります。

SELECT orderinfo.orderno,orderinfo.user,bookinfo.isbn,bookinfo.title,
bookinfo.price,orderinfo.quantity,orderinfo.date
FROM bookinfo INNER JOIN orderinfo ON bookinfo.isbn=orderinfo.isbn;

上記のように「テーブル名.列名」のように表記します。
isbn列は「orderinfo」にも「bookinfo」にもありますが、今回の場合はどちらの列を使っても同じデータが取得できるので、どちらを指定しても同じです。例では「bookinfo」のisbn列を使用しています。

この形が基本形ですが、テーブル名に別名をつけることで、SQL文をもう少し短くすることもできます。

SELECT B.orderno,B.user,A.isbn,A.title,A.price,B.quantity,B.date
FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn;

この例では、「bookinfo」に「A」、「orderinfo」に「B」という別名を付けています。

今回は「bookinfo」のisbn列と「orderinfo」のisbn列で、データが一致するものだけを結合しました。 このように、結合対象のテーブル同士の結合のキーとなる列で、データが同じものだけを結合することを特に「内部結合(もしくはINNER JOIN)」と呼びます。

TIPS
テーブルを結合する場合の「SELECT」句では、「テーブル名.列名」という指定がルールになっていますが、片方のテーブルにしか存在しない列はテーブル名を省略することができます。
例えば「bookinfo」のtitle列とprice列、「orderinfo」のorderno列・user列・quantity列・date列は片方の列にしか存在しませんので、DML文は下記のように書き換えることができます。

SELECT orderno,user,A.isbn,title,price,quantity,date
FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn;