Ana içeriğe geç
Modül 5 · Ders 1 ders 4Kurstaki 17/57~12 min
Modül dersleri (1/4)

Üç veya daha fazla tablodaki JOIN'ler

Modül 3'te iki tabloyu birleştirdiniz. Gerçek dünyada veriler neredeyse her zaman yabancı anahtarlarla bağlantılı üç veya daha fazla tabloya dağılmış durumdadır: Bir iş sorusunu yanıtlamak için ilişkiler zincirini geçmeniz gerekir. Çoklu tablo JOIN tam olarak bunu yapar.

Bu modülden itibaren ecommerce veri kümesini kullanacağız (müşteriler, kategoriler, ürünler, siparişler, sipariş öğeleri, incelemeler). Buradan keşfedebilirsiniz veri kümesinden ecommerce seçerek Oyun Alanı seçici.

Sözdizimi: JOIN zinciri

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 …]
…;

Her JOIN zincire bir "bağlantı" ekler: motor ara bağlantıyı alır önceki JOIN'lerin sonucunu alır ve bir sonraki tabloyu buna ekler.

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;

Üç JOINs, dört tablo. Sonuçta her order_items için bir satır bulunur — her biri her siparişte ürün - müşteri e-postası ve ürün adıyla zenginleştirilmiştir.

Mantıksal sıra

Motor, tabloları soldan sağa birleştirir. Bir JOIN koşulu şu şekilde olabilir: yukarıda tanıtılan herhangi bir tabloya bakın. Okunabilirlik için:

  • sorunun "ana tablosunu" ilk sıraya koyun (burada orders);
  • aşağıdaki yönergeleri izleyerek diğerlerini ziyaret ettiğiniz sıraya göre ekleyin ilişkiler.

JOIN zincirleri üzerinde toplanır

Çoklu JOIN'ler GROUP BY ile birleşerek raporlar üretir:

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;

Burada JOIN products'ye ihtiyacınız yok: ihtiyacınız olan her şey (quantity, unit_price) zaten order_items'de. Temel kural: tablo eklemeyin kullanmazsınız — performansa ve okunabilirliğe zarar verirler.

Kendin dene

Egzersiz#sql.m5.l1.e1
Denemeler: 0Yükleniyor…

Siparişin genel düzenine göre (durum = 'teslim edildi'), müşteri e-postalarının çoğu, ürün adı ve miktarı. Tre koloni. Hilal şeklinde bir düzen ve hilal şeklinde bir ürün.

Düzenleyici yükleniyor…
İpucu göster

Üç JOIN: siparişler→müşteri_id'deki müşteriler, order_id'deki siparişler→order_items, order_items→product_id'deki ürünler.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m5.l1.e2
Denemeler: 0Yükleniyor…

Toplam sipariş başına ilk 3 müşteri (bir miktar * birim_fiyat) tek başına. Son sütun: e-posta ve toplam. Toplam azalış başına ordina, a 3 ile sınırlıdır.

Düzenleyici yükleniyor…
İpucu göster

JOIN ürünleri sunulmuyor: miktar ve birim_fiyat ve sipariş_ürünlerinde.

3 denemeden sonra çözüm mevcut