【SQL】内部結合のやり方
概要
概要 本記事では内部結合のやり方について記載している。 非会員でも閲覧可能記事。
例
本記事では、以下の2つのテーブルを使って内部結合について説明します。
memberテーブルでは、某VTuber事務所に所属する、メンバーのidと名前が、Vinfoテーブルでは、idとメンバーID、チャンネル登録者数(25/10/9時点)のデータが入っています。
某VTuber事務所メンバー(member)テーブル
| id | name |
| 001 | ときのそら |
| 011 | 白上フブキ |
| 012 | 夏色まつり |
| 031 | 宝鐘マリン |
| 061 | ラプラス・ダークネス |
チャンネル登録者数(Vinfo)テーブル
| id | member_id | value(人数) |
| 1 | 001 | 1,310,000 |
| 2 | 011 | 2,640,000 |
| 3 | 012 | 1,550,000 |
| 4 | 031 | 4,250,000 |
| 5 | 061 | 1,450,000 |
やりたいこと。
現状のままでは、どのメンバーがどのくらいのチャンネル登録者数(以下「登録者数」といいます)がいるのか、ぱっと見では分かりません。
毎回、Vinfoテーブルのmember_idとmemberテーブルのidを照らし合わせるなんて、正直、面倒で、見ずらいですよね?(圧)
ということで、以下のようにメンバーの名前(member_name)と登録者数(value)が一緒に見れる表を作ってほしいということです。
最終的な出力結果
| member_name | value |
| ときのそら | 1,310,000 |
| 白上フブキ | 2,640,000 |
| 夏色まつり | 1,550,000 |
| 宝鐘マリン | 4,250,000 |
| ラプラス・ダークネス | 1,450,000 |
もし、実践的にやりたいという方向けに、簡単にこのテーブルが作れるようコピペできるプログラムを張っておきます。
CREATE DATABASE vtuber_info; CREATE TABLE member(id int NOT NULL, name varchar(30) NOT NULL); CREATE TABLE Vinfo(id int NOT NULL, member_id int NOT NULL, value int NOT NULL); INSERT INTO member(id,name)VALUES(001,"ときのそら"); INSERT INTO member(id,name)VALUES(011,"白上フブキ"); INSERT INTO member(id,name)VALUES(012,"夏色まつり"); INSERT INTO member(id,name)VALUES(031,"宝鐘マリン"); INSERT INTO member(id,name)VALUES(061,"ラプラス・ダークネス"); INSERT INTO Vinfo(id,member_id,value) VALUES(1,001,1310000); INSERT INTO Vinfo(id,member_id,value) VALUES(2,011,2640000); INSERT INTO Vinfo(id,member_id,value) VALUES(3,012,1550000); INSERT INTO Vinfo(id,member_id,value) VALUES(4,031,4250000); INSERT INTO Vinfo(id,member_id,value) VALUES(5,061,1450000);
早速。
内部結合をするには「INNER JOIN 」と「ON」というものを使っていきます。
まぁ解説は後にして先にやってみましょう。
以下のSQL文をコピペしてください。
SELECT member.name AS member_name, Vinfo.value FROM member INNER JOIN Vinfo ON member.id = Vinfo.member_id;
出力結果を見ると、正しくできたことが分かりますね!
解説
AS
上述で「INNER JOIN 」と「ON」しか新たに使わないと書いておきながら、「AS」の説明を今までしたことがなかったので、ASの説明を先に挟みます。
ASは簡単に言うと、「テーブルやカラム名を別名変更する際に使用するもの 」です。
今回の例で言うと、memberテーブルにあるカラム「name」を分かりやすく「member_name」に書き換えただけです。使い方は以下の通り。
カラム名 AS 変更後のカラム名
INNER JOINとON
さて本題に。
SELECT member.name AS member_name, Vinfo.value FROM member INNER JOIN Vinfo ON member.id = Vinfo.member_id;
まず、表示するのでSELECT文ですね!ここはいいはず。
SELECTとFROMの間には表示したいカラム名を記入します。
ここで、二つあるテーブルのうち、どちらのカラムのことを指しているのかを明確にする必要があります。そのため、次のように書きます。
テーブル名.カラム名
実際に上記のプログラムでも、
member.name, Vinfo.value
の部分では、memberテーブルの「name」カラムと、Vinfoテーブルの「value」カラムを呼んでいます。
(分かりやすくするためにASは消しました)
次。
FROM member INNER JOIN Vinfo
FROMとINNER JOINの間および、INNER JOINの後にそれぞれテーブル名を記載します。今回はmemberテーブルとVinfoテーブルを明記。
ON member.id = Vinfo.member_id;
ON以降は結合条件を記載します。今回は、memberテーブルのidとVinfoテーブルのmember_idが一致していればいいため、このように記載しています。
まとめると、以下のように書いています。
SELECT table1.column_name, table2.column_name FROM table1 INNER JOIN table2 ON 結合条件