アリクイのデータベース勉強記録

データベースやプログラミングについて勉強した内容を発信していきます。

【SQL入門編】テーブルに情報を追加して結合(JOIN)してみよう~実践編~

前回まででデータを追加してテーブル同士を結合する準備ができたので早速作業をしてみましょう。

db-arikui.hatenablog.com

内部結合(INNER JOIN)の書き方以下の通りです。 カラムを指定するときにテーブル名をつけないとどのテーブルのカラムを表示したらいいかわからなくなってエラーが出てしまうので要注意。 SELECT 表示したいカラム名1(テーブル名.カラム名), 表示したいカラム名2(テーブル名.カラム名), 表示したいカラム名3(テーブル名.カラム名), ・ ・ FROM テーブル1 INNER JOIN テーブル2 ON テーブル1のキーになるカラム1 = テーブル2のキーになるカラム;

※今回はanimalsのgroup_codeとwork_groupのgroup_codeが一致するものを表示しています。  animalsのgroup_codeが2の時はwork_groupのgroup_codeが2のシステム開発部が表示されます。

今回はあえてanimalsテーブルのgroup_codeとwork_groupのgroup_code両方を表示してみました。

SELECT 
animals.id,
animals.name,
animals.group_code,
work_group.group_name 
FROM animals
INNER JOIN work_group
ON
animals.group_code = work_group.group_code;

+----+--------------------+------------+------------+------------------+
| id | name               | group_code | group_code | group_name       |
+----+--------------------+------------+------------+------------------+
|  1 | アリクイ           |          2 |          2 | システム開発部   |
|  2 | チベットスナギツネ |          2 |          2 | システム開発部   |
|  3 | マヌルネコ         |          3 |          3 | サポートセンター |
|  4 | ハダカデバネズミ   |          1 |          1 | 営業部           |
|  5 | ホンドギツネ       |          3 |          3 | サポートセンター |
+----+--------------------+------------+------------+------------------+

前回の最後に追加したidが6のオオサンショウウオさんが表示されていないことがわかるかと思います。 これは不具合やSQLの誤りではなくwork_groupテーブルにオオサンショウウオさん属している部署の情報(group_code,group_name)がないため表示されていないものになります。 INNER JOINは対応するデータが無い場合は非表示になる!

さて、勘のいい方はお気づきかと思いますが内部結合があるということは外部結合もあります。 外部結合はINNER JOINの部分をLEFT(RIGHT)JOINで行えます。

SELECT 
animals.id,
animals.name,
animals.group_code,
work_group.group_code,
work_group.group_name 
FROM animals
LEFT JOIN work_group
ON
animals.group_code = work_group.group_code;

+----+--------------------+------------+------------+------------------+
| id | name               | group_code | group_code | group_name       |
+----+--------------------+------------+------------+------------------+
|  1 | アリクイ           |          2 |          2 | システム開発部   |
|  2 | チベットスナギツネ |          2 |          2 | システム開発部   |
|  3 | マヌルネコ         |          3 |          3 | サポートセンター |
|  4 | ハダカデバネズミ   |          1 |          1 | 営業部           |
|  5 | ホンドギツネ       |          3 |          3 | サポートセンター |
|  6 | オオサンショウウオ |          5 |       NULL | NULL             |
+----+--------------------+------------+------------+------------------+

-- RIGHT JOINだと左右が入れ替わると思いきやレコードの順番が変わりました。

+------+--------------------+------------+------------+------------------+
| id   | name               | group_code | group_code | group_name       |
+------+--------------------+------------+------------+------------------+
|    4 | ハダカデバネズミ   |          1 |          1 | 営業部           |
|    2 | チベットスナギツネ |          2 |          2 | システム開発部   |
|    1 | アリクイ           |          2 |          2 | システム開発部   |
|    5 | ホンドギツネ       |          3 |          3 | サポートセンター |
|    3 | マヌルネコ         |          3 |          3 | サポートセンター |
| NULL | NULL               |       NULL |          4 | 管理部           |
+------+--------------------+------------+------------+------------------+

外部結合(LEFT or RIGHT JOIN)は優先するテーブルを一つ決めて、そのにある情報はすべて表示したまま対応するデータが結合したテーブルにあれば表示するということ……らしいです。 LEFT JOINでは従業員のanimalsテーブルが基準になっていたのでidが順にデータが並んでいましたが、RIGHT JOINでは部署のwork_groupテーブルが基準になっているのでgroup _codeが基準になってJOINした結果が表示されています。 ほとんどRIGHT JOINを使うケースはないかと思いますが知識として知っておくのがいいと思うので頭の片隅にでも置いといていただければ幸いです。

カラムの表示順を変えたいときはSELECTでカラムを指定するときに表示したい順番で記述することで好きな順番で表示することができます。

長くなりましたが今回はここまで! テーブルの結合(JOIN)とLEFT JOINとRIGHT JOINの違いについてでした。 結合はとても重要なのでぜひマスターしてください!