内部結合

内部結合はそれぞれのテーブルの指定した列の値が一致するデータだけを取得します。基本となる構文は次の通りです。

SELECT テーブル名.カラム名, ... FROM テーブル名1
 INNER JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2;

結合の対象となるテーブルをFROMの後とINNER JOINの後に指定します。そしてONの後に結合するカラムをイコール(=)で結んで指定します。

内部結合ではテーブルとテーブルを結合した結果を取得します。結合はそれぞれのテーブルの指定したカラムの値が同じものを1つのデータとして取得します。2つのテーブルで同じ値が存在しないデータは取得されません。

テーブルの結合

具体的な例で見てみます。次のような2つのテーブルを用意しました。

goods :

codecateidname
B00111Q84
D0012ドロップ
B0021植物図鑑
F0014抹茶ロール
D0022ポニョ
B0031武士道
S0015ワープロ
F0024栗きんとん

cate :

idname
1和書
2DVD
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.codegoods.cateidgoods.namecate.idcate.name
B00111Q841和書

同じように「goods」テーブルのデータを順に結合を行っていきます。もし「goods」テーブルの「cateid」カラムの値が「cate」テーブルの「id」カラムの値の中に一致するものがなかった場合はデータを取得しません。今回の場合であれば「cateid」カラムの値が5のデータは「cate」テーブルの「id」カラムの中に一致するものありませんので取得されません。

結果的に次のようなデータが取得されます。

goods.codegoods.cateidgoods.namecate.idcate.name
B00111Q841和書
D0012ドロップ2DVD
B0021植物図鑑1和書
F0014抹茶ロール4食品
D0022ポニョ2DVD
B0031武士道1和書
F0024栗きんとん4食品

結合されたデータには各テーブルに存在していたカラムが全て含まれることになります。

複数のデータでカラムの値が一致する場合

では同じテーブルを対象にした内部結合であってもテーブルの指定を入れ替えてデータを取得してみます。

select * from cate inner join goods on goods.cateid = cate.id;

データの取得は次のように行われます。まず「cate」テーブルの最初のデータの「id」カラムの値に対して、「goods」テーブルの「cateid」カラムの中に同じ値があるかどうかを調べます。存在した場合は「goods」テーブルのデータと「cate」テーブルの一致したデータと結合させてまとめて一つのデータとして取得します。

先ほどの場合と異なり、「cate」テーブルの最初のデータの「id」カラムの値に一致するデータが「goods」テーブルには3つ含まれています。この場合、それぞれのデータに対して結合が行われます。

cate.idcate.namegoods.codegoods.cateidgoods.name
1和書B00111Q84
1和書B0021植物図鑑
1和書B0031武士道

同じように「goods」テーブルのデータを順に結合を行っていきます。もし「cate」テーブルの「id」カラムの値が「goods」テーブルの「cateid」カラムの値の中に一致するものがなかった場合はデータを取得しません。今回の場合であれば「id」カラムの値が3のデータは「goods」テーブルの「cateid」カラムの中に一致するものありませんので取得されません。

結果的に次のようなデータが取得されます。

cate.idcate.namegoods.codegoods.cateidgoods.name
1和書B00111Q84
1和書B0021植物図鑑
1和書B0031武士道
2DVDD0012ドロップ
2DVDD0022ポニョ
4食品F0014抹茶ロール
4食品F0024栗きんとん

カラムの値が一致するデータが複数あった場合は、全ての組み合わせで結合を行いそれぞれデータとして取得する点に注意して下さい。

取得するカラムの指定方法

結合された全データの中で、どのカラムを取得するかは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」と指定する必要があります。

サンプル

では実際に試してみます。

次のようなテーブルを対象とします。

p1-1

p1-2

「goods」テーブルの「cateid」カラムと「cate」テーブルの「id」カラムを内部結合してデータを取得します。

select * from goods inner join cate on goods.cateid = cate.id;

p1-3

必要なカラムだけを指定してデータを取得します。

select goods.code, goods.name, cate.name as category from goods
 inner join cate on goods.cateid = cate.id;

p1-4