0Pricing
SQL Academy · レッスン

なぜJOINが必要か(リレーショナルモデルの復習)

リレーショナルモデル、正規化されたテーブル、外部キーを復習し、テーブル間のデータを再結合する橋渡し役がJOINである理由を学びます。

「なぜJOINが必要か(リレーショナルモデルの復習)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

正規化を図で理解する

データを重複させる代わりに、複数のテーブルに分割します:

  • users — id、name、email
  • orders — id、user_id、total

各注文は、ユーザーの名前やメールアドレスを再度保存するのではなく、idでユーザーを参照します。

なぜ正規化するのか

メリット:

  • 重複がない — ユーザーのメールアドレスを1か所で変更できます
  • テーブルが小さい — キャッシュヒット率が向上します
  • 制約によってリレーションシップを適用できます

外部キーでリンクを定義する

リンクはFOREIGN KEYで宣言します:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id),
  total NUMERIC(10,2) NOT NULL
);

JOINによるデータの再構成

「各注文にユーザーの名前を表示する」には、テーブルを再びJOINして結合します:

SELECT o.id, o.total, u.full_name, u.email
FROM orders o
JOIN users u ON u.id = o.user_id
ORDER BY o.id;

メンタルモデル:絞り込まれた直積

JOINの概念上の動作:

  1. 2つのテーブルの直積を作ります(Aのすべての行とBのすべての行を組み合わせます)
  2. ON条件がTRUEになる組み合わせだけを残します

実際には、データベースはハッシュ結合、マージ結合、またはネステッドループ結合を使用しますが、結果は同じです。

1対多

1人のユーザーは複数の注文を持てます。「多」の側が外部キーを持ちます。

-- Each order row points back to its user:
SELECT u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email;

結合テーブルによる多対多

タグ ↔ 投稿:3つ目のテーブルを追加します:

CREATE TABLE posts (id BIGSERIAL PRIMARY KEY, title TEXT);
CREATE TABLE tags  (id BIGSERIAL PRIMARY KEY, name TEXT);
CREATE TABLE post_tags (
  post_id BIGINT REFERENCES posts(id),
  tag_id  BIGINT REFERENCES tags(id),
  PRIMARY KEY (post_id, tag_id)
);

多対多のクエリ

すべてを結合するには、2回JOINします:

SELECT p.title, t.name
FROM posts p
JOIN post_tags pt ON pt.post_id = p.id
JOIN tags      t  ON t.id = pt.tag_id
WHERE t.name = 'sql';

非正規化するタイミング

非正規化(データの重複)は、パフォーマンス向上のために使用されることがあります。計算済み合計のキャッシュ、全文検索用の列、マテリアライズドビューなどがその例です。まず正規化して設計し、計測したうえで非正規化してください。

JOINとサブクエリ

多くのJOINクエリはサブクエリで書き換えられ、その逆も可能です。読みやすい方を使用してください。最新のプランナーでは、同じ実行計画になることがよくあります。

外部キーは自動的には適用されない

REFERENCESを使って宣言する必要があります。外部キー制約があっても、外部キー列にインデックスを付けるのはあなたの仕事です。JOINのパフォーマンスのために、明示的にインデックスを作成してください。

まとめ

JOINは、整合性を保つためにテーブル間へ分割したデータを再構成します。

  • 外部キーでリンクを宣言します
  • クエリ実行時にJOINで正規化を元に戻します
  • 1対多では「多」の側に外部キーを置き、多対多では結合テーブルを使用します

確認問題

usersとordersの1対多のリレーションシップでは、どちらのテーブルが外部キー列を持ちますか?

よくある質問

「なぜJOINが必要か(リレーショナルモデルの復習)」レッスンは無料ですか?

はい。「なぜJOINが必要か(リレーショナルモデルの復習)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「なぜJOINが必要か(リレーショナルモデルの復習)」で何を学びますか?

リレーショナルモデル、正規化されたテーブル、外部キーを復習し、テーブル間のデータを再結合する橋渡し役がJOINである理由を学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「なぜJOINが必要か(リレーショナルモデルの復習)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. なぜJOINが必要か(リレーショナルモデルの復習)
  2. INNER JOINの仕組み
  3. LEFT/RIGHT JOINとOUTER JOIN
  4. 自己結合と別名
← SQL Academyに戻る