Soal 1Saat kamu menentukan GROUP BY name, berapa banyak baris hasilnya (tabel score / 10 nama berbeda)?
GROUP BY dan HAVING — Agregat per Grup
Pelajari SQL GROUP BY dan HAVING: agregat per grup, menyaring grup dengan HAVING, dan perbedaannya dengan WHERE — dipraktikkan pada data nilai CSV, langsung di browser kamu.
Data yang dipakai di artikel ini — tabel score
Di artikel sebelumnya kamu menciutkan seluruh tabel menjadi satu nilai. `GROUP BY` di artikel ini (pengelompokan — mengumpulkan baris yang punya nilai sama ke dalam satu grup) menjalankan agregat per grup dan mengembalikan satu baris agregat per grup. Selain itu, `HAVING` memungkinkan kamu menyaring hasil agregat, seperti "hanya grup yang rata-ratanya 80 atau lebih".
Subjeknya adalah tabel score yang sama seperti sebelumnya (30 baris = 10 orang × 3 mata pelajaran). Mengelompokkan berdasarkan name menghasilkan 10 grup, dan mengelompokkan berdasarkan subject menghasilkan 3 grup.
GROUP BY — mengagregasi per grup
Saat kamu menulis GROUP BY kolom, baris yang punya nilai sama di kolom itu dikumpulkan ke dalam satu grup, dan fungsi agregat dihitung sekali per grup. Dengan SELECT name, AVG(score) FROM score GROUP BY name;, 3 baris dengan nama yang sama (satu per mata pelajaran) membentuk satu grup, dan kamu mendapat satu baris rata-rata per nama. Satu-satunya "kolom biasa" yang bisa kamu taruh di SELECT adalah kolom yang disebut di `GROUP BY`; kolom lain harus dibungkus dalam fungsi agregat (karena nilainya tidak tunggal di dalam satu grup).
AVG(score) dihitung per grup. Dengan 10 orang, hasilnya 10 baris.-- Jumlah / rata-rata / nilai tertinggi per mata pelajaran (3 grup per subject)
SELECT
subject,
COUNT(*) AS row_count,
ROUND(AVG(score), 1) AS avg_score,
MAX(score) AS top_score
FROM score
GROUP BY subject;
HAVING — menyaring hasil agregat
Setelah agregat grup, kadang kamu ingin menyaring berdasarkan nilai agregat, seperti "hanya tampilkan grup yang rata-ratanya 80 atau lebih". Kamu tidak bisa melakukan ini dengan WHERE. WHERE adalah klausa yang menilai baris individual sebelum pengelompokan, jadi agregat grup seperti AVG(score) belum dihitung. Di situlah `HAVING` berperan. HAVING ditulis setelah GROUP BY dan menilai kondisinya terhadap hasil agregat grup. Menulis HAVING AVG(score) >= 80 hanya menyisakan grup yang rata-ratanya 80 atau lebih.
GROUP BY mengagregasi menjadi 10 grup, lalu HAVING AVG(score) >= 80 menilai grup yang sudah diagregasi dan hanya menyisakan yang memenuhi kondisi.-- Hanya nama yang rata-ratanya melebihi 85 (HAVING menilai nilai agregat)
SELECT
name,
ROUND(AVG(score), 2) AS avg_score
FROM score
GROUP BY name
HAVING AVG(score) > 85;
WHERE vs. HAVING — menyaring baris, atau menyaring grup
WHERE dan HAVING keduanya penyaring, tetapi mereka bekerja pada waktu yang berbeda. WHERE menilai baris individual dan membuangnya sebelum pengelompokan. HAVING menilai per grup dan membuangnya setelah pengelompokan dan agregasi. Urutan eksekusinya adalah FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
Kamu juga bisa memakai keduanya sekaligus. Dalam kasus itu alurnya adalah "persempit baris target dengan WHERE, lalu kelompokkan, lalu saring hasil agregat dengan HAVING". Misalnya, untuk mendapat "orang yang rata-rata per namanya 80 atau lebih, hanya mempertimbangkan Math dan English", kamu mempersempit baris dengan WHERE subject IN ('Math','English') dan mempersempit grup dengan HAVING AVG(score) >= 80.
WHERE menilai baris pada kolom biasa dan membuangnya sebelum pengelompokan, sedangkan HAVING menilai grup pada nilai agregat (AVG, dll.) dan membuangnya setelah pengelompokan. Inti pentingnya adalah di mana hal-hal dibuang. Contoh: WHERE subject='Math' (menyaring baris) dan HAVING AVG(score)>=80 (menyaring grup).-- Pakai WHERE dan HAVING bersama
-- Kecualikan Science, sisakan hanya nama yang rata-ratanya 80 atau lebih
SELECT
name,
ROUND(AVG(score), 2) AS avg_two
FROM score
WHERE subject <> 'Science'
GROUP BY name
HAVING AVG(score) >= 80;
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Saat kamu ingin mengekstrak "hanya orang yang rata-rata per namanya 80 atau lebih", kondisi 80 atau lebih masuk ke klausa mana?
Soal 3Pernyataan mana yang dengan benar menjelaskan perbedaan antara WHERE dan HAVING?