Rumah >pangkalan data >tutorial mysql >SQL HAVING lwn. WHERE: Bila Untuk Menggunakan Setiap Klausa untuk Penapisan Data?

SQL HAVING lwn. WHERE: Bila Untuk Menggunakan Setiap Klausa untuk Penapisan Data?

Linda Hamilton
Linda Hamiltonasal
2025-01-21 09:56:09985semak imbas

SQL HAVING vs. WHERE: When to Use Each Clause for Data Filtering?

Penapisan data SQL: Perbezaan antara klausa WHERE dan HAVING

Klausa HAVING dan WHERE dalam SQL kedua-duanya digunakan untuk menapis data, tetapi fungsinya berbeza. Klausa WHERE berfungsi pada baris individu, manakala klausa HAVING berfungsi pada hasil agregat.

Contoh perbezaan

Andaikan kami mempunyai dua jadual: Lecturers dan Lecturers_Specialization, dan kami ingin mencari pensyarah yang mempunyai bidang kepakaran yang paling banyak.

Pertanyaan awal menggunakan klausa WHERE tidak memberikan hasil yang diharapkan:

<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>

Ini kerana klausa WHERE menapis satu baris dan perbandingan COUNT(S.Expertise) >= ALL tidak boleh digunakan pada satu baris.

Pertanyaan yang betul menggunakan klausa HAVING:

<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>
Klausa

HAVING bertindak ke atas keputusan agregat untuk memastikan perbandingan digunakan pada bilangan bidang kepakaran untuk setiap pengajar.

Peraturan praktikal dan pengoptimuman

Secara umumnya, klausa WHERE digunakan sebelum klausa GROUP BY untuk menapis baris individu; klausa HAVING digunakan selepas klausa GROUP BY untuk menapis hasil agregat.

Selain itu, pertanyaan boleh dioptimumkan menggunakan sintaks ANSI JOIN dan bukannya sintaks L, S θ join:

<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>

Atas ialah kandungan terperinci SQL HAVING lwn. WHERE: Bila Untuk Menggunakan Setiap Klausa untuk Penapisan Data?. 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