Freigeben über


Verwenden von HAVING- und WHERE-Klauseln in derselben Abfrage (Visual Database Tools)

gilt für:SQL ServerAzure SQL-Datenbankazure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 der WHERE-Klausel erfüllen.

  • Die HAVING Klausel wird dann auf die Zeilen im Resultset angewendet. Nur die Gruppen, die den HAVING Bedingungen entsprechen, werden in der Abfrageausgabe angezeigt. Sie können eine HAVING 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

  1. Geben Sie die Gruppen für Ihre Abfrage an. Weitere Informationen finden Sie unter Gruppenzeilen in Abfrageergebnissen (Visual Database Tools).

  2. Wenn sie sich noch nicht im Bereich Kriterien befindet, fügen Sie die Spalte hinzu, auf der Sie die WHERE Bedingung basieren möchten.

  3. Löschen Sie die Ausgabespalte , es sei denn, die Datenspalte ist Teil der GROUP BY-Klausel oder in einer Aggregatfunktion enthalten.

  4. Geben Sie in der Spalte Filter die bedingung WHERE an. Der Abfrage- und Ansichts-Designer fügt die Bedingung zur HAVING-Klausel der SQL-Anweisung hinzu.

    Anmerkung

    Die im Beispiel für diese Prozedur gezeigte Abfrage verknüpft zwei Tabellen, titles und publishers.

    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'
    
  5. 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 der WHERE-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;