モジュールのレッスン (1/4)
3 つ以上のテーブルでの JOIN
モジュール 3 では、2 テーブルを結合しました。現実世界のデータはほぼ
外部キーによってリンクされた 3 つ以上 のテーブルに常に分散しています:
ビジネス上の質問に答えるには、一連の人間関係をたどる必要があります。
それはまさにマルチテーブル JOIN が行うことです。
このモジュール以降、ecommerce データセットを使用します (顧客、
カテゴリ、製品、注文、注文品目、レビュー)。から探索できます
データセットから ecommerce を選択して Playground を作成します
ピッカー。
構文: JOIN のチェーン
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 の結果を取得し、それに次のテーブルをアタッチします。
-- 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 と組み合わせてレポートを作成します。
-- 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 にあります。経験則: **テーブルを追加しないでください
** は使用しないでください。パフォーマンスと可読性が損なわれます。
自分で試してみてください
定期的なコンセグナティ (ステータス = '配達済み') ごとに、クライアントからのほとんどの電子メール、および製品の量。トレコロン。 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 回の試行後に解決策が利用可能になります
復習演習
スペーサ合計 (数量 * 単価) ごとに上位 3 件のクライアントが一致します。期限: 電子メールと合計。合計デクレッサンテあたりのオルディナ、制限は 3 です。
ヒントを表示
JOIN 製品を提供することはできません: order_items の数量と単位価格のその già。
3 回の試行後に解決策が利用可能になります