テーブルを結合する - JOINを利用したテーブル結合 - SQL
SQLでテーブルを結合する方法を紹介します。
概要
SQLでテーブルを結合する場合には、JOIN 句を利用します。
書式
SELECT * FROM (テーブル名1) JOIN (テーブル名2) ON (テーブル名1).(フィルド名) = (テーブル名2).(フィルド名)
例1:inner join
次のテーブルを用意します。
Working テーブルid | name | value | category | memo |
1 | Penguin | 300 | B | 南国にすむペンギンです |
2 | Whale | 420 | M | 北極海のクジラです |
3 | Moffu | 880 | NULL | よくわからない生き物です |
4 | Camel | 220 | M | 砂漠にすむラクダです |
5 | Owl | 90 | B | 関東のフクロウです |
6 | Duck | 120 | B | そこらへんのアヒルです |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです |
WorkingCategory テーブルid | category | name | flag |
1 | B | 鳥類 | 1 |
2 | B | 鳥類 | 2 |
3 | M | 哺乳類 | 1 |
4 | F | 魚類 | 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テーブルに対応する値が無いため、結果には表示されません。
id | name | value | category | memo | id | category | name | flag |
1 | Penguin | 300 | B | 南国にすむペンギンです | 1 | B | 鳥類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 1 | B | 鳥類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 1 | B | 鳥類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 2 | B | 鳥類 | 2 |
5 | Owl | 90 | B | 関東のフクロウです | 2 | B | 鳥類 | 2 |
6 | Duck | 120 | B | そこらへんのアヒルです | 2 | B | 鳥類 | 2 |
2 | Whale | 420 | M | 北極海のクジラです | 3 | M | 哺乳類 | 1 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 3 | M | 哺乳類 | 1 |
例2:left join
先ほどのテーブルで次のSQL文を実行します。
select * from Working left join WorkingCategory on Working.category=WorkingCategory.category;
実行すると以下の結果が表示されます。
inner joinとの違いは、id=3 や id=7 の項目では対応する値がWorkingCategoryテーブルには存在しませんが、値がNULLとして結果のセットには含まれます。
id | name | value | category | memo | id | category | name | flag |
1 | Penguin | 300 | B | 南国にすむペンギンです | 1 | B | 鳥類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 2 | B | 鳥類 | 2 |
2 | Whale | 420 | M | 北極海のクジラです | 3 | M | 哺乳類 | 1 |
3 | Moffu | 880 | NULL | よくわからない生き物です | NULL | NULL | NULL | NULL |
4 | Camel | 220 | M | 砂漠にすむラクダです | 3 | M | 哺乳類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 1 | B | 鳥類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 2 | B | 鳥類 | 2 |
6 | Duck | 120 | B | そこらへんのアヒルです | 1 | B | 鳥類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 2 | B | 鳥類 | 2 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | NULL | NULL | NULL | NULL |
例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として結果のセットには含まれます。
id | name | value | category | memo | id | category | name | flag |
1 | Penguin | 300 | B | 南国にすむペンギンです | 1 | B | 鳥類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 1 | B | 鳥類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 1 | B | 鳥類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 2 | B | 鳥類 | 2 |
5 | Owl | 90 | B | 関東のフクロウです | 2 | B | 鳥類 | 2 |
6 | Duck | 120 | B | そこらへんのアヒルです | 2 | B | 鳥類 | 2 |
2 | Whale | 420 | M | 北極海のクジラです | 3 | M | 哺乳類 | 1 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 3 | M | 哺乳類 | 1 |
NULL | NULL | NULL | NULL | NULL | 4 | F | 魚類 | 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として結果のセットには含まれます。
id | name | value | category | memo | id | category | name | flag |
1 | Penguin | 300 | B | 南国にすむペンギンです | 1 | B | 鳥類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 2 | B | 鳥類 | 2 |
2 | Whale | 420 | M | 北極海のクジラです | 3 | M | 哺乳類 | 1 |
3 | Moffu | 880 | NULL | よくわからない生き物です | NULL | NULL | NULL | NULL |
4 | Camel | 220 | M | 砂漠にすむラクダです | 3 | M | 哺乳類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 1 | B | 鳥類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 2 | B | 鳥類 | 2 |
6 | Duck | 120 | B | そこらへんのアヒルです | 1 | B | 鳥類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 2 | B | 鳥類 | 2 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | NULL | NULL | 4 | F | 魚類 | 1 |
例5:cross join
先のテーブルで次のSQL文を実行します。
select * from Working CROSS join WorkingCategory;
実行すると以下の結果が表示されます。
Working テーブルと WorkingCategory テーブルのすべての組み合わせが列挙されます。
id | name | value | category | memo | id | category | name | flag |
1 | Penguin | 300 | B | 南国にすむペンギンです | 1 | B | 鳥類 | 1 |
2 | Whale | 420 | M | 北極海のクジラです | 1 | B | 鳥類 | 1 |
3 | Moffu | 880 | NULL | よくわからない生き物です | 1 | B | 鳥類 | 1 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 1 | B | 鳥類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 1 | B | 鳥類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 1 | B | 鳥類 | 1 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | 1 | B | 鳥類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 2 | B | 鳥類 | 2 |
2 | Whale | 420 | M | 北極海のクジラです | 2 | B | 鳥類 | 2 |
3 | Moffu | 880 | NULL | よくわからない生き物です | 2 | B | 鳥類 | 2 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 2 | B | 鳥類 | 2 |
5 | Owl | 90 | B | 関東のフクロウです | 2 | B | 鳥類 | 2 |
6 | Duck | 120 | B | そこらへんのアヒルです | 2 | B | 鳥類 | 2 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | 2 | B | 鳥類 | 2 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 3 | M | 哺乳類 | 1 |
2 | Whale | 420 | M | 北極海のクジラです | 3 | M | 哺乳類 | 1 |
3 | Moffu | 880 | NULL | よくわからない生き物です | 3 | M | 哺乳類 | 1 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 3 | M | 哺乳類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 3 | M | 哺乳類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 3 | M | 哺乳類 | 1 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | 3 | M | 哺乳類 | 1 |
1 | Penguin | 300 | B | 南国にすむペンギンです | 4 | F | 魚類 | 1 |
2 | Whale | 420 | M | 北極海のクジラです | 4 | F | 魚類 | 1 |
3 | Moffu | 880 | NULL | よくわからない生き物です | 4 | F | 魚類 | 1 |
4 | Camel | 220 | M | 砂漠にすむラクダです | 4 | F | 魚類 | 1 |
5 | Owl | 90 | B | 関東のフクロウです | 4 | F | 魚類 | 1 |
6 | Duck | 120 | B | そこらへんのアヒルです | 4 | F | 魚類 | 1 |
7 | Lizard | 60 | R | ひっそりと生きるトカゲです | 4 | F | 魚類 | 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やデータベースの記事なども担当。