データベース基礎コース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_ID | NAME | SEX | BIRTHDAY | CLUB_ID |
---|---|---|---|---|
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 |
こちらはクラスの生徒情報の一覧を表しています。
カラム(列のこと)の内容は左から、STUDENT_ID(学籍番号)、NAME(氏名)、SEX(性別)、BIRTHDAY(生年月日)、CLUB_ID(部活動番号)といった具合ですね。
【CLUB_LIST】テーブル
CLUB_ID | CLUB_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_ID | NAME | SEX | BIRTHDAY | CLUB_ID | CLUB_ID | CLUB_NAME |
---|---|---|---|---|---|---|
1 | 山田太郎 | 男 | 2012-01-01 | 4 | 4 | 美術部 |
2 | 佐藤花子 | 女 | 2012-03-31 | 5 | 5 | 吹奏楽部 |
3 | 田中はじめ | 男 | 2011-11-11 | 1 | 1 | サッカー部 |
4 | 鈴木良子 | 女 | 2011-09-09 | 4 | 4 | 美術部 |
5 | 渡辺龍之介 | 男 | 2011-04-01 | 2 | 2 | 野球部 |
いかがでしょうか?
左側のオレンジ色が「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_ID | NAME | CLUB_NAME |
---|---|---|
3 | 田中はじめ | サッカー部 |
このように、内部結合を行った後のテーブルは、あたかも1つのテーブルであるかのように取り扱うことができますので、 WHERE
なども使うことができるのです。
さて、これで内部結合のイメージが沸いたのではないでしょうか?
基本的な使い方の解説は以上です。
外部結合(OUTER JOIN)との違い
今回解説した内容は内部結合(INNER JOIN)ですが、これと類似する演算として**外部結合(OUTER JOIN)**というものが存在します。
実は、冒頭でお話したように、内部結合というものは結合演算の中にあるうちの1つなのです。言い換えれば、結合演算には内部結合以外にも種類があります。そして、外部結合はその内部結合以外の種類のうちの1つなのです。
ここでは詳しくは解説しませんが、内部結合との違いを簡単に言うと、外部結合は2つのテーブルに共通しないレコードまで抽出します。
以下は、前節「5.基本的な使い方」で確認したように、サンプルデータにおいてすべてのカラムを抽出したテーブルです。
STUDENT_ID | NAME | SEX | BIRTHDAY | CLUB_ID | CLUB_ID | CLUB_NAME |
---|---|---|---|---|---|---|
1 | 山田太郎 | 男 | 2012-01-01 | 4 | 4 | 美術部 |
2 | 佐藤花子 | 女 | 2012-03-31 | 5 | 5 | 吹奏楽部 |
3 | 田中はじめ | 男 | 2011-11-11 | 1 | 1 | サッカー部 |
4 | 鈴木良子 | 女 | 2011-09-09 | 4 | 4 | 美術部 |
5 | 渡辺龍之介 | 男 | 2011-04-01 | 2 | 2 | 野球部 |
こちらをよく見ると、カラム「CLUB_NAME」に剣道部が抽出されていませんよね?
結論だけを言うと、外部結合ではこの剣道部が抽出されます。
ここから先の解説はまた別の記事で解説いたします。
ひとまずここでは、「結合には内部結合以外にも種類があるんだなぁ~」くらいでおさえておいてください。
まとめ
こちらでは、内部結合における基本的な構文とその使い方を解説しました。
内部結合は2つのテーブルを結合し1つのテーブルにする操作です。
理解してしまえばそれほど難しいものではないはずです。
内部結合を使えるようになればデータベース操作における幅が大きく広がるでしょう。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。