Perbezaan antara klausa HAVING dan WHERE dalam pertanyaan agregat SQL
Memahami perbezaan antara klausa HAVING dan WHERE adalah penting apabila bekerja dengan data agregat. Artikel ini akan menyelami senario pertanyaan biasa dan menerangkan sebab satu kaedah mengembalikan hasil yang betul dan satu lagi tidak.
Konteks pertanyaan
Diberi jadual berikut:
Matlamatnya adalah untuk mencari pengajar dengan kepakaran terbanyak.
Percubaan gagal untuk menggunakan klausa WHERE
Percubaan pertanyaan gagal untuk menggunakan klausa WHERE untuk menapis hasil berdasarkan bilangan jurusan:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Pertanyaan ini gagal menghasilkan hasil yang diharapkan kerana klausa WHERE tidak sesuai untuk menggunakan syarat pada nilai agregat.
Pertanyaan yang berjaya menggunakan klausa HAVING
Pertanyaan yang berjaya menggunakan klausa HAVING sebaliknya:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
Sebab kenapa HAVING berjaya
Klausa HAVING digunakan khusus untuk menapis hasil pertanyaan agregat. Ia menggunakan syarat selepas operasi GROUP BY, membolehkan kami menyemak bilangan jurusan untuk setiap pengajar.
Peraturan praktikal
Secara umumnya, gunakan WHERE sebelum GROUP BY untuk menapis baris individu dan gunakan HAVING selepas GROUP BY untuk menapis hasil agregat.
Pertanyaan dipertingkat menggunakan ANSI JOIN
Versi pertanyaan alternatif menggunakan sintaks ANSI JOIN juga disediakan:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>
Versi ini menghapuskan penggunaan WHERE untuk syarat menyertai dan sebaliknya menggunakan JOIN.
Atas ialah kandungan terperinci HAVING vs. WHERE dalam SQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Pengagregatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!