Kodokon kodokon.com

INNER JOIN:二つのテーブルをつなぐ

INNER JOIN、読みやすいエイリアス、そして正確な結合条件を使って、二つのテーブルのデータを突き合わせましょう。

7 分 · 3 問

このレッスンを Kodokon で開く

現実のデータベースは、すべてを一つのテーブルに保存することは決してありません。顧客は一方に、その注文はもう一方に置かれます。このモジュールを練習するには、ブラウザで sqliteonline.com を開くか(インストール不要)、ターミナルで sqlite3 ツールを起動しましょう。まず下のスクリプトを貼り付けてください。このレッスンで使う二つのテーブルを作成します。

SQL
CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  amount REAL NOT NULL,
  ordered_at TEXT NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'Alice', 'Lyon'),
  (2, 'Karim', 'Paris'),
  (3, 'Mina', 'Nantes');

INSERT INTO orders
  (id, customer_id, amount, ordered_at)
VALUES
  (1, 1, 49.90, '2026-06-01'),
  (2, 1, 15.00, '2026-06-12'),
  (3, 2, 120.50, '2026-06-15');
開始スクリプト:続く例の前に実行してください。

INNER JOIN は、ON の後ろに書かれた一致条件にしたがって、二つのテーブルを一行ずつ組み合わせます。ここでは、各注文が、その customer_idid が等しい顧客に結びつけられます。一致しない行は結果から除かれます。何も注文していないMinaは現れません。

SQL
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON customers.id = orders.customer_id;
各注文と、その顧客の名前をあわせて表示する。

テーブルの完全な名前を繰り返すのは、すぐに読みにくくなります。AS で宣言するエイリアスは、クエリの間だけテーブルの名前を付け替えます。あいまいな列には必ず接頭辞を付けましょう。id は両方のテーブルに存在するので、c.ido.id と書き、id 単体では決して書きません。

SQL
SELECT c.name, o.amount, o.ordered_at
FROM orders AS o
INNER JOIN customers AS c
  ON c.id = o.customer_id
WHERE o.amount > 20
ORDER BY o.amount DESC;
短いエイリアス、フィルター、そして並べ替え。典型的な実務のクエリです。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. 結合において、二つのテーブルの間の一致条件を導くキーワードはどれですか?
    • WHERE
    • ON
    • HAVING
    • MATCH
  2. customers と orders の INNER JOIN で、注文のない顧客はどうなりますか?
    • 列がNULLになって現れる
    • 結果に現れない
    • クエリが失敗する
  3. customers と orders を結合するクエリで、id ではなく c.id と書くのはなぜですか?
    • クエリの実行を速くするため
    • id が両方のテーブルに存在し、あいまいになるため
    • SQLiteがすべての列に対してそれを要求するため