たとえば、顧客情報が格納されたテーブルAと商品の注文情報が格納されたテーブルBがあったとします。だれがどの商品を購入したかを調べる場合、まずテーブルAを調べてからテーブルBを調べて、検索結果を合わせるという方法もありますが、それでは時間がかかってしまいます。そういった場合に、まずテーブルAとテーブルBをまとめてから検索するという方法もあります。この「まとめる」という作業を「結合」といい、「JOIN」句を用います。この操作は集計や複数箇所に分散したデータをまとめるのに便利です。JOIN句には5種類あり、取得するデータの性質や用途に応じて使い分けます。本記事では、「JOIN」句の基本的な概念と、その具体的な使用方法について詳しく解説します。
JOIN句とは
SQLの「JOIN」句は、関連する複数のテーブルを関連付ける「テーブル結合」を行うクエリです。テーブル結合は1つのクエリで複数のテーブルに格納されたデータを扱いたい場合に便利です。主に、SELECT文と併用して複数のテーブルから関連するデータを効率的に抽出するのに用いられます。
ここからはサンプルテーブルを用いてそれぞれの種類と適した用途を説明します。
サンプルテーブル
「JOIN」句の使い方の説明には、サンプルとして「生徒」テーブルと「運動部」テーブルを用います。
「生徒(student)」テーブル
学籍番号(number) | 氏名(name) | 部活ID(club_id) |
1 | 菊池 | 1 |
2 | 鈴木 | 3 |
3 | 田中 | 4 |
4 | 山田 | 1 |
「運動部(sport_club)」テーブル
ID(id) | 競技(sport) |
1 | 野球 |
2 | サッカー |
3 | バスケットボール |
内部結合(INNER JOIN句)
「INNER JOIN」句は、それぞれのテーブルの指定したカラムで値が一致する場合にのみ、そのレコードを結合させるクエリです。この共通の値を持たないレコードは除外されます。ちなみに、単に「JOIN」と記述した場合も「INNER JOIN」句扱いになります。
図:内部結合(INNER JOIN句)のイメージ
結合条件は、等値結合 (=)のほかに、非等値結合(>、 <、 <>, !=、…)も使用可能です。
【使用イメージ】
SELECT カラム名 FROM テーブルA INNER JOIN テーブルB ON 結合条件;
テーブルAから取得するカラムを指定し、結合の条件を満たすデータがテーブルBにある場合は1つのテーブルとして表示します。
【実行コード】
SELECT student.name,sport_club.sport FROM student INNER JOIN sport_club ON student.club_id = sport_club.id;
「生徒」テーブルの「部活」カラムと「運動部」テーブルの「ID」カラムを紐づけ、結合条件を満たす場合に、「生徒」テーブルの「氏名」カラムと「運動部」テーブルの「競技」カラムを表示します。
【実行結果】
氏名 (name) | 競技 (sport) |
菊池 | 野球 |
鈴木 | バスケットボール |
山田 | 野球 |
共通する値がない「生徒」テーブルの田中さん、「運動部」テーブルの「サッカー」が表示されていません。
※下記コードでも同じ結果になります。
SELECT student.name,sport_club.sport
FROM student,club_member WHERE student.club_id = sport_club.id;
内部結合(INNER JOIN句)を使う場面
内部結合(INNER JOIN句)はデータ集計や関連するデータの統合に適しています。
- (例1)顧客情報と注文情報で顧客ごとの注文履歴を取得できる
- (例2)商品情報とカテゴリ情報で各カテゴリの商品を取得できる
左外部結合(LEFT OUTER JOIN句)
「OUTER JOIN」句は、値が一致するレコードに加えて、一致しない場合でも結合します。
基準にするテーブルによって次の3種類に分けられます。
- FROM句で指定したテーブル(左側)を基準にする「左外部結合(LEFT OUTER JOIN句)」
- JOIN句で指定したテーブル(右側)を基準にする「右外部結合(RIGHT OUTER JOIN句)」
- 両方のテーブルを基準にする「完全外部結合(FULL OUTER JOIN句)」※クエリ名は使用するRDBMSに依存
それぞれ説明していきます。
「LEFT OUTER JOIN」句は、結合条件を満たすレコードに加えて、結合条件に関わらず、テーブルAのレコードはすべて結合するクエリです。値が一致しない場合、テーブルBの該当箇所にはNULLが入ります。
図:左外部結合(LEFT OUTER JOIN句)のイメージ
【使用イメージ】
SELECT カラム名 FROM テーブルA LEFT OUTER JOIN テーブルB ON 結合条件;
【実行コード】
SELECT student.name,sport_club.sport FROM student LEFT OUTER JOIN sport_club ON student.club_id = sport_club.id;
カラム名の記述方法
カラム名は「テーブル名.カラム名」と記述すると可読性が上がるのでおすすめです。
エイリアス名の指定方法
「カラム名 AS エイリアス名」と記述することで全体の記述量を減らせたり、テーブルを見分けやすくなります。
【実行結果】
氏名 (name) | 競技 (sport) |
菊池 | 野球 |
鈴木 | バスケットボール |
田中 | NULL |
山田 | 野球 |
INNER JOIN句では除外された田中さんが表示されています。これは、LEFT OUTER JOIN句の場合「生徒」テーブルのレコードをすべて出力するためです。
右外部結合(RIGHT OUTER JOIN句)
「RIGHT OUTER JOIN」句は、結合条件を満たすレコードに加えて、結合条件に関わらず、右側のテーブルのレコードはすべて結合するクエリです。値が一致しない場合、左側のテーブルの該当箇所にはNULLが入ります。
図:右外部結合(RIGHT OUTER JOIN句)のイメージ
【使用イメージ】
SELECT カラム名 FROM テーブルA RIGHT OUTER JOIN テーブルB ON 結合条件;
【実行コード】
SELECT student.name,sport_club.sport FROM student RIGHT OUTER JOIN sport_club ON student.club_id = sport_club.id;
【実行結果】
氏名 (name) | 競技 (sport) |
菊池 | 野球 |
NULL | サッカー |
鈴木 | バスケットボール |
山田 | 野球 |
INNER JOIN句では除外されたサッカー部が表示されています。これは、RIGHT OUTER JOIN句の場合「運動部」テーブルのレコードをすべて出力するためです。
完全外部結合(FULL OUTER JOIN句)
「FULL OUTER JOIN」句は、結合条件を満たすレコードに加えて、結合条件に関わらず、どちらか一方にしか存在しないデータも出力するクエリです。値が一致しない場合、左側のテーブルの該当箇所にはNULLが入ります。2つのテーブルのデータを網羅的に結合できます。
図:完全外部結合(FULL OUTER JOIN句)のイメージ
【使用イメージ】
SELECT カラム名 FROM テーブルA FULL OUTER JOIN テーブルB ON 結合条件;
【実行コード】
SELECT student.name,sport_club.sport FROM student FULL OUTER JOIN sport_club ON student.club_id = sport_club.id;
【実行結果】
氏名 (name) | 競技 (sport) |
菊池 | 野球 |
NULL | サッカー |
鈴木 | バスケットボール |
田中 | NULL |
山田 | 野球 |
外部結合(OUTER JOIN句)を使う場面
外部結合(OUTER JOIN句)は一致しないレコードも取得できるため、データ補完や欠損データの特定、関連するデータの統合などに使用されます。
交差結合(CROSS JOIN句)
「CROSS JOIN」句は、2つのテーブルのすべての組み合わせを網羅的に生成するクエリで、交差結合は直積結合とも呼ばれます。ただ、実用性がなく、「CROSS JOIN」句を使用することは滅多にありません。
【使用イメージ】
SELECT カラム名 FROM テーブルA CROSS JOIN テーブルB;
【実行コード】
SELECT * FROM student CROSS JOIN sport_club;
2つのテーブルのレコード分すべて掛け合わせているため、4 * 3で計12行になります。
【実行結果】
学籍番号 (number) | 氏名 (name) | 部活ID (club_id) | ID (id) | 競技 (sport) |
1 | 菊池 | 1 | 1 | 野球 |
1 | 菊池 | 1 | 2 | サッカー |
1 | 菊池 | 1 | 3 | バスケットボール |
2 | 鈴木 | 3 | 1 | 野球 |
2 | 鈴木 | 3 | 2 | サッカー |
2 | 鈴木 | 3 | 3 | バスケットボール |
3 | 田中 | 4 | 1 | 野球 |
3 | 田中 | 4 | 2 | サッカー |
3 | 田中 | 4 | 3 | バスケットボール |
4 | 山田 | 1 | 1 | 野球 |
4 | 山田 | 1 | 2 | サッカー |
4 | 山田 | 1 | 3 | バスケットボール |
※下記コードでも同じ結果になります。
SELECT *
FROM student,sport_club;
3つ以上のテーブルを結合する場合
3つ以上のテーブルを結合させる場合は順番と結合条件に注意する必要があります。
【使用イメージ】
SELECT カラム名 FROM テーブルA JOIN テーブルB ON 結合条件1 JOIN テーブルC ON 結合条件2;
順番にテーブルを結合します。
「体育館利用」テーブルを用いて、体育館を利用する運動部の生徒を抽出します。
「体育館利用(gym_use)」テーブル
部活ID(club_id) | 利用時間帯(time_zone) |
3 | 午前 |
4 | 午後 |
【実行コード】
SELECT student.name FROM student INNER JOIN sport_club ON student.club_id = sport_club.id INNER JOIN gym_use ON student.club_id = gym_use.club_id;
【実行結果】
氏名 (name) |
鈴木 |
上記の例では1つ目のJOIN句で運動部の生徒を抽出し、2つ目のJOIN句で体育館を利用する部活に属する生徒を抽出しています。
SQL関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを抽出する「SELECT」文
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 抽出結果を統合して表示する「UNION」句
- データの曖昧検索「LIKE」句
- 条件分岐処理「CASE」式
- 「NULL」の扱い方
SQLの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。