1. ホーム
  2. コース一覧
  3. データベース基礎コース
  4. 内部結合(INNER JOIN)してみよう

データベース基礎コース12/13

内部結合(INNER JOIN)してみよう

こちらでは、SQLにおける内部結合(INNER JOIN)ついてわかりやすく解説します。

解説する内容は以下の通りです。

内部結合(INNER JOIN)とは?

内部結合(INNER JOIN)を一言でいうと、お互いのテーブルから共通点を探してそれらを結びつけることを指します。

もう少し詳しく説明すると、RDB(関係データベースまたはリレーショナルデータベースのこと)における関係演算(関係データベースの表からデータを取り出すための計算のこと)の中には、結合(JOIN)という2つのテーブルを結びつける演算があります。さらに、この結合の中に内部結合という演算があります。そして、この内部結合を操作するSQL(関係データベースを操作するための言語のこと)がINNER JOINなのです。

とはいえ、言葉だけですと分かりづらいので次節以降でサンプルデータとともに確認していきましょう。

実行環境

OS(Linux/Ubuntu)】

cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"

データベース(MySQL)】

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26    |
+-----------+

テーブルの作成

サンプルデータとして、以下の「STUDENT_LIST」と「CLUB_LIST」という2つのテーブルを作成します。

【STUDENT_LIST】テーブル

STUDENT_IDNAMESEXBIRTHDAYCLUB_ID
1山田太郎2012-01-014
2佐藤花子2012-03-315
3田中はじめ2011-11-111
4鈴木良子2011-09-094
5渡辺龍之介2011-04-012

こちらはクラスの生徒情報の一覧を表しています。

カラム(列のこと)の内容は左から、STUDENT_ID(学籍番号)、NAME(氏名)、SEX(性別)、BIRTHDAY(生年月日)、CLUB_ID(部活動番号)といった具合ですね。

【CLUB_LIST】テーブル

CLUB_IDCLUB_NAME
1サッカー部
2野球部
3剣道部
4美術部
5野球部

こちらは上記「STUDENT_LIST」テーブルのカラム「CLUB_ID」の内容を表しています。

カラム「CLUB_NAME」は、カラム「CLUB_ID」に紐づく部活動の名称を表していますね。

※以下、参考に上記2つのテーブル作成のためのSQLコマンドも記述しておきます。

【STUDENT_LIST】テーブル

CREATE TABLE STUDENT_LIST (
  STUDENT_ID INT NOT NULL,
  NAME VARCHAR(50),
  SEX CHAR(1),
  BIRTHDAY DATE,
	CLUB_ID INT,
  PRIMARY KEY (STUDENT_ID)
);
INSERT INTO STUDENT_LIST
	(STUDENT_ID, NAME, SEX, BIRTHDAY, CLUB_ID)
VALUES
	(1, '山田太郎', '男', '2012-01-01', 4),
	(2, '佐藤花子', '女','2012-03-31', 5),
	(3, '田中はじめ', '男','2011-11-11', 1),
	(4, '鈴木良子', '女','2011-09-09', 4),
	(5, '渡辺龍之介', '男','2011-04-01', 2);

【CLUB_LIST】テーブル

CREATE TABLE CLUB_LIST (
  CLUB_ID INT NOT NULL,
	CLUB_NAME VARCHAR(50),
  PRIMARY KEY (ClUB_ID)
);
INSERT INTO CLUB_LIST
	(CLUB_ID, CLUB_NAME)
VALUES
	(1, 'サッカー部'),
	(2, '野球部'),
	(3, '剣道部'),
	(4, '美術部'),
	(5, '吹奏楽部');

基本的な構文

まずは基本的な構文を見ていきましょう。

SELECT <カラム名>

FROM <結合元テーブル名>

INNER JOIN <結合先テーブル名>

ON <結合元テーブルのカラム名> = <結合先テーブルのカラム名>;

まず、 SELECT で抽出するカラムを指定し、

次に、 FROM結合元となるテーブルを指定し、

さらに、 INNER JOIN結合先のテーブルを指定します。

最後に、 ON で結合元テーブルと結合先テーブルをどのカラムで結合するかを指定します。

ここでいう、「どのカラムで結合するか」とは、2つのテーブルを結ぶ架け橋となるものはどれかというイメージを持っておいて下さい。

また、テーブルを記述する順序は結合元⇒結合先という流れをイメージしておきましょう。

ひとまず構文の解説は以上です。

まだまだイメージが湧かないと思いますので、時節でサンプルデータを使って実際に内部結合を行って確認していきます。

基本的な使い方

それでは、実際にサンプルデータを使って内部結合を試してみます。

ここでは前節の構文に従い、2つのサンプルデータのすべてのカラムを対象に内部結合を実行してみましょう。

-- すべてのカラムを抽出する
SELECT *

-- 結合元テーブルをSTUDENT_LISTに指定し、別名をSとする
FROM STUDENT_LIST AS S

-- 結合先テーブルをCLUB_LISTに指定し、別名をCとする
INNER JOIN CLUB_LIST AS C

-- 結合元テーブルと結合先テーブルをカラムCLUB_IDで結合する
ON S.CLUB_ID = C.CLUB_ID;

なお、ここでいう AS というのはカラムやテーブルに付ける別名です。

これにより、コードをスッキリとすることができ、可読性(コードの読みやすさ、分かりやすさのこと)が高まります。

使い方は、以下のように記述します。

カラム名にASを使用するケース

SELECT <カラム名> AS <別名>

FROM <テーブル名> 

テーブル名にASを使用するケース

SELECT <カラム名>

FROM <テーブル名> AS <別名> 

それでは、話を戻します。

上記コマンドを記述すると以下のようなテーブルが作成されます。

STUDENT_IDNAMESEXBIRTHDAYCLUB_IDCLUB_IDCLUB_NAME
1山田太郎2012-01-0144美術部
2佐藤花子2012-03-3155吹奏楽部
3田中はじめ2011-11-1111サッカー部
4鈴木良子2011-09-0944美術部
5渡辺龍之介2011-04-0122野球部

いかがでしょうか?

左側のオレンジ色が「STUDENT_LIST」テーブル、右側の緑色が「CLUB_LIST」テーブルです。

2つのテーブルがお互いに共通するカラム「CLUB_ID」を橋渡しにして結合されました。

続いて、もう1つ試してみます。

サンプルデータのうち、カラム「CLUB_NAME」が「サッカー部」の人を抽出してみましょう。

なお、抽出するカラムは「STUDENT_ID」,「NAME」,「CLUB_NAME」の3つを指定します。

-- カラムSTUDENT_ID, NAME, CLUB_NAMEを抽出する
SELECT S.STUDENT_ID, S.NAME, C.CLUB_NAME

-- 結合元テーブルをSUTDENT_LISTに指定し、略称をSとする
FROM STUDENT_LIST AS S

-- 結合先テーブルをCLUB_LISTに指定し、略称をCとする
INNER JOIN CLUB_LIST AS C

-- 結合元テーブルと結合先テーブルをカラムCLUB_IDで結合する
ON S.CLUB_ID = C.CLUB_ID

-- カラムCLUB_NAMEがサッカー部の人を指定する
WHERE C.CLUB_NAME = 'サッカー部';

作成されるテーブルは以下の通りです。

STUDENT_IDNAMECLUB_NAME
3田中はじめサッカー部

このように、内部結合を行った後のテーブルは、あたかも1つのテーブルであるかのように取り扱うことができますので、 WHERE なども使うことができるのです。

さて、これで内部結合のイメージが沸いたのではないでしょうか?

基本的な使い方の解説は以上です。

外部結合(OUTER JOIN)との違い

今回解説した内容は内部結合(INNER JOIN)ですが、これと類似する演算として**外部結合(OUTER JOIN)**というものが存在します。

実は、冒頭でお話したように、内部結合というものは結合演算の中にあるうちの1つなのです。言い換えれば、結合演算には内部結合以外にも種類があります。そして、外部結合はその内部結合以外の種類のうちの1つなのです。

ここでは詳しくは解説しませんが、内部結合との違いを簡単に言うと、外部結合は2つのテーブルに共通しないレコードまで抽出します。

以下は、前節「5.基本的な使い方」で確認したように、サンプルデータにおいてすべてのカラムを抽出したテーブルです。

STUDENT_IDNAMESEXBIRTHDAYCLUB_IDCLUB_IDCLUB_NAME
1山田太郎2012-01-0144美術部
2佐藤花子2012-03-3155吹奏楽部
3田中はじめ2011-11-1111サッカー部
4鈴木良子2011-09-0944美術部
5渡辺龍之介2011-04-0122野球部

こちらをよく見ると、カラム「CLUB_NAME」に剣道部が抽出されていませんよね?

結論だけを言うと、外部結合ではこの剣道部が抽出されます

ここから先の解説はまた別の記事で解説いたします。

ひとまずここでは、「結合には内部結合以外にも種類があるんだなぁ~」くらいでおさえておいてください。

まとめ

こちらでは、内部結合における基本的な構文とその使い方を解説しました。

内部結合は2つのテーブルを結合し1つのテーブルにする操作です。

理解してしまえばそれほど難しいものではないはずです。

内部結合を使えるようになればデータベース操作における幅が大きく広がるでしょう。

問題を解くためには、十分な画面サイズのPC環境をご利用下さい。