HAVING vs WHERE
Bedakan HAVING (menyaring kelompok) dari WHERE (menyaring baris), dan terapkan keduanya dengan benar dalam kueri yang sama.
HAVING vs WHERE adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Dua Tahap Penyaringan
WHERE menyaring setiap baris secara individual BEFORE pengelompokan. HAVING menyaring grup AFTER agregasi. Keduanya terlihat mirip, tetapi bekerja pada tahap yang berbeda.
Contoh WHERE
WHERE menyaring baris mentah. WHERE tidak dapat melihat hasil agregasi:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;Contoh HAVING
HAVING menyaring grup. HAVING dapat merujuk pada hasil agregasi:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersMenggabungkan WHERE dan HAVING
Keduanya dapat digunakan dalam kueri yang sama:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;Jangan Menempatkan Agregasi dalam WHERE
Perencana kueri menjalankan WHERE sebelum pengelompokan—hasil agregasi belum tersedia:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Pindahkan Predikat ke WHERE Jika Memungkinkan
WHERE menyaring data sebelum pengelompokan, sehingga lebih sedikit baris yang masuk ke proses agregasi. Gunakan HAVING hanya untuk kondisi yang tidak dapat dinyatakan dalam WHERE.
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;Urutan Eksekusi Logis
Urutan konseptual:
FROM— pilih tabel dan lakukan penggabunganWHERE— saring barisGROUP BY— buat grupHAVING— saring grupSELECT— proyeksikan kolomORDER BY— urutkanLIMIT— ambil N teratas
HAVING tanpa GROUP BY
Anda dapat menggunakan HAVING tanpa GROUP BY—seluruh tabel menjadi satu grup:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MAlias dalam HAVING
Beberapa basis data mengizinkan HAVING merujuk pada alias SELECT; PostgreSQL dan MySQL mengizinkannya, sedangkan SQL standar tidak. Cara yang paling portabel adalah mengulangi fungsi agregatnya:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQLHAVING dengan Beberapa Agregasi
Gunakan HAVING untuk kondisi gabungan pada hasil agregasi:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;Catatan Performa
Penyaring agregat dalam HAVING tidak dapat menggunakan indeks dengan cara yang sama seperti WHERE pada kolom. Pindahkan kondisi yang memungkinkan ke WHERE.
Ringkasan
WHERE = menyaring baris. HAVING = menyaring grup.
- Gunakan agregasi hanya dalam HAVING, jangan dalam WHERE
- Pindahkan predikat ke WHERE agar lebih cepat
- Gunakan keduanya jika diperlukan
Pemeriksaan Singkat
Anda ingin mendapatkan pengguna yang telah membuat lebih dari 10 pesanan. Klausa mana yang digunakan untuk menyaringnya?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “HAVING vs WHERE” gratis?
Ya — teks lengkap “HAVING vs WHERE” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “HAVING vs WHERE”?
Bedakan HAVING (menyaring kelompok) dari WHERE (menyaring baris), dan terapkan keduanya dengan benar dalam kueri yang sama. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “HAVING vs WHERE” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY untuk Satu dan Banyak Kolom
- HAVING vs WHERE
- Jebakan Umum: NULL dalam Agregat