PostgreSQL - JOINS

こんにちは、データベースの熱心な志願者さんたち!今日は、PostgreSQLのJOINの世界に興味深い旅を楽しむことになります。あなたの近所の親切なコンピュータの先生として、私はこの冒険をステップバイステップで案内します。心配しないでください。これまでにコードを一行も書いたことがない人でも大丈夫です。私たちは非常に基本的なところから始めて、少しずつ進んでいきます。では、仮想のヘルメットをかぶり、一緒に飛び込みましょう!

PostgreSQL - Joins

JOINとは?

さまざまなJOINの種類に飛び込む前に、JOINが実際に何であるかを理解しましょう。大きなパーティを計画しているとします(だって、誰だってデータベースのパーティが好きですよね?)。友達の名前のリストと、彼らのお気に入りの飲み物のリストの二つがあります。JOINは、魔法のパーティプランナーのように、これらのリストをさまざまな方法で組み合わせて、完璧なゲストリストを作成するお手伝いをします。

データベースの言葉では、JOINは関連する列に基づいて、2つ以上のテーブルの行を結合することができます。では、PostgreSQLが私たちに提供するさまざまなJOINの種類を探ってみましょう。

CROSS JOIN

CROSS JOINとは?

CROSS JOINは、飲み物の好みを知らないにしても、リストの両方のすべての人をパーティに招待することです。最初のテーブルのすべての行を、2番目のテーブルのすべての行と結合します。

CROSS JOINの例

以下に簡単なテーブルを作成してみましょう:

CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE drinks (
id SERIAL PRIMARY KEY,
drink VARCHAR(50)
);

INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO drinks (drink) VALUES ('Cola'), ('Juice'), ('Water');

次に、CROSS JOINを実行します:

SELECT f.name, d.drink
FROM friends f
CROSS JOIN drinks d;

結果:

name drink
Alice Cola
Alice Juice
Alice Water
Bob Cola
Bob Juice
Bob Water
Charlie Cola
Charlie Juice
Charlie Water

ご覧の通り、すべての友達がすべての飲み物とペアされます。まるで「みんな、すべての飲み物を試してみよう!」と言っているみたいです。これは必ずしも実用的ではありませんが、すべての可能な組み合わせを生成するのに非常に良い方法です。

INNER JOIN

INNER JOINとは?

INNER JOINはもっと選択的です。友達を彼らのお気に入りの飲み物と一致させますが、飲み物の好みがわかっている友達に限定されます。

INNER JOINの例

テーブルを少し修正してみましょう:

CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE favorite_drinks (
id SERIAL PRIMARY KEY,
friend_id INTEGER,
drink VARCHAR(50)
);

INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie'), ('David');
INSERT INTO favorite_drinks (friend_id, drink) VALUES (1, 'Cola'), (2, 'Juice'), (3, 'Water');

次に、INNER JOINを実行します:

SELECT f.name, fd.drink
FROM friends f
INNER JOIN favorite_drinks fd ON f.id = fd.friend_id;

結果:

name drink
Alice Cola
Bob Juice
Charlie Water

Davidが結果に表示されないことに注意してください。彼はお気に入りの飲み物がリストにないからです。

LEFT OUTER JOIN

LEFT OUTER JOINとは?

LEFT OUTER JOINは、すべての友達がゲストリストに載るようにするものです。飲み物の好みがわかっていない人も含まれますが、デフォルトの飲み物か、飲み物なしになります。

LEFT OUTER JOINの例

INNER JOINの例と同じテーブルを使用します:

SELECT f.name, fd.drink
FROM friends f
LEFT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

結果:

name drink
Alice Cola
Bob Juice
Charlie Water
David NULL

Davidが含まれているのに注意してくださいが、飲み物はNULLです。これがLEFT OUTER JOINの魔法です!

RIGHT OUTER JOIN

RIGHT OUTER JOINとは?

RIGHT OUTER JOINはLEFT OUTER JOINの逆です。すべての飲み物がメニューに載るようにし、誰も選んでいない飲み物も含めます。

RIGHT OUTER JOINの例

飲み物が誰も選んでいない新しい飲み物を追加してみましょう:

INSERT INTO favorite_drinks (drink) VALUES ('Lemonade');

SELECT f.name, fd.drink
FROM friends f
RIGHT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

結果:

name drink
Alice Cola
Bob Juice
Charlie Water
NULL Lemonade

Lemonadeがリストに表示されていますが、誰もそれを好みとして選んでいません。

FULL OUTER JOIN

FULL OUTER JOINとは?

FULL OUTER JOINはパーティプランナーの夢です。すべての友達とすべての飲み物を含め、可能な場所では一致させ、一致しない場所ではNULLを使用します。

FULL OUTER JOINの例

SELECT f.name, fd.drink
FROM friends f
FULL OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

結果:

name drink
Alice Cola
Bob Juice
Charlie Water
David NULL
NULL Lemonade

これで完全な情報が得られます。すべての友達(Davidのように好みの飲み物がない人も)とすべての飲み物(友達が選んでいないLemonadeも)が含まれます。

結論

そして、みんな!私たちはPostgreSQLのJOINの世界を旅しました。全て包容するCROSS JOINから、包括的なFULL OUTER JOINまで、さまざまなJOINを選ぶのはまるでパーティの完璧なミックスを探すようなものです。情報をどのように組み合わせたいか、どのようにデータを結合したいかによって異なります。

これらのJOINを練習し、さまざまなシナリオを試してみてください。そうすれば、データベースパーティの中心人物になるでしょう!データ管理がこんなに楽しいとは思わなかったでしょうね?次回まで、お楽しみに!ハッピークエリ!

JOINの種類 説明
CROSS JOIN 最初のテーブルのすべての行を、2番目のテーブルのすべての行と結合
INNER JOIN 両方のテーブルに一致がある場合にのみ行を返す
LEFT OUTER JOIN 左側のテーブルのすべての行と右側のテーブルの一致した行を返す
RIGHT OUTER JOIN 右側のテーブルのすべての行と左側のテーブルの一致した行を返す
FULL OUTER JOIN いずれかのテーブルに一致がある場合にのみ行を返す

Credits: Image by storyset