テーブルを結合する - JOINを利用したテーブル結合 - SQL

SQLでテーブルを結合する方法を紹介します。

概要

SQLでテーブルを結合する場合には、JOIN 句を利用します。

書式

SELECT * FROM (テーブル名1) JOIN (テーブル名2) ON (テーブル名1).(フィルド名) = (テーブル名2).(フィルド名) 

例1:inner join

次のテーブルを用意します。
Working テーブル
idnamevaluecategorymemo
1Penguin300B南国にすむペンギンです
2Whale420M北極海のクジラです
3Moffu880NULLよくわからない生き物です
4Camel220M砂漠にすむラクダです
5Owl90B関東のフクロウです
6Duck120Bそこらへんのアヒルです
7Lizard60Rひっそりと生きるトカゲです
WorkingCategory テーブル
idcategorynameflag
1B鳥類1
2B鳥類2
3M哺乳類1
4F魚類1

以下のSQLを実行します。
select * from Working join WorkingCategory on Working.category=WorkingCategory.category;
または、
select * from Working inner join WorkingCategory on Working.category=WorkingCategory.category;

実行すると以下の結果が表示されます。
Workingテーブルのcategoryの値とWorkingCategoryテーブルのcategoryの値を連結して表示します。
Workingテーブルでcategoryの値が"B"の項目はWorkingCategoryテーブルに2つあるため、それぞれの連結した行が結果に表示されます。 Workingテーブルのidの値が1,5,6のコードは2つ表示されることが確認できます。
また、id=7の要素はWorkingCategoryテーブルに対応する値が無いため、結果には表示されません。
idnamevaluecategorymemoidcategorynameflag
1Penguin300B南国にすむペンギンです1B鳥類1
5Owl90B関東のフクロウです1B鳥類1
6Duck120Bそこらへんのアヒルです1B鳥類1
1Penguin300B南国にすむペンギンです2B鳥類2
5Owl90B関東のフクロウです2B鳥類2
6Duck120Bそこらへんのアヒルです2B鳥類2
2Whale420M北極海のクジラです3M哺乳類1
4Camel220M砂漠にすむラクダです3M哺乳類1

例2:left join

先ほどのテーブルで次のSQL文を実行します。
select * from Working left join WorkingCategory on Working.category=WorkingCategory.category;

実行すると以下の結果が表示されます。
inner joinとの違いは、id=3 や id=7 の項目では対応する値がWorkingCategoryテーブルには存在しませんが、値がNULLとして結果のセットには含まれます。
idnamevaluecategorymemoidcategorynameflag
1Penguin300B南国にすむペンギンです1B鳥類1
1Penguin300B南国にすむペンギンです2B鳥類2
2Whale420M北極海のクジラです3M哺乳類1
3Moffu880NULLよくわからない生き物ですNULLNULLNULLNULL
4Camel220M砂漠にすむラクダです3M哺乳類1
5Owl90B関東のフクロウです1B鳥類1
5Owl90B関東のフクロウです2B鳥類2
6Duck120Bそこらへんのアヒルです1B鳥類1
6Duck120Bそこらへんのアヒルです2B鳥類2
7Lizard60Rひっそりと生きるトカゲですNULLNULLNULLNULL

例3:right join

先ほどのテーブルで次のSQL文を実行します。
select * from Working right join WorkingCategory on Working.category=WorkingCategory.category;

実行すると以下の結果が表示されます。
inner joinとの違いは、id=3 や id=7 の項目では対応する値がWorkingCategoryテーブルには存在しないため、結果セットには含まれません、 一方、WorkingCategoryテーブルのid=3の項目はWorkingテーブルに対応する値が存在しませんが、値がNULLとして結果のセットには含まれます。
idnamevaluecategorymemoidcategorynameflag
1Penguin300B南国にすむペンギンです1B鳥類1
5Owl90B関東のフクロウです1B鳥類1
6Duck120Bそこらへんのアヒルです1B鳥類1
1Penguin300B南国にすむペンギンです2B鳥類2
5Owl90B関東のフクロウです2B鳥類2
6Duck120Bそこらへんのアヒルです2B鳥類2
2Whale420M北極海のクジラです3M哺乳類1
4Camel220M砂漠にすむラクダです3M哺乳類1
NULLNULLNULLNULLNULL4F魚類1

例4:full join

先のテーブルで次のSQL文を実行します。
select * from Working full join WorkingCategory on Working.category=WorkingCategory.category;

実行すると以下の結果が表示されます。
id=3 や id=7 の項目では対応する値がWorkingCategoryテーブルには存在しませんが、値がNULLとして結果のセットには含まれます。
また、WorkingCategoryテーブルのid=3の項目はWorkingテーブルに対応する値が存在しませんが、値がNULLとして結果のセットには含まれます。
idnamevaluecategorymemoidcategorynameflag
1Penguin300B南国にすむペンギンです1B鳥類1
1Penguin300B南国にすむペンギンです2B鳥類2
2Whale420M北極海のクジラです3M哺乳類1
3Moffu880NULLよくわからない生き物ですNULLNULLNULLNULL
4Camel220M砂漠にすむラクダです3M哺乳類1
5Owl90B関東のフクロウです1B鳥類1
5Owl90B関東のフクロウです2B鳥類2
6Duck120Bそこらへんのアヒルです1B鳥類1
6Duck120Bそこらへんのアヒルです2B鳥類2
7Lizard60Rひっそりと生きるトカゲですNULLNULLNULLNULL
NULLNULLNULLNULLNULL4F魚類1

例5:cross join

先のテーブルで次のSQL文を実行します。
select * from Working CROSS join WorkingCategory;

実行すると以下の結果が表示されます。
Working テーブルと WorkingCategory テーブルのすべての組み合わせが列挙されます。
idnamevaluecategorymemoidcategorynameflag
1Penguin300B南国にすむペンギンです1B鳥類1
2Whale420M北極海のクジラです1B鳥類1
3Moffu880NULLよくわからない生き物です1B鳥類1
4Camel220M砂漠にすむラクダです1B鳥類1
5Owl90B関東のフクロウです1B鳥類1
6Duck120Bそこらへんのアヒルです1B鳥類1
7Lizard60Rひっそりと生きるトカゲです1B鳥類1
1Penguin300B南国にすむペンギンです2B鳥類2
2Whale420M北極海のクジラです2B鳥類2
3Moffu880NULLよくわからない生き物です2B鳥類2
4Camel220M砂漠にすむラクダです2B鳥類2
5Owl90B関東のフクロウです2B鳥類2
6Duck120Bそこらへんのアヒルです2B鳥類2
7Lizard60Rひっそりと生きるトカゲです2B鳥類2
1Penguin300B南国にすむペンギンです3M哺乳類1
2Whale420M北極海のクジラです3M哺乳類1
3Moffu880NULLよくわからない生き物です3M哺乳類1
4Camel220M砂漠にすむラクダです3M哺乳類1
5Owl90B関東のフクロウです3M哺乳類1
6Duck120Bそこらへんのアヒルです3M哺乳類1
7Lizard60Rひっそりと生きるトカゲです3M哺乳類1
1Penguin300B南国にすむペンギンです4F魚類1
2Whale420M北極海のクジラです4F魚類1
3Moffu880NULLよくわからない生き物です4F魚類1
4Camel220M砂漠にすむラクダです4F魚類1
5Owl90B関東のフクロウです4F魚類1
6Duck120Bそこらへんのアヒルです4F魚類1
7Lizard60Rひっそりと生きるトカゲです4F魚類1

inner join と left join の違い

inner joinはjoin先のテーブルに対応する値がないとレコードは選択されません。一方、left joinはjoin先のテーブルに対応する値がない場合でもNULLとして結果に選択されます。

inner join と right join の違い

right join はjoin先のテーブルにレコードがあり、対応するレコードが元のテーブルに無い場合にNULLの値として結果に選択されます。

inner join と full join の違い

full join は left join と right join 両方を足した結果となり、元のテーブルにレコードがあり、join先のテーブルに無いレコード、 元のテーブルにレコードはなく、join先のテーブルにレコードがある両方が選択されます。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2022-11-06
iPentec all rights reserverd.