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.
-- 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;Kos Melati tidak muncul sama sekali, karena ia tidak punya booking.-- 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;Kos Melati dengan guest = NULL. NULL itulah cara database menyatakan "tidak ada yang cocok".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
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;COUNT memberi 0 tapi SUM memberi NULL.| Agregasi | Mengembalikan | Atas nol row |
|---|---|---|
COUNT(*) | Jumlah row | 0 |
COUNT(col) | Row di mana col tidak NULL | 0 |
SUM(col) | Total | NULL |
AVG(col) | Rata-rata | NULL |
MIN / MAX | Terkecil / terbesar | NULL |
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.
-- 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;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
Pilih jawaban dulu