HAVING berbanding WHERE
Menapis sebelum pengumpulan berbanding selepasnya, serta klausa yang melihat agregat
HAVING berbanding WHERE ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Soalan yang Akan Anda Terima
'Apakah perbezaan antara WHERE dan HAVING?' ialah salah satu soalan temu duga SQL yang paling kerap ditanya. Jawapan yang lemah mengatakan 'HAVING adalah untuk nilai agregat.' Jawapan yang kukuh menerangkan bila setiap klausa dilaksanakan dalam saluran pemprosesan pertanyaan.
Masa pelaksanaan itu merangkumi keseluruhan perkara: WHERE menapis baris sebelum pengumpulan; HAVING menapis kumpulan selepas pengagregatan.
Kedudukannya dalam Susunan Pelaksanaan
Ingat semula susunan pelaksanaan logik bagi sesuatu pertanyaan:
FROM/JOIN→ membina set barisWHERE→ menapis baris individuGROUP BY→ menggabungkan baris menjadi kumpulanHAVING→ menapis kumpulanSELECT→ memilih lajurORDER BY→ menyusun
WHERE berlaku sebelum kumpulan wujud; HAVING berlaku selepas itu, jadi HAVING boleh melihat nilai agregat manakala WHERE tidak boleh.
WHERE Tidak Boleh Melihat Nilai Agregat
Oleh sebab WHERE dilaksanakan sebelum pengumpulan, ia belum mempunyai nilai agregat. Menulis WHERE COUNT(*) > 5 ialah ralat sintaks dalam setiap pangkalan data piawai.
Penemu duga sengaja memasukkan baris tepat ini untuk menyemak sama ada Anda memahami saluran pemprosesan. Nilai agregat belum wujud apabila WHERE dinilai.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING Menapis Kumpulan
Pindahkan syarat agregat ke HAVING dan ia akan berfungsi, kerana HAVING dilaksanakan selepas kumpulan dan nilai agregatnya dikira.
Fahami seperti ini: 'kumpulkan pekerja mengikut jabatan, kemudian kekalkan hanya jabatan yang bilangannya melebihi lima.'
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Letakkan Penapis Baris dalam WHERE
Kesilapan yang bertentangan ialah menapis baris mentah dalam HAVING. Cara ini sering memberikan jawapan yang betul tetapi lebih perlahan dan mengelirukan, kerana Anda mengumpulkan baris yang sebenarnya ingin dibuang.
Petua umum: tapis berdasarkan nilai lajur mentah → WHERE. Tapis berdasarkan nilai agregat → HAVING. Penapisan baris pada peringkat awal mengecilkan data yang perlu diproses oleh pengumpulan.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Kedua-dua Klausa Bersama
Pertanyaan lengkap sering menggunakan kedua-duanya. WHERE mengecilkan baris terlebih dahulu; kemudian HAVING mengekalkan kumpulan yang memenuhi syarat. Membacanya dari atas ke bawah sepadan dengan susunan logik.
Contoh berjawapan: dalam kalangan pesanan yang dibuat pada tahun ini, cari pelanggan yang berbelanja lebih daripada 1000 secara keseluruhan.
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 Lajur Bukan Agregat
HAVING boleh merujuk lajur pengumpulan, bukan hanya nilai agregat. HAVING department = 'Sales' adalah sah tetapi tidak berguna: penapis itu sepatutnya diletakkan dalam WHERE supaya dilaksanakan lebih awal.
Jika penemu duga menunjukkan HAVING yang menapis lajur biasa yang dikumpulkan, kritikan yang dijangka ialah 'pindahkannya ke WHERE untuk kecekapan.'
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';HAVING Tanpa GROUP BY
Ini satu perkara yang halus: HAVING adalah sah walaupun tanpa GROUP BY. Seluruh jadual menjadi satu kumpulan tersirat, dan HAVING menapis kumpulan tunggal itu.
Jika syarat agregat adalah palsu, Anda mendapat sifar baris; jika benar, satu baris. Jarang berguna, tetapi penemu duga menanyakannya untuk mengesahkan bahawa Anda memahami konsep kumpulan tersirat.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;Bolehkah HAVING Menggunakan Alias SELECT?
Seperti helah skop alias di tempat lain, dialek berbeza-beza. Postgres dan MySQL membenarkan HAVING merujuk alias SELECT; SQL Server dan Oracle tidak.
Amalan mudah alih yang sesuai ialah mengulangi ungkapan agregat dalam HAVING. Cara ini berfungsi dalam setiap enjin dan mengelakkan kejutan dalam temu duga merentas pangkalan 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;Pertimbangan Prestasi
Untuk memberikan kesan yang baik, kaitkan klausa dengan prestasi: WHERE mengurangkan baris yang perlu diimbas oleh enjin pengumpulan dan boleh menggunakan indeks; HAVING dilaksanakan pada kumpulan yang sudah diagregatkan, jadi ia tidak dapat mengurangkan kos pengumpulan.
Kesimpulan yang ingin didengar oleh penemu duga: letakkan setiap penapis seawal yang mungkin. Hanya syarat yang benar-benar bergantung pada nilai agregat memerlukan HAVING.
Jawapan Satu Ayat
Hafalkan ini untuk temu duga: 'WHERE menapis baris sebelum pengumpulan dan tidak boleh melihat nilai agregat; HAVING menapis kumpulan selepas pengagregatan dan merupakan satu-satunya klausa yang boleh menguji nilai agregat.'
Susuli dengan senarai susunan pelaksanaan dan Anda telah memberikan jawapan lengkap yang kedengaran seperti calon berpengalaman.
Semakan Pantas
Tentukan klausa yang sepatutnya digunakan bagi setiap syarat.
Imbas Kembali
WHERE: menapis baris sebelum GROUP BY, nilai agregat tidak dibenarkan. HAVING: menapis kumpulan selepas pengagregatan, satu-satunya tempat syarat agregat adalah sah.
- Letakkan penapis lajur mentah dalam WHERE untuk kelajuan dan penggunaan indeks.
- HAVING boleh merujuk lajur yang dikumpulkan, tetapi tidak sepatutnya digunakan untuk penapis biasa.
- HAVING berfungsi tanpa GROUP BY pada kumpulan tersirat seluruh jadual.
- Ulangi ungkapan agregat dalam HAVING untuk keselamatan merentas dialek.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “HAVING berbanding WHERE” percuma?
Ya — teks penuh “HAVING berbanding WHERE” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “HAVING berbanding WHERE”?
Menapis sebelum pengumpulan berbanding selepasnya, serta klausa yang melihat agregat Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “HAVING berbanding WHERE” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?
Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Peraturan GROUP BY untuk Lajur SELECT
- HAVING berbanding WHERE
- Mengumpulkan Mengikut Pelbagai Lajur dan Ungkapan
- Mengira dan Menapis Kumpulan