MySQLの内部結合について

はるか
テーブルって結合できるの?

ふゅか
できるわ。

はるか
なにか基準があるの?

ふゅか
そうね…共通するキーを結合するという方法があるわ。
1. 内部結合とは
内部結合とは、データベースにおける結合の一種で、二つのテーブルを共通の列を基に結合し、両テーブルに共通して存在する行のみを結果として返す操作です。これにより、関連するデータを異なるテーブルから取り出して、一つの結果セットにまとめることができます。
2. 実際に動かしてみよう。
2.1. 1. テーブルの作成
-- キャラクターテーブルの作成
CREATE TABLE characters (
character_id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
-- スキルテーブルの作成
CREATE TABLE skills (
skill_id INTEGER PRIMARY KEY,
skill_name TEXT,
description TEXT
);
-- キャラクターとスキルの関連テーブルの作成
CREATE TABLE character_skills (
character_id INTEGER,
skill_id INTEGER,
FOREIGN KEY (character_id) REFERENCES characters(character_id),
FOREIGN KEY (skill_id) REFERENCES skills(skill_id)
);
-- キャラクターデータの挿入
INSERT INTO characters (character_id, name, age) VALUES (1, 'Alice', 25);
INSERT INTO characters (character_id, name, age) VALUES (2, 'Bob', 30);
INSERT INTO characters (character_id, name, age) VALUES (3, 'Charlie', 35);
INSERT INTO characters (character_id, name, age) VALUES (4, 'fuxyuka', 1500);
INSERT INTO characters (character_id, name, age) VALUES (5, 'haruka', 19);
-- スキルデータの挿入
INSERT INTO skills (skill_id, skill_name, description) VALUES (1, 'Magic', 'Ability to cast spells');
INSERT INTO skills (skill_id, skill_name, description) VALUES (2, 'Swordsmanship', 'Expert in using a sword');
INSERT INTO skills (skill_id, skill_name, description) VALUES (3, 'Archery', 'Skilled in using a bow and arrow');
-- キャラクタースキル関連データの挿入
INSERT INTO character_skills (character_id, skill_id) VALUES (1, 1);
INSERT INTO character_skills (character_id, skill_id) VALUES (1, 3);
INSERT INTO character_skills (character_id, skill_id) VALUES (2, 2);
INSERT INTO character_skills (character_id, skill_id) VALUES (3, 1);
INSERT INTO character_skills (character_id, skill_id) VALUES (3, 2);
INSERT INTO character_skills (character_id, skill_id) VALUES (3, 3);
2.2. 3. 内部結合の実行
データベースの関係は次のようになっています。
とりあえずcharactersテーブルの中身を見てみましょう。
SELECT *
FROM characters

はるか
えっ、お姉ちゃんの年齢が。

ふゅか
あっ。
2.3. キャラクターとスキルの結合を行う
-- キャラクターとスキルの内部結合
SELECT *
FROM characters
INNER JOIN character_skills on characters.character_id = character_skills.character_id
INNER JOIN skills on skills.skill_id = character_skills.skill_id

はるか
たしかに、スキルが登録されていないキャラクターは表示されていないな。
PR