「JOIN」句は、複数のテーブルをまとめる「テーブル結合」を行うクエリ(命令)で、主にSELECT文と併用して複数のテーブルから関連するデータを効率的に抽出するのに使用されます。JOIN句は用途によって大きく5つに分けられますが、なかでもデータベース操作で重宝されるのが「INNER JOIN」句です。
本記事では、そんな「INNER JOIN」句の基本的な概念と、その具体的な使用方法を中心に詳しく解説します。
そもそも「JOIN」句とは?
SQLの「JOIN」句とは、異なるテーブル間のデータを関連付けるクエリです。テーブル結合させることで2つのテーブルを1つのテーブルのように扱うことができるので、一度の検索で複数のテーブルからデータを取得できます。JOIN句には5種類あり、取得するデータの性質や用途に応じて使い分けます。
INNER JOIN(内部結合)とは
「INNER JOIN」句は、それぞれのテーブルの指定したカラムで値が一致する場合にそのレコードのみを結合させるクエリです。この共通の値を持つという結合条件を満たさないレコードは除外されます。ちなみに、単に「JOIN」と記述した場合も「INNER JOIN」句扱いになります。
図:内部結合(INNER JOIN句)のイメージ
結合条件は、等値結合 (=)のほかに、非等値結合(>、 <、 <>, !=、…)も使用可能です。
ここからはサンプルテーブルを用いてそれぞれの種類と適した用途を説明します。
サンプルテーブル
「INNER JOIN」句の使い方の説明には、サンプルとして「従業員」テーブルと「部署」テーブルを用います。
「INNER JOIN」句の使い方の説明には、サンプルとして「従業員」テーブルと「部署」テーブルを用います。
従業員ID(employee_id) | 氏名(name) | 部署ID(dept_id) | 役職(post) |
1 | 阿部 | 5 | 3 |
2 | 菊池 | 1 | 2 |
3 | 鈴木 | 6 | |
4 | 田中 | 4 | 1 |
5 | 野村 | 7 | |
6 | 長谷川 | 3 | |
7 | 山田 | 5 | 2 |
「INNER JOIN」句の使い方の説明には、サンプルとして「従業員」テーブルと「部署」テーブルを用います。
ID(id) | 部署名(dept_name) |
1 | 総務部 |
2 | 人事部 |
3 | 経理部 |
4 | 営業部 |
5 | マーケティング部 |
6 | 情報システム部 |
【使用イメージ】
SELECT カラム名 FROM テーブルA INNER JOIN テーブルB ON 結合条件;
テーブルAから取得するカラムを指定し、結合の条件を満たすデータがテーブルBにある場合は1つのテーブルとして表示します。
以下のように、それぞれのテーブルのキーとなるカラム名を指定する形式で使用することが多いです。
SELECT カラム名 FROM テーブルA INNER JOIN テーブルB ON テーブルA.結合キー1 = テーブルB.結合キー2;
実際のコードで見てみましょう。
【補足】テーブルの準備
※わかる人は読み飛ばしてOK
テーブルの作成
テーブルの作成には、各カラムのデータ型の指定と主キー(プライマリーキー)を指定します。上記のサンプルテーブルをSQLで作成するには以下のように記述します。
◆従業員(employee)テーブルの作成
CREATE TABLE employee(
employee_id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR,
dept_id INTEGER,
post INTEGER,
);
◆部署(department)テーブルの作成
CREATE TABLE department(
id INTEGER NOT NULL PRIMARY KEY,
dept_name VARCHAR
);
(補足)頻出データ型
数値 | integer |
文字列 | varchar |
長い文字列 | text |
日付 | datetime |
データの追加
テーブルが完成したら各フィールドにデータを入れていきます。
◆従業員(employee)テーブルへのデータ追加
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (1, '阿部', 3);
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (2, '菊池', 2);
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (3, '鈴木');
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (4, '田中', 1);
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (5, '野村');
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (6, '長谷川');
INSERT INTO employee (employee_id, name, dept_id, post) VALUES (7, '山田', 2);
◆部署(department)テーブルへのデータ追加
INSERT INTO department (id, dept_name) VALUES (1, '総務部');
INSERT INTO department (id, dept_name) VALUES (2, '人事部');
INSERT INTO department (id, dept_name) VALUES (3, '経理部');
INSERT INTO department (id, dept_name) VALUES (4, '営業部');
INSERT INTO department (id, dept_name) VALUES (5, 'マーケティング部');
INSERT INTO department (id, dept_name) VALUES (6, '情報システム部');
以上でテーブルの準備が完了しました。
INNER JOINの記述方法
「従業員」テーブルの「部署ID」カラムと「部署」テーブルの「ID」カラムを紐づけ、結合条件を満たす場合に、「従業員」テーブルの「氏名」カラムと「部署」テーブルの「部署名」カラムを表示します。
【実行コード】
SELECT employee.name, department.dept_name FROM employee INNER JOIN department ON employee.dept_id = department.id;
【実行結果】
氏名(name) | 部署名(dept_name) |
阿部 | マーケティング部 |
菊池 | 総務部 |
鈴木 | 情報システム部 |
田中 | 営業部 |
長谷川 | 経理部 |
山田 | マーケティング部 |
共通する値がない「従業員」テーブルの「野村」さん、「部署」テーブルの「人事部」が表示されていません。
※下記コードでも同じ結果になります。
SELECT employee.name, department.dept_name FROM employee,department WHERE employee.dept_id = department.id;
カラム名の記述方法
2つのテーブル名でカラム名に重複がない場合、テーブル名を省略しても可能ですが、カラム名は「テーブル名.カラム名」と記述すると可読性が上がるのでおすすめです。カラム名に重複があるのにテーブル名を指定せずにカラム名のみを記述すると、「Error: Column ‘カラム名’ in field list is ambiguous」というエラーメッセージが表示されます。
エイリアス名の指定方法
「カラム名 AS エイリアス名」と記述することで全体の記述量を減らせたり、テーブルを見分けやすくなります。
ONには複数の条件が書ける
JOIN句における「ON」句は、結合条件を記述しますが、ANDやORでつなげることで複数の条件を記述することも可能です。
【使用イメージ】
SELECT カラム名 FROM テーブルA INNER JOIN テーブルB ON 結合条件1 AND 結合条件2;
結合テーブルの検索条件を指定する
JOIN句において、ON句もWHERE句も条件を指定するのに用いられますが、「ON」句は結合の条件を指定する意味合いで使用される一方で「WHERE」句は、データの抽出条件を指定するのに使用されます。
基本的には、ON句で指定した条件でテーブル結合を行ってから、WHERE句で指定した条件でデータを絞り込みます。※オプティマイザによっては、逆の場合もあります。
テーブル結合されたデータのなかから、抽出条件を満たすデータを抽出することになります。簡単にいってしまえば、テーブル結合前の条件指定を「ON句」、テーブル結合後の条件指定を「WHERE句」で記述するということです。
下記コードで6部署に属し、役職が「2」の従業員を抽出します。
【実行コード】
SELECT employee.name, department.dept_name FROM employee INNER JOIN department ON employee.dept_id = department.id WHERE employee.post = 2;
【実行結果】
氏名(name) | 部署名(dept_name) |
菊池 | 総務部 |
山田 | マーケティング部 |
ここで、内部結合の場合、2つのテーブルが条件を満たすデータだけを取得するどちらを使っても同じ結果が生まれます。しかし、外部結合ではON句を使うかWHERE句を使うかで抽出結果が変わる可能性があるので注意が必要です。
そういった点と、可読性を考慮し、結合条件は「ON」句、抽出データの絞り込み条件は「WHERE」句に記述するのがおすすめです。
ちなみに、WHERE句に条件を指定する場合は、内部結合と外部結合で同じ結果が取得できますが、パフォーマンス面を考慮すると、内部結合の方がいいでしょう。
内部結合(INNER JOIN句)を使う場面
内部結合(INNER JOIN句)はデータ集計や関連するデータの統合に適しています。
- (例1)顧客情報と注文情報で顧客ごとの注文履歴を取得できる
- (例2)商品情報とカテゴリ情報で各カテゴリの商品を取得できる
内部結合と外部結合の違い
SQLには内部結合のほかに外部結合(「OUTER JOIN」句)もあります。一致する行のみを取得するINNER JOINと対照的に外部結合は一致しない行も結合します。外部結合(OUTER JOIN句)は一致しないレコードも取得できるため、データ補完や欠損データの特定、関連するデータの統合などに使用されます。こういった違いがあるので、それぞれの特徴を理解し、目的に合わせて使い分けましょう。
3つ以上のテーブルを結合する場合
3つ以上のテーブルを結合させることも可能です。
【使用イメージ】
SELECT カラム名 FROM テーブルA INNER JOIN テーブルB ON 結合条件1 INNER JOIN テーブルC ON 結合条件2;
順番にテーブルを結合します。
新たに「役職」テーブルを用いて、6部署に属し、且つ役職を持っている従業員を抽出します。
「役職(post)」テーブル
役職ID(post_id) | 役職名(post_name) |
1 | 部長 |
2 | 課長 |
3 | 主任 |
【実行コード】
SELECT employee.name, post.name FROM employee INNER JOIN department ON employee.dept_id = department.id INNER JOIN post ON employee.post = post.post_id;
【実行結果】
氏名(name) | 役職名(post_name) |
阿部 | 主任 |
菊池 | 課長 |
田中 | 部長 |
山田 | 課長 |
1つ目のINNER JOIN句で6部署に属す従業員を抽出し、2つ目のINNER 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エンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。