Verwenden von HAVING- und WHERE-Klauseln in derselben Abfrage (Visuelle Datenbanktools)

Verwenden von HAVING- und WHERE-Klauseln in derselben Abfrage (Visuelle Datenbanktools)

In manchen Fällen möchten Sie möglicherweise einzelne Zeilen aus Gruppen ausschließen (mit einer WHERE-Klausel), bevor Sie eine Bedingung auf Gruppen als Ganzes anwenden (mit einer HAVING-Klausel).

Eine HAVING-Klausel ähnelt einer WHERE-Klausel, gilt jedoch nur für Gruppen als Ganzes (d. h. für die Zeilen im Ergebnis, die Gruppen repräsentieren), während die WHERE-Klausel auf einzelne Zeilen angewendet wird. Eine Abfrage kann sowohl eine WHERE-Klausel als auch eine HAVING-Klausel enthalten. In diesem Fall:

  • Wird die WHERE-Klausel zuerst auf die einzelnen Zeilen in den Tabellen oder tabellenwertigen Objekten im Diagramm-Editor angewendet. Nur die Zeilen, die den Bedingungen in der WHERE-Klausel entsprechen, werden gruppiert.
  • Wird die HAVING-Klausel anschließend auf die Zeilen im Ergebnis angewendet. Nur die Gruppen, die die HAVING-Bedingungen erfüllen, erscheinen in der Abfrageausgabe. Sie können eine HAVING-Klausel nur auf Spalten anwenden, die auch in der GROUP BY-Klausel oder in einer Aggregatfunktion vorkommen.

Angeben einer WHERE- und HAVING-Klausel für zwei verbundene Tabellen

Nehmen wir an, Sie verbinden die Tabellen “Titel” und “Verleger” in einer Abfrage, um den durchschnittlichen Buchpreis für eine Reihe von Verlegern anzuzeigen. Sie möchten den Durchschnittspreis nur für einen bestimmten Satz von Verlegern sehen – möglicherweise nur die Verleger 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 verwenden, die alle Verleger entfernt, die nicht in Kalifornien sind, 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 visuellen Datenbanktools von SQL Server Management Studio können Sie sowohl HAVING- als auch WHERE-Klauseln im Kriterienbereich erstellen. Standardmäßig wird eine Suchbedingung für eine Spalte Teil der HAVING-Klausel. Sie können jedoch die Bedingung in eine WHERE-Klausel ändern.

LESEN  Die faszinierende Welt der Parson Russell Terrier

Sie können eine WHERE-Klausel und eine HAVING-Klausel erstellen, die dieselbe Spalte betreffen. Hierzu müssen Sie die Spalte zweimal zum Kriterienbereich hinzufügen und eine Instanz als Teil der HAVING-Klausel und die andere Instanz als Teil der WHERE-Klausel angeben.

Angeben einer WHERE-Bedingung in einer Aggregatabfrage

  1. Geben Sie die Gruppen für Ihre Abfrage an. Weitere Informationen finden Sie unter Gruppieren von Zeilen in Abfrageergebnissen (Visuelle Datenbanktools).
  2. Fügen Sie die Spalte, auf der Sie die WHERE-Bedingung basieren möchten, in den Kriterienbereich ein, falls sie noch nicht vorhanden ist.
  3. Löschen Sie die Ausgabespalte, sofern die Daten der Spalte nicht Teil der GROUP BY-Klausel sind oder in einer Aggregatfunktion enthalten sind.
  4. Geben Sie im Filterbereich die WHERE-Bedingung an. Der Abfrage- und Ansichtsdesigner fügt die Bedingung zur HAVING-Klausel der SQL-Anweisung hinzu. An diesem Punkt 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 aus. Der Abfrage- und Ansichtsdesigner entfernt die Bedingung aus der HAVING-Klausel in der SQL-Anweisung und fügt sie zur WHERE-Klausel hinzu. Die SQL-Anweisung ändert sich, um eine WHERE-Klausel anstelle einer HAVING-Klausel zu enthalten:
    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;

In Verbindung stehender Inhalt

  • SELECT – HAVING (Transact-SQL)
  • Ergebnisse von Abfragen sortieren und gruppieren (Visuelle Datenbanktools)
  • Abfrageergebnisse zusammenfassen (Visuelle Datenbanktools)