Heim > Datenbank > MySQL-Tutorial > HAVING vs. WHERE in SQL: Wann sollte ich die einzelnen Klauseln für die Aggregation verwenden?

HAVING vs. WHERE in SQL: Wann sollte ich die einzelnen Klauseln für die Aggregation verwenden?

Barbara Streisand
Freigeben: 2025-01-21 09:53:09
Original
345 Leute haben es durchsucht

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

Unterschiede zwischen HAVING- und WHERE-Klauseln in SQL-Aggregatabfragen

Bei der Arbeit mit aggregierten Daten ist es wichtig, den Unterschied zwischen HAVING- und WHERE-Klauseln zu verstehen. Dieser Artikel befasst sich mit einem häufigen Abfrageszenario und erklärt, warum eine Methode die richtigen Ergebnisse zurückgibt und eine andere nicht.

Abfragekontext

Angesichts der folgenden Tabelle:

  • Dozenten (Spalten: LectID, Fname, Lname, Abschluss)
  • Lecturers_Specialization (Spalten: LectID, Expertise)

Ziel ist es, den Lehrer mit den meisten Spezialitäten zu finden.

Fehlgeschlagener Versuch, die WHERE-Klausel zu verwenden

Fehlgeschlagene Abfrageversuche, die WHERE-Klausel zu verwenden, um die Ergebnisse basierend auf der Anzahl der Hauptfächer zu filtern:

<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>
Nach dem Login kopieren

Diese Abfrage lieferte nicht die erwarteten Ergebnisse, da die WHERE-Klausel nicht zum Anwenden von Bedingungen auf Aggregatwerte geeignet ist.

Erfolgreiche Abfrage mit HAVING-Klausel

Erfolgreiche Abfragen verwenden stattdessen die HAVING-Klausel:

<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>
Nach dem Login kopieren

Die Gründe, warum HAVING erfolgreich ist

HAVING-Klausel wird speziell zum Filtern der Ergebnisse aggregierter Abfragen verwendet. Nach der Operation „GROUP BY“ wird eine Bedingung angewendet, die es uns ermöglicht, die Anzahl der Hauptfächer für jeden Dozenten zu überprüfen.

Faustregel

Im Allgemeinen verwenden Sie WHERE vor GROUP BY, um einzelne Zeilen zu filtern, und HAVING nach GROUP BY, um aggregierte Ergebnisse zu filtern.

Verbesserte Abfrage mit ANSI JOIN

Eine alternative Abfrageversion mit ANSI JOIN-Syntax wird ebenfalls bereitgestellt:

<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>
Nach dem Login kopieren

Diese Version eliminiert die Verwendung von WHERE für Join-Bedingungen und verwendet stattdessen JOIN.

Das obige ist der detaillierte Inhalt vonHAVING vs. WHERE in SQL: Wann sollte ich die einzelnen Klauseln für die Aggregation verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage