更新:2024/01/01

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