一人前エンジニア道場

データベース設計 / 約25分

3テーブル結合: 複数テーブルをまたぐ集計

なぜこれを学ぶか

実務のDBは「顧客・注文・商品」のように3テーブル以上に分かれています。複数のJOINを連鎖させるパターンを習得すると、実務クエリの幅が一気に広がります。

複数JOINの書き方: FROM A JOIN B ON ... JOIN C ON ... のように JOIN を連鎖させます。追加するJOINごとに ON 条件を書きます。

3テーブル結合の読み方: まず FROM orders o でベーステーブルを決め、JOIN customers c ON o.customer_id = c.id で顧客を結合、JOIN products p ON o.product_id = p.id で商品を結合します。「注文」を中心に放射状に繋げるイメージです。

列の計算: SELECT 節で (o.quantity * p.price) AS subtotal のように演算式を書けます。これが集計なしで「各行の小計」を出す方法です。

テーブルの別名(エイリアス)が特に重要になります。c.name(顧客名)と p.name(商品名)のように同じ列名が複数テーブルに存在するとき、エイリアスなしでは ambiguous column name エラーになります。

重要ポイント

  • JOIN を連鎖させて複数テーブルを結合: JOIN A ON ... JOIN B ON ...
  • SELECT で演算式(qty * price)を書いて派生列を作れる
  • 同名列が複数テーブルにある場合は table.column で明示

理解度チェック

選ぶと即座に解説が表示されます。

3テーブル(orders, customers, products)を結合するとき、JOINの個数は?

ヒントを見る

「N個のテーブルを全て結合するのに必要なJOINの数」を考えてください。

SQL演習ブラウザ内SQLite

3つのテーブル(customers, orders, products)を結合して、「顧客名・商品名・数量・小計(数量×単価)」の一覧を小計の大きい順で取得してください。列は customer(顧客名), product(商品名), quantity(数量), subtotal(小計)です。

テーブル定義と初期データを見る
CREATE TABLE customers (id INTEGER PRIMARY KEY, name TEXT, city TEXT);
CREATE TABLE orders (id INTEGER PRIMARY KEY, customer_id INTEGER, product_id INTEGER, quantity INTEGER);
CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);
INSERT INTO customers VALUES (1, '田中', '東京'), (2, '佐藤', '大阪'), (3, '鈴木', '名古屋');
INSERT INTO products VALUES (1, 'ノートPC', 89800), (2, 'マウス', 2980), (3, 'キーボード', 5500);
INSERT INTO orders VALUES (1, 1, 1, 1), (2, 1, 2, 2), (3, 2, 3, 1), (4, 3, 1, 2), (5, 2, 1, 1);

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?