内部結合
内部結合はそれぞれのテーブルの指定した列の値が一致するデータだけを取得します。基本となる構文は次の通りです。
SELECT テーブル名.カラム名, ... FROM テーブル名1 INNER JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2;
結合の対象となるテーブルをFROMの後とINNER JOINの後に指定します。そしてONの後に結合するカラムをイコール(=)で結んで指定します。
内部結合ではテーブルとテーブルを結合した結果を取得します。結合はそれぞれのテーブルの指定したカラムの値が同じものを1つのデータとして取得します。2つのテーブルで同じ値が存在しないデータは取得されません。
テーブルの結合
具体的な例で見てみます。次のような2つのテーブルを用意しました。
goods :
| code | cateid | name |
|---|---|---|
| B001 | 1 | 1Q84 |
| D001 | 2 | ドロップ |
| B002 | 1 | 植物図鑑 |
| F001 | 4 | 抹茶ロール |
| D002 | 2 | ポニョ |
| B003 | 1 | 武士道 |
| S001 | 5 | ワープロ |
| F002 | 4 | 栗きんとん |
cate :
| id | name |
|---|---|
| 1 | 和書 |
| 2 | DVD |
| 3 | スポーツ |
| 4 | 食品 |
内部結合を行うには、2つのテーブルで結合の対象となるカラムを指定します。例えば次のように指定します。
select * from goods inner join cate on goods.cateid = cate.id;
上記の場合、「goods」テーブルの「cateid」カラムと「cate」テーブルの「id」カラムを使って結合します。
データの取得
データの取得は次のように行われます。まず「goods」テーブルの最初のデータの「cateid」カラムの値に対して、「cate」テーブルの「id」カラムの中に同じ値があるかどうかを調べます。存在した場合は「goods」テーブルのデータと「cate」テーブルの一致したデータと結合させてまとめて一つのデータとして取得します。
| goods.code | goods.cateid | goods.name | cate.id | cate.name |
|---|---|---|---|---|
| B001 | 1 | 1Q84 | 1 | 和書 |
同じように「goods」テーブルのデータを順に結合を行っていきます。もし「goods」テーブルの「cateid」カラムの値が「cate」テーブルの「id」カラムの値の中に一致するものがなかった場合はデータを取得しません。今回の場合であれば「cateid」カラムの値が5のデータは「cate」テーブルの「id」カラムの中に一致するものありませんので取得されません。
結果的に次のようなデータが取得されます。
| goods.code | goods.cateid | goods.name | cate.id | cate.name |
|---|---|---|---|---|
| B001 | 1 | 1Q84 | 1 | 和書 |
| D001 | 2 | ドロップ | 2 | DVD |
| B002 | 1 | 植物図鑑 | 1 | 和書 |
| F001 | 4 | 抹茶ロール | 4 | 食品 |
| D002 | 2 | ポニョ | 2 | DVD |
| B003 | 1 | 武士道 | 1 | 和書 |
| F002 | 4 | 栗きんとん | 4 | 食品 |
結合されたデータには各テーブルに存在していたカラムが全て含まれることになります。
複数のデータでカラムの値が一致する場合
では同じテーブルを対象にした内部結合であってもテーブルの指定を入れ替えてデータを取得してみます。
select * from cate inner join goods on goods.cateid = cate.id;
データの取得は次のように行われます。まず「cate」テーブルの最初のデータの「id」カラムの値に対して、「goods」テーブルの「cateid」カラムの中に同じ値があるかどうかを調べます。存在した場合は「goods」テーブルのデータと「cate」テーブルの一致したデータと結合させてまとめて一つのデータとして取得します。
先ほどの場合と異なり、「cate」テーブルの最初のデータの「id」カラムの値に一致するデータが「goods」テーブルには3つ含まれています。この場合、それぞれのデータに対して結合が行われます。
| cate.id | cate.name | goods.code | goods.cateid | goods.name |
|---|---|---|---|---|
| 1 | 和書 | B001 | 1 | 1Q84 |
| 1 | 和書 | B002 | 1 | 植物図鑑 |
| 1 | 和書 | B003 | 1 | 武士道 |
同じように「goods」テーブルのデータを順に結合を行っていきます。もし「cate」テーブルの「id」カラムの値が「goods」テーブルの「cateid」カラムの値の中に一致するものがなかった場合はデータを取得しません。今回の場合であれば「id」カラムの値が3のデータは「goods」テーブルの「cateid」カラムの中に一致するものありませんので取得されません。
結果的に次のようなデータが取得されます。
| cate.id | cate.name | goods.code | goods.cateid | goods.name |
|---|---|---|---|---|
| 1 | 和書 | B001 | 1 | 1Q84 |
| 1 | 和書 | B002 | 1 | 植物図鑑 |
| 1 | 和書 | B003 | 1 | 武士道 |
| 2 | DVD | D001 | 2 | ドロップ |
| 2 | DVD | D002 | 2 | ポニョ |
| 4 | 食品 | F001 | 4 | 抹茶ロール |
| 4 | 食品 | F002 | 4 | 栗きんとん |
カラムの値が一致するデータが複数あった場合は、全ての組み合わせで結合を行いそれぞれデータとして取得する点に注意して下さい。
取得するカラムの指定方法
結合された全データの中で、どのカラムを取得するかはSELECT文の後ろで指定します。カラムは「テーブル名.カラム名」の形式で指定して下さい。例えば「goods」テーブルの「code」カラムと「cate」テーブルの「name」カラムの値を取得するには次のように記述します。
select goods.code, cate.name from goods
inner join cate on goods.cateid = cate.id;
どちらかのテーブルにしか存在しないカラムを指定する場合はテーブル名を省略できます。例えば「goods」テーブルの「code」カラムを取得したい場合、「cate」テーブルには「code」カラムは存在しませんので単に「code」と記載できます。
select code, cate.name from goods
inner join cate on goods.cateid = cate.id;
それに対して「goods」テーブルの「name」カラムを取得したい場合には「cate」テーブルにも「name」カラムが存在するので必ずテーブル名を付けて「goods.name」と指定する必要があります。
サンプル
では実際に試してみます。
次のようなテーブルを対象とします。
「goods」テーブルの「cateid」カラムと「cate」テーブルの「id」カラムを内部結合してデータを取得します。
select * from goods inner join cate on goods.cateid = cate.id;
必要なカラムだけを指定してデータを取得します。
select goods.code, goods.name, cate.name as category from goods inner join cate on goods.cateid = cate.id;