コンテンツにスキップ

第7章 結合

7.1 クロス結合

単純に2つのテーブルの全ての行の組み合わせを得るにはFROM にテーブル名を2つ書く。

SELECT 列名 FROM テーブル1,テーブル2

例:

SELECT * FROM shouhin,uriage 

この場合、全行の全組み合わせが表示される。 しかし、これは通常は意味が無い。

7.2 WHEREを用いた結合

クロス結合に対し、WHERE を用いて意味がある行だけを絞り込む。

SELECT 列名 FROM テーブル1,テーブル2 WHERE テーブル1.列名 = テーブル2.列名;

例:

SELECT * FROM shouhin,uriage WHERE shouhin.sid = uriage.sid;

両テーブルに同名の sid があるので、単に sid と書くとどちらのテーブルのsidか判断できない。このようなときには テーブル名.列名 のように書く。

行抽出の条件を付けるには AND でつなげる。

例:

SELECT * FROM shouhin,uriage WHERE shouhin.sid = uriage.sid AND uriage.sid=1;

7.3 JOINを用いた結合

WHEREによる結合では指定した条件が結合のための条件か、行抽出のための条件かの区別が付きにくい。 JOIN句を使うと、それをはっきり区別できる。

2つのテーブルをJOIN を用いて結合

SELECT 列名 FROM テーブル1 JOIN テーブル2 ON テーブル1.列名 = テーブル2.列名;

例:

SELECT * FROM shouhin JOIN uriage ON shouhin.sid = uriage.sid;

行抽出の条件はWHERE で付ける

例:

SELECT * FROM shouhin JOIN uriage ON shouhin.sid = uriage.sid WHERE uriage.sid=1;

7.4 外部結合

2つのテーブルをJOIN を用いて結合した際、両方にある行しか出力対象とされない。

片方のテーブルを常に出力する場合、外部結合(OUTER JOIN)を行う。例えば、LEFT OUTER JOIN を行うと右側に書いたテーブルにある行は全て出力される(OUTERは省略可能)。右側のテーブルに対象がない場合、項目は全てNULLとされる。

例:

SELECT * FROM shouhin LEFT JOIN uriage ON shouhin.sid = uriage.sid;

7.5 3つのテーブルの結合

WHEREで3つのテーブルを結合するときには、FROMに全てのテーブル名を書き、WHEREでの条件を2つ書いてANDで結合する。

SELECT * FROM seito,kekka,test
  WHERE  seito.seitoid = kekka.seitoid AND 
  test.tid = kekka.tid

JOINの場合、それぞれのテーブルをJOINで指定する。

SELECT * FROM seito 
JOIN kekka ON seito.seitoid = kekka.seitoid
JOIN test ON test.tid = kekka.tid