Ich habe die folgenden zwei Tabellen:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Ich möchte den Dozenten mit der größten Spezialisierung finden. Wenn ich das versuche, funktioniert es nicht:
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);
Aber wenn ich das versuche, funktioniert es:
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);
Was ist der Grund? Vielen Dank.
Antworten:
WHERE
Klausel führt eine Bedingung für einzelne Zeilen ein ;HAVING
Klausel führt eine Bedingung für Aggregationen ein , dh Ergebnisse der Auswahl, bei denen ein einzelnes Ergebnis wie Anzahl, Durchschnitt, Min, Max oder Summe aus mehreren Zeilen erzeugt wurde. Ihre Abfrage erfordert eine zweite Art von Bedingung (dh eine Bedingung für eine Aggregation) undHAVING
funktioniert daher ordnungsgemäß.Als Faustregel verwenden Sie
WHERE
vorherGROUP BY
undHAVING
nachherGROUP BY
. Es ist eine eher primitive Regel, aber in mehr als 90% der Fälle nützlich.Wenn Sie schon dabei sind, möchten Sie Ihre Abfrage möglicherweise mithilfe der ANSI-Version des Joins neu schreiben:
Dies würde beseitigen,
WHERE
dass als Theta-Verbindungsbedingung verwendet wurde .quelle
HAVING
arbeitet mit Aggregaten. DaCOUNT
es sich um eine Aggregatfunktion handelt, können Sie sie nicht in einerWHERE
Klausel verwenden.Hier finden Sie einige Informationen aus MSDN zu Aggregatfunktionen.
quelle
Zuerst sollten wir die Reihenfolge der Ausführung von Klauseln kennen, dh FROM> WHERE> GROUP BY> HAVING> DISTINCT> SELECT> ORDER BY. Da die WHERE- Klausel vor der GROUP BY- Klausel ausgeführt wird, können die Datensätze nicht gefiltert werden, indem WHERE auf einen GROUP BY- angewendeten Datensatz angewendet wird.
"HAVING ist dasselbe wie die WHERE-Klausel, wird jedoch auf gruppierte Datensätze angewendet".
Zuerst ruft die WHERE- Klausel die Datensätze basierend auf der Bedingung ab, dann gruppiert die GROUP BY- Klausel sie entsprechend und dann ruft die HAVING- Klausel die Gruppendatensätze basierend auf der vorhandenen Bedingung ab.
quelle
Die WHERE-Klausel kann mit den Anweisungen SELECT, INSERT und UPDATE verwendet werden, während die HAVING-Anweisung nur mit der Anweisung SELECT verwendet werden kann.
WHERE filtert Zeilen vor der Aggregation (GROUP BY), während HAVING Filtergruppen nach der Aggregation durchgeführt werden.
Die Aggregatfunktion kann in der WHERE-Klausel nur verwendet werden, wenn sie sich in einer in der HAVING-Klausel enthaltenen Unterabfrage befindet, während die Aggregatfunktionen in der HAVING-Klausel verwendet werden können.
Quelle
quelle
Ich habe kein Beispiel für beide in einer Abfrage gesehen. Dieses Beispiel könnte also helfen.
Dadurch wird die Tabelle zuerst nach der Unternehmens-ID gefiltert, dann (nach Land und Stadt) gruppiert und zusätzlich nur nach Stadtaggregationen in Mexiko gefiltert. Die Unternehmens-ID wurde in der Aggregation nicht benötigt, aber wir konnten WHERE verwenden, um nur die gewünschten Zeilen herauszufiltern, bevor wir GROUP BY verwenden.
quelle
Sie können die where-Klausel nicht mit Aggregatfunktionen verwenden, da sie beim Abrufen von Datensätzen auf der Grundlage der Bedingung Datensatz für Datensatz in die Tabelle eingeht und dann den Datensatz auf der Grundlage der von uns angegebenen Bedingung abruft. Also diesmal können wir nicht wo Klausel. Während die Klausel auf dem resultSet funktioniert, das wir schließlich nach dem Ausführen einer Abfrage erhalten.
Beispielabfrage:
Dadurch wird das resultSet in einem temporären Speicher gespeichert, und die Klausel wird ihre Arbeit ausführen. Daher können wir hier problemlos Aggregatfunktionen verwenden.
quelle
1. Wir können die Aggregatfunktion mit der HAVING-Klausel verwenden, nicht mit der WHERE-Klausel, z. B. min, max, avg.
2. Die WHERE-Klausel entfernt das Datensatztupel für Tupel. Die HAVING-Klausel entfernt die gesamte Gruppe aus der Sammlung der Gruppe
Meistens wird HAVING verwendet, wenn Sie Datengruppen haben, und WHERE wird verwendet, wenn Sie Daten in Zeilen haben.
quelle