メインコンテンツにスキップ
モジュール 5 · レッスン 1 / 4コース内の 17/57~12 min
モジュールのレッスン (1/4)

3 つ以上のテーブルでの JOIN

モジュール 3 では、2 テーブルを結合しました。現実世界のデータはほぼ 外部キーによってリンクされた 3 つ以上 のテーブルに常に分散しています: ビジネス上の質問に答えるには、一連の人間関係をたどる必要があります。 それはまさにマルチテーブル JOIN が行うことです。

このモジュール以降、ecommerce データセットを使用します (顧客、 カテゴリ、製品、注文、注文品目、レビュー)。から探索できます データセットから ecommerce を選択して Playground を作成します ピッカー。

構文: JOIN のチェーン

SQL
SELECT colonne
FROM   tabella_a
JOIN   tabella_b ON tabella_a.x = tabella_b.y
JOIN   tabella_c ON tabella_b.z = tabella_c.w
[JOIN  tabella_d ON …]
…;

各 JOIN はチェーンに「リンク」を追加します。エンジンは中間のリンクを取得します。 前の JOIN の結果を取得し、それに次のテーブルをアタッチします。

SQL
-- Per ogni riga d'ordine: cliente, prodotto e quantità.
SELECT c.email,
       p.name AS prodotto,
       oi.quantity
FROM   orders      AS o
JOIN   customers   AS c  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
JOIN   products    AS p  ON oi.product_id = p.id;

3 つの JOIN、4 つのテーブル。結果には、order_items ごとに 1 行が含まれます。 各注文の製品 — 顧客のメールアドレスと製品名が追加されます。

論理的な順序

エンジンはテーブルを左から右に結合します。 JOIN 条件は、 上記ですでに紹介されているテーブルを参照してください。読みやすくするために:

  • 質問の「メインテーブル」を最初に置きます (ここでは orders)。
  • 以下に従って、アクセスした順序で他のものを追加します。 関係。

JOIN チェーンを介した集約

複数の JOIN を GROUP BY と組み合わせてレポートを作成します。

SQL
-- Spesa totale per cliente (solo ordini consegnati):
SELECT c.email,
       SUM(oi.quantity * oi.unit_price) AS total
FROM   customers   AS c
JOIN   orders      AS o  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
WHERE  o.status = 'delivered'
GROUP BY c.email
ORDER BY total DESC;

ここでは JOIN products は必要ありません。必要なものはすべて揃っています (quantity、 unit_price) はすでに order_items にあります。経験則: **テーブルを追加しないでください ** は使用しないでください。パフォーマンスと可読性が損なわれます。

自分で試してみてください

運動#sql.m5.l1.e1
試行回数: 0読み込み中…

定期的なコンセグナティ (ステータス = '配達済み') ごとに、クライアントからのほとんどの電子メール、および製品の量。トレコロン。 Ordina per id ordine crescente e id prodotto crescente。

エディターを読み込み中…
ヒントを表示

3 つの JOIN: customer_id のorders→customers、order_id のorders→order_items、product_id のorder_items→products。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m5.l1.e2
試行回数: 0読み込み中…

スペーサ合計 (数量 * 単価) ごとに上位 3 件のクライアントが一致します。期限: 電子メールと合計。合計デクレッサンテあたりのオルディナ、制限は 3 です。

エディターを読み込み中…
ヒントを表示

JOIN 製品を提供することはできません: order_items の数量と単位価格のその già。

3 回の試行後に解決策が利用可能になります