Share via


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

In einigen Fällen ist es sinnvoll, vor Anwendung einer Bedingung auf Gruppen als Ganzes (mit der HAVING-Klausel) einzelne Zeilen aus den Gruppen auszuschließen (mit einer WHERE-Klausel).

Die HAVING-Klausel ähnelt der 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 auf einzelne Zeilen angewendet wird. Eine Abfrage kann sowohl eine WHERE-Klausel als auch eine HAVING-Klausel enthalten. Dabei trifft Folgendes zu:

  • Zuerst wird die WHERE-Klausel auf die einzelnen Zeilen der Tabellen bzw. Objekte mit Tabellenwert im Diagrammbereich angewendet. Gruppiert werden nur die Zeilen, die die Bedingungen der WHERE-Klausel erfüllen.

  • Die HAVING-Klausel wird dann im Resultset auf die Zeilen angewendet. Nur die Gruppen werden in das Abfrageergebnis aufgenommen, die die HAVING-Bedingungen erfüllen. Die HAVING-Klausel kann nur auf Spalten angewendet werden, die auch Teil einer GROUP BY-Klausel oder einer Aggregatfunktion sind.

Angenommen, Sie verknüpfen die Tabellen titles und publishers, um eine Abfrage zu erstellen, in der der durchschnittliche Buchpreis für eine Gruppe von Herstellern angezeigt wird. Der Durchschnittspreis soll jedoch nur für eine bestimmte Gruppe von Herausgebern angezeigt werden, beispielsweise nur für die Herausgeber in Kalifornien. Außerdem sollen nur Durchschnittspreise über 10,00 in die Ausgabe aufgenommen werden.

Die erste Bedingung können Sie mithilfe einer WHERE-Klausel aufbauen, durch die Hersteller, die nicht aus Kalifornien stammen, vor der Berechnung der Durchschnittspreise verworfen werden. Die zweite Bedingung erfordert eine HAVING-Klausel, da sie auf den Ergebnissen einer Gruppierung und Zusammenfassung von Daten aufbaut. Die resultierende SQL-Anweisung könnte folgendermaßen 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

Sie können im Kriterienbereich sowohl HAVING-Klauseln als auch WHERE-Klauseln erstellen. Wenn Sie eine Suchbedingung für eine Spalte angeben, wird diese Bedingung standardmäßig zu einem Bestandteil der HAVING-Klausel. Sie können die Bedingung jedoch auch in eine WHERE-Klausel ändern.

Für dieselbe Spalte kann sowohl eine WHERE-Klausel als auch eine HAVING-Klausel erstellt werden. Dazu müssen Sie die Spalte zunächst zweimal im Kriterienbereich einfügen und dann eine Instanz als Teil der HAVING-Klausel und die andere Instanz als Teil der WHERE-Klausel angeben.

So legen Sie eine WHERE-Bedingung in einer Aggregatabfrage fest

  1. Geben Sie die Gruppen für die Abfrage an. Einzelheiten dazu finden Sie unter Vorgehensweise: Gruppieren von Zeilen in Abfrageergebnissen (Visual Database Tools).

  2. Fügen Sie dem Kriterienbereich die Spalte hinzu, auf der die WHERE-Bedingung basieren soll, sofern diese dort nicht bereits vorhanden ist.

  3. Löschen Sie die Spalte Ausgabe, es sei denn, die Datenspalte ist in die GROUP BY-Klausel oder eine Aggregatfunktion eingebunden.

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

    HinweisHinweis

    In der im Beispiel für diese Prozedur dargestellten Abfrage werden die beiden Tabellen titles und publishers miteinander verknüpft.

    An dieser Stelle 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 Spalte Gruppieren nach aus der Liste von Gruppierungs- und Zusammenfassungsoptionen die Option Where aus. Der Abfrage- und Ansicht-Designer entfernt die Bedingung aus der HAVING-Klausel in der SQL-Anweisung und fügt sie der WHERE-Klausel hinzu.

    Daraufhin wird stattdessen eine WHERE-Klausel in die SQL-Anweisung eingebunden:

    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