SQLite - JOINS: テーブル結合の芸術をマスターする

こんにちは、未来のデータベースの達人たち!今日は、SQLiteの最もエキサイティングで(時には恐怖を伴う)側面の一つ、JOINSに潜り込んでみましょう。新しいことを学んでいる場合でも心配しないでください;このチュートリアルの終わりまでに、プロのようにテーブルを結合できるようになるでしょう!

SQLite - JOINS

JOINSの導入

深淵に飛び込む前に、JOINSが必要な理由について話しましょう。大規模な誕生日パーティを計画していると想像してみてください(誰だってパーティが大好きですよね?)。ゲストの名前のリストと、彼らの好みのケーキの味のリストがあります。これらのリストを結合して、それぞれのゲストが好みのケーキを確実に受け取ることができるたら素晴らしいと思いませんか?JOINSはデータベースでまさにそのことを行います。異なるテーブルから情報を有意義な方法で結合する手助けをしてくれます。

さあ、SQLiteの主な3つのJOINSの種類を見てみましょう:

  1. CROSS JOIN
  2. INNER JOIN
  3. OUTER JOIN

CROSS JOIN:パーティーミキサー

CROSS JOINとは?

CROSS JOINは、パーティーに出席した全員が他の全員と交流するようなものです。一つのテーブルの各行を他のテーブルの全行と結合します。これは、「みんな、お互いに会いましょう!」というデータベース版です。

CROSS JOINの構文

SELECT * FROM table1 CROSS JOIN table2;

CROSS JOINの例

パーティープランニングのための2つのシンプルなテーブルを作成してみましょう:

CREATE TABLE guests (
guest_id INTEGER PRIMARY KEY,
guest_name TEXT
);

CREATE TABLE cakes (
cake_id INTEGER PRIMARY KEY,
cake_flavor TEXT
);

INSERT INTO guests (guest_name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO cakes (cake_flavor) VALUES ('Chocolate'), ('Vanilla'), ('Strawberry');

CROSS JOINを使ってみましょう:

SELECT guests.guest_name, cakes.cake_flavor
FROM guests CROSS JOIN cakes;

このクエリは以下の結果を生成します:

guest_name cake_flavor
Alice Chocolate
Alice Vanilla
Alice Strawberry
Bob Chocolate
Bob Vanilla
Bob Strawberry
Charlie Chocolate
Charlie Vanilla
Charlie Strawberry

ご覧の通り、各ゲストはすべてのケーキの味とペアされます。まるで全員がすべてのケーキを味わうようなものです!

CROSS JOINの使用时机

CROSS JOINは、実際のシナリオではほとんど使用されません。なぜなら、非常に大きな結果セットを生成することができるからです。しかし、組み合わせを生成するか、テストデータを作成するのに適しています。

INNER JOIN:完璧なペア

INNER JOINとは?

INNER JOINは、同じダンスを知っているダンスパートナーをペアにするようなものです。関連するカラムに基づいて2つのテーブルの行を結合します。

INNER JOINの構文

SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;

INNER JOINの例

パーティープランニングのシナリオを少し変更してみましょう。今度はゲストとそのケーキの好みがあります:

CREATE TABLE guests (
guest_id INTEGER PRIMARY KEY,
guest_name TEXT,
preferred_cake_id INTEGER
);

CREATE TABLE cakes (
cake_id INTEGER PRIMARY KEY,
cake_flavor TEXT
);

INSERT INTO guests (guest_name, preferred_cake_id) VALUES
('Alice', 1), ('Bob', 2), ('Charlie', 3), ('David', 1);
INSERT INTO cakes (cake_flavor) VALUES
('Chocolate'), ('Vanilla'), ('Strawberry');

INNER JOINを使ってゲストとその好みのケーキを一致させます:

SELECT guests.guest_name, cakes.cake_flavor
FROM guests INNER JOIN cakes ON guests.preferred_cake_id = cakes.cake_id;

このクエリは以下の結果を生成します:

guest_name cake_flavor
Alice Chocolate
Bob Vanilla
Charlie Strawberry
David Chocolate

完璧です!各ゲストは好みのケーキの味と一致しています。

INNER JOINの使用时机

INNER JOINは最も一般的なJOIN種類です。2つのテーブルのデータに一致する値を取得したい場合に使用します。

OUTER JOIN:誰もが参加

OUTER JOINとは?

OUTER JOINは、パーティーで誰もが取り残されないようにするようなものです。1つまたは2つのテーブルの全行を返し、他のテーブルに一致する行がなくても構いません。

以下の3つのOUTER JOINがあります:

  1. LEFT OUTER JOIN
  2. RIGHT OUTER JOIN(SQLiteではサポートされていません)
  3. FULL OUTER JOIN(SQLiteでは直接サポートされていません)

ここでは、最も一般的に使用されるLEFT OUTER JOINに焦点を当てます。

LEFT OUTER JOINの構文

SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.column = table2.column;

LEFT OUTER JOINの例

ケーキの好みがないゲストを追加してみましょう:

INSERT INTO guests (guest_name, preferred_cake_id) VALUES ('Eve', NULL);

LEFT OUTER JOINを使ってみましょう:

SELECT guests.guest_name, cakes.cake_flavor
FROM guests LEFT OUTER JOIN cakes ON guests.preferred_cake_id = cakes.cake_id;

このクエリは以下の結果を生成します:

guest_name cake_flavor
Alice Chocolate
Bob Vanilla
Charlie Strawberry
David Chocolate
Eve NULL

Eveが結果に含まれているのを見てください。彼女は好みのケーキがないにもかかわらず、LEFT OUTER JOINの魔法のために含まれます!

OUTER JOINの使用时机

OUTER JOINは、1つのテーブルの全てのレコードを含め、他のテーブルに一致するレコードがなくても良い場合に使用します。

結論

そしてここまでが、SQLiteのJOINSの素晴らしい世界への第一歩です。練習は完璧を生みますから、これらのクエリを試してみてください。

以下に、私たちがカバーしたJOINの簡単な参照表を示します:

JOIN種類 使用ケース
CROSS JOIN すべての行を他のすべての行と結合
INNER JOIN 条件に基づいて行を一致
LEFT JOIN 左側のテーブルのすべての行を含め、一致する場合

テーブルを結合し続けて、すぐにデータベースのパーティーの中心人物になるでしょう!ハッピークエリ!

Credits: Image by storyset