0Pricing
Coding Interview Prep · Pelajaran

HAVING vs WHERE

Bandingkan pemfilteran sebelum dan sesudah pengelompokan, serta klausa mana yang dapat melihat agregat.

HAVING vs WHERE adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Pertanyaan yang Akan Anda Dapatkan

“Apa perbedaan antara WHERE dan HAVING?” adalah salah satu pertanyaan wawancara SQL yang paling sering diajukan. Jawaban yang lemah mengatakan, “HAVING digunakan untuk agregat.” Jawaban yang kuat menjelaskan kapan setiap klausa dijalankan dalam alur pemrosesan kueri.

Pengaturan waktu itulah inti persoalannya: WHERE memfilter baris sebelum pengelompokan; HAVING memfilter grup setelah agregasi.

Posisinya dalam Urutan Eksekusi

Ingat kembali urutan eksekusi logis sebuah kueri:

  • FROM / JOIN → membentuk kumpulan baris
  • WHERE → memfilter setiap baris
  • GROUP BY → menggabungkan baris menjadi grup
  • HAVING → memfilter grup
  • SELECT → memproyeksikan kolom
  • ORDER BY → mengurutkan

WHERE dijalankan sebelum grup ada; HAVING dijalankan setelahnya, sehingga HAVING dapat melihat agregat sedangkan WHERE tidak.

WHERE Tidak Dapat Melihat Agregat

Karena WHERE dijalankan sebelum pengelompokan, belum ada nilai agregat yang dapat digunakannya. Menulis WHERE COUNT(*) > 5 merupakan galat sintaks di setiap basis data yang mengikuti standar.

Pewawancara sengaja menyisipkan baris ini untuk memeriksa apakah Anda memahami alur pemrosesan. Agregat tersebut belum ada saat WHERE dievaluasi.

-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;

HAVING Memfilter Grup

Pindahkan kondisi agregat ke HAVING dan kueri akan berhasil, karena HAVING dijalankan setelah grup beserta agregatnya dihitung.

Bacalah sebagai berikut: “kelompokkan karyawan, lalu pertahankan hanya departemen yang jumlahnya lebih dari lima.”

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

Tempatkan Filter Baris di WHERE

Kesalahan sebaliknya adalah memfilter baris mentah di HAVING. Hasilnya sering benar, tetapi cara ini lebih lambat dan menyesatkan, karena Anda mengelompokkan baris yang sebenarnya ingin dibuang.

Aturan praktis: memfilter berdasarkan nilai kolom mentah → WHERE. Memfilter berdasarkan agregat → HAVING. Memfilter baris lebih awal akan mengurangi data yang harus diproses oleh pengelompokan.

-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;

Kedua Klausa Bersama-sama

Kueri lengkap sering kali menggunakan keduanya. WHERE mempersempit baris terlebih dahulu; kemudian HAVING mempertahankan grup yang memenuhi syarat. Membacanya dari atas ke bawah sesuai dengan urutan logis.

Contoh: dari pesanan yang dibuat tahun ini, temukan pelanggan yang total belanjanya lebih dari 1000.

SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;

HAVING pada Kolom yang Tidak Diagregasi

HAVING dapat merujuk pada kolom pengelompokan, bukan hanya agregat. HAVING department = 'Sales' sah, tetapi tidak berguna: filter tersebut seharusnya ditempatkan di WHERE agar dijalankan lebih awal.

Jika pewawancara menunjukkan HAVING yang memfilter kolom biasa yang dikelompokkan, kritik yang diharapkan adalah “pindahkan ke WHERE agar lebih efisien.”

-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';

HAVING Tanpa GROUP BY

Berikut hal yang cukup halus: HAVING tetap sah meskipun tanpa GROUP BY. Seluruh tabel menjadi satu grup implisit, lalu HAVING memfilter grup tersebut.

Jika kondisi agregat salah, Anda mendapatkan nol baris; jika benar, Anda mendapatkan satu baris. Ini jarang berguna, tetapi pewawancara menanyakannya untuk memastikan Anda memahami konsep grup implisit.

-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;

Dapatkah HAVING Menggunakan Alias SELECT?

Seperti trik cakupan alias di bagian lain, setiap dialek memiliki perilaku berbeda. Postgres dan MySQL mengizinkan HAVING merujuk pada alias SELECT; SQL Server dan Oracle tidak.

Kebiasaan yang portabel adalah mengulangi ekspresi agregat di HAVING. Cara ini berfungsi di setiap mesin basis data dan menghindari kejutan dalam wawancara lintas basis data.

-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;

Sudut Pandang Kinerja

Untuk mengesankan pewawancara, hubungkan klausa tersebut dengan kinerja: WHERE mengurangi jumlah baris yang harus dipindai oleh mesin pengelompokan dan dapat menggunakan indeks; HAVING dijalankan pada grup yang sudah diagregasi, sehingga tidak dapat mengurangi biaya pengelompokan.

Kesimpulan yang ingin didengar pewawancara: dorong setiap filter sedini mungkin. Hanya kondisi yang benar-benar bergantung pada agregat yang memerlukan HAVING.

Jawaban Satu Kalimat

Hafalkan ini untuk wawancara: “WHERE memfilter baris sebelum pengelompokan dan tidak dapat melihat agregat; HAVING memfilter grup setelah agregasi dan merupakan satu-satunya klausa yang dapat menguji nilai agregat.”

Lanjutkan dengan daftar urutan eksekusi, dan Anda telah memberikan jawaban lengkap yang terdengar seperti jawaban kandidat senior.

Pemeriksaan Singkat

Tentukan klausa yang sesuai untuk setiap kondisi.

Rangkuman

WHERE: memfilter baris sebelum GROUP BY, dan agregat tidak diizinkan. HAVING: memfilter grup setelah agregasi, dan merupakan satu-satunya tempat kondisi agregat sah digunakan.

  • Tempatkan filter kolom mentah di WHERE agar lebih cepat dan dapat menggunakan indeks.
  • HAVING dapat merujuk pada kolom yang dikelompokkan, tetapi sebaiknya tidak digunakan untuk filter biasa.
  • HAVING dapat digunakan tanpa GROUP BY pada grup implisit seluruh tabel.
  • Ulangi ekspresi agregat di HAVING agar aman digunakan lintas dialek.

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 Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “HAVING vs WHERE”?

Bandingkan pemfilteran sebelum dan sesudah pengelompokan, serta klausa mana yang dapat melihat agregat. Kamu berlatih Coding Interview Prep 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 Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep 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 2 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 Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep 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

  1. Aturan GROUP BY untuk Kolom SELECT
  2. HAVING vs WHERE
  3. Mengelompokkan Berdasarkan Beberapa Kolom dan Ekspresi
  4. Menghitung dan Memfilter Grup
← Kembali ke Coding Interview Prep