Pelajaran modul (1/4)
GABUNG pada tiga tabel atau lebih
Di Modul 3 Anda bergabung dengan dua tabel. Di dunia nyata, datanya hampir sama
selalu tersebar di tiga atau lebih tabel yang ditautkan dengan kunci asing: ke
menjawab pertanyaan bisnis Anda harus melintasi rantai hubungan.
Itulah tepatnya yang dilakukan oleh multi-tabel JOIN.
Mulai modul ini kita akan menggunakan kumpulan data ecommerce (pelanggan,
kategori, produk, pesanan, item pesanan, ulasan). Anda dapat menjelajahinya dari
Taman Bermain dengan memilih ecommerce dari kumpulan data
pemetik.
Sintaksnya: rantai GABUNG
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 …]
…;Setiap JOIN menambahkan "tautan" ke rantai: mesin mengambil perantara
hasil GABUNG sebelumnya dan lampirkan tabel berikutnya ke dalamnya.
-- 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;Tiga JOINs, empat tabel. Hasilnya memiliki satu baris per order_items — masing-masing
produk di setiap pesanan — diperkaya dengan email pelanggan dan nama produk.
Urutan yang logis
Mesin menggabungkan tabel dari kiri ke kanan. Kondisi JOIN bisa
referensi tabel apa pun yang sudah diperkenalkan di atas. Untuk keterbacaan:
- letakkan "tabel utama" pertanyaan terlebih dahulu (di sini
orders); - tambahkan yang lain sesuai urutan kunjungan Anda dengan mengikuti hubungan.
Agregat melalui rantai GABUNG
Multi JOIN digabungkan dengan GROUP BY untuk menghasilkan laporan:
-- 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;Anda tidak memerlukan JOIN products di sini: semua yang Anda perlukan (quantity,
unit_price) sudah ada di order_items. Aturan praktisnya: jangan menambahkan tabel
Anda tidak menggunakan — hal ini mengganggu kinerja dan keterbacaan.
Cobalah sendiri
Setiap kali Anda menerima pesanan dari pelanggan (status = 'terkirim'), kirim email ke klien, nama produk, dan jumlah. Tiga tiang. Ordina per id ordine crescente dan id prodotto crescente.
Tunjukkan petunjuk
Tiga GABUNG: pesanan→pelanggan di id_pelanggan, pesanan→barang_pesanan di id_pesanan, barang_pesanan→produk di id_produk.
Solusi tersedia setelah 3 upaya
Tinjau latihan
3 klien teratas untuk total pesanan (jumlah kuantitas * harga_unit) hanya untuk pesanan yang dipesan. Titik akhir: email dan total. Ordina per total penurunan, limita a 3.
Tunjukkan petunjuk
Non ti serve JOIN product: quantity dan unit_price sono già in order_items.
Solusi tersedia setelah 3 upaya