Lompat ke konten
Kembali ke modul

Data: Database dan SQL · 4/7

Join dan agregasi

Menggabungkan tabel, menghitung, dan mengelompokkan hasil — di sini SQL menunjukkan nilainya.

Baca 32 menit

Setelah pelajaran ini kamu bisa

  • Menjelaskan bedanya INNER dan LEFT JOIN
  • Memprediksi berapa row yang dihasilkan sebuah join
  • Mengelompokkan row dan menghitung total
  • Menjelaskan kenapa `SUM` atas nol row menghasilkan NULL, bukan nol

Normalisasi memecah datamu ke beberapa tabel. Join menyatukannya kembali untuk satu query. Inilah gunanya database relasional.

sql
-- INNER JOIN: only rows that match on both sides.
SELECT v.name, b.guest, b.nights
FROM bookings b
JOIN venues v ON v.id = b.venue_id
ORDER BY b.id;
Output sungguhan: 4 row — Villa Sunset/Dedi/3, Villa Sunset/Eka/2, Villa Rain/Fajar/5, Villa Sunset/Gita/1. Kos Melati tidak muncul sama sekali, karena ia tidak punya booking.
sql
-- LEFT JOIN: every row from the left table, matched or not.
SELECT v.name, b.guest
FROM venues v
LEFT JOIN bookings b ON b.venue_id = v.id
ORDER BY v.id, b.id;
Output sungguhan: 5 row. Empat yang sama, plus Kos Melati dengan guest = NULL. NULL itulah cara database menyatakan "tidak ada yang cocok".
Coba sendiri

Kedua join diimplementasikan di atas array. Jumlah row-nya adalah intinya.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Agregasi dan GROUP BY

sql
SELECT v.name,
       COUNT(b.id)   AS bookings,
       SUM(b.nights) AS total_nights
FROM venues v
LEFT JOIN bookings b ON b.venue_id = v.id
GROUP BY v.id
ORDER BY v.id;
Output sungguhan: Villa Sunset 3 booking / 6 malam, Villa Rain 1 / 5, dan Kos Melati 0 booking / total_nights NULL. Perhatikan COUNT memberi 0 tapi SUM memberi NULL.
AgregasiMengembalikanAtas nol row
COUNT(*)Jumlah row0
COUNT(col)Row di mana col tidak NULL0
SUM(col)TotalNULL
AVG(col)Rata-rataNULL
MIN / MAXTerkecil / terbesarNULL

WHERE versus HAVING

WHERE menyaring row sebelum pengelompokan. HAVING menyaring kelompok sesudahnya. Kamu tidak bisa memakai agregasi di WHERE, karena pada saat itu kelompoknya belum ada.

sql
-- Venues with more than one booking.
SELECT v.name, COUNT(b.id) AS n
FROM venues v
JOIN bookings b ON b.venue_id = v.id
GROUP BY v.id
HAVING COUNT(b.id) > 1;

-- Total revenue from paid bookings. WHERE filters rows first.
SELECT SUM(b.nights * v.price_per_night) AS revenue
FROM bookings b
JOIN venues v ON v.id = b.venue_id
WHERE b.paid = 1;
Output terverifikasi: yang pertama mengembalikan satu row, Villa Sunset dengan 3. Yang kedua mengembalikan revenue = 5900000 — yaitu (3×850000) + (5×500000) + (1×850000), dengan booking Eka yang belum dibayar dikecualikan.

Tugas praktik

Terhadap database proyek ini, tulis query yang mendaftar setiap user beserta jumlah pelajaran yang sudah diselesaikannya, termasuk user yang belum menyelesaikan apa pun. Lalu tambahkan klausa HAVING untuk menampilkan hanya yang lebih dari dua. Pastikan user tanpa progres hilang saat kamu mengganti LEFT JOIN jadi JOIN.

Hasil yang diharapkan

Sebuah LEFT JOIN plus GROUP BY, dan user tanpa progres hilang saat memakai inner join.

Cek pemahaman

Sebuah LEFT JOIN menghasilkan venue tanpa booking. Apa yang dikembalikan SUM(b.nights) untuknya?

Pilih jawaban dulu