Rumah >pangkalan data >tutorial mysql >HAVING vs. WHERE dalam SQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Pengagregatan?

HAVING vs. WHERE dalam SQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Pengagregatan?

Barbara Streisand
Barbara Streisandasal
2025-01-21 09:53:09418semak imbas

HAVING vs. WHERE in SQL: When Should I Use Each Clause for Aggregation?

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:

  • Pensyarah (Lajur: LectID, Fname, Lname, ijazah)
  • Pengkhususan_Pensyarah (Lajur: LectID, Kepakaran)

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn