Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
gilt für:SQL Server
Azure SQL-Datenbank
azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
In einigen Fällen sollten Sie einzelne Zeilen aus Gruppen (mithilfe einer WHERE
-Klausel) ausschließen, bevor Sie eine Bedingung als Ganzes auf Gruppen anwenden (mithilfe einer HAVING
-Klausel).
Eine HAVING
Klausel ist wie eine WHERE
-Klausel, gilt jedoch nur für Gruppen als Ganzes (d. h. für die Zeilen im Resultset, die Gruppen darstellen), während die WHERE
Klausel für einzelne Zeilen gilt. Eine Abfrage kann sowohl eine WHERE
-Klausel als auch eine HAVING
-Klausel enthalten. In diesem Fall:
Die
WHERE
-Klausel wird zunächst auf die einzelnen Zeilen in den Tabellen oder Tabellenwertobjekten im Bereich Diagramm angewendet. Es werden nur die Zeilen gruppiert, die die Bedingungen in derWHERE
-Klausel erfüllen.Die
HAVING
Klausel wird dann auf die Zeilen im Resultset angewendet. Nur die Gruppen, die denHAVING
Bedingungen entsprechen, werden in der Abfrageausgabe angezeigt. Sie können eineHAVING
Klausel nur auf Spalten anwenden, die auch in der GROUP BY-Klausel oder in einer Aggregatfunktion angezeigt werden.
Geben Sie eine WHERE- und HAVING-Klausel für zwei verknüpfte Tabellen an.
Anmerkung
Die in diesem Artikel verwendete Datenbank ist die pubs
Datenbank, die in Northwind- und Pubs-Beispieldatenbanken für Microsoft SQL Server auf GitHub verfügbar ist.
Stellen Sie sich z. B. vor, Dass Sie den titles
und publishers
Tabellen beitreten, um eine Abfrage zu erstellen, die den durchschnittlichen Buchpreis für eine Reihe von Herausgebern anzeigt. Sie möchten den Durchschnittspreis nur für eine bestimmte Gruppe von Herausgebern sehen - vielleicht nur die Herausgeber im Bundesstaat Kalifornien. Und selbst dann möchten Sie den Durchschnittspreis nur sehen, wenn er über 10,00 $ liegt.
Sie können die erste Bedingung festlegen, indem Sie eine WHERE
Klausel einschließen, die alle Herausgeber verwirft, die sich nicht in Kalifornien befinden, bevor Sie die Durchschnittspreise berechnen. Die zweite Bedingung erfordert eine HAVING
-Klausel, da die Bedingung auf den Ergebnissen der Gruppierung und Zusammenfassung der Daten basiert. Die resultierende SQL-Anweisung könnte wie folgt aussehen:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
In den Visual Database Tools von SQL Server Management Studio können Sie sowohl HAVING
als auch WHERE
Klauseln im Bereich Kriterien erstellen. Wenn Sie eine Suchbedingung für eine Spalte angeben, wird die Bedingung standardmäßig Teil der HAVING
-Klausel. Sie können die Bedingung jedoch als WHERE
-Klausel ändern.
Sie können eine WHERE
-Klausel und HAVING
Klausel erstellen, die dieselbe Spalte enthält. Dazu müssen Sie die Spalte zweimal zum Bereich Kriterien hinzufügen und dann ein Exemplar als Teil der HAVING
-Klausel und das andere Exemplar als Teil der WHERE
-Klausel spezifizieren.
Angeben einer WHERE-Bedingung in einer Aggregatabfrage
Geben Sie die Gruppen für Ihre Abfrage an. Weitere Informationen finden Sie unter Gruppenzeilen in Abfrageergebnissen (Visual Database Tools).
Wenn sie sich noch nicht im Bereich Kriterien befindet, fügen Sie die Spalte hinzu, auf der Sie die
WHERE
Bedingung basieren möchten.Löschen Sie die Ausgabespalte , es sei denn, die Datenspalte ist Teil der GROUP BY-Klausel oder in einer Aggregatfunktion enthalten.
Geben Sie in der Spalte Filter die bedingung
WHERE
an. Der Abfrage- und Ansichts-Designer fügt die Bedingung zurHAVING
-Klausel der SQL-Anweisung hinzu.Anmerkung
Die im Beispiel für diese Prozedur gezeigte Abfrage verknüpft zwei Tabellen,
titles
undpublishers
.An diesem Punkt in der Abfrage enthält die SQL-Anweisung eine
HAVING
Klausel:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
Wählen Sie in der "Gruppieren nach" Spalte Wo aus der Liste der Gruppen- und Zusammenfassungsoptionen. Der Abfrage- und Ansichts-Designer entfernt die Bedingung aus der
HAVING
-Klausel in der SQL-Anweisung und fügt sie derWHERE
-Klausel hinzu.Die SQL-Anweisung ändert sich, um stattdessen eine
WHERE
-Klausel einzuschließen:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;