Lompati ke konten utama
Modul 5 · Pelajaran 1 dari 417/57 dalam kursus~12 min
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

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

Setiap JOIN menambahkan "tautan" ke rantai: mesin mengambil perantara hasil GABUNG sebelumnya dan lampirkan tabel berikutnya ke dalamnya.

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;

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:

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;

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

Latihan#sql.m5.l1.e1
Upaya: 0Memuat…

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.

Memuat editor…
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

Latihan#sql.m5.l1.e2
Upaya: 0Memuat…

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.

Memuat editor…
Tunjukkan petunjuk

Non ti serve JOIN product: quantity dan unit_price sono già in order_items.

Solusi tersedia setelah 3 upaya