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
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.
-- 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:
-- 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
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.
İ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
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.
İpucu göster
JOIN ürünleri sunulmuyor: miktar ve birim_fiyat ve sipariş_ürünlerinde.
3 denemeden sonra çözüm mevcut