# SQL HAVING: So filtern Sie Ergebnisse auf Basis von Aggregatsfunktionen

SQL HAVING ist eine Bedingung, die auf bereits gruppierte Einträge angewendet werden kann. Sie funktioniert mit Aggregatsfunktionen und wird genutzt, um Ergebnismengen einzuschränken.

## Was ist SQL HAVING?

Neben dem bekannten WHERE gibt es in der [Structured Query Language](https://www.ionos.at/digitalguide/server/knowhow/was-ist-sql/) eine weitere Bedingung, die häufig genutzt wird. SQL HAVING wurde hinzugefügt, um Daten anhand bestimmter Kriterien zu filtern. Die Bedingung wird mit dem [SQL-Befehl](https://www.ionos.at/digitalguide/server/konfiguration/sql-befehle/) `SELECT` und der Anweisung [SQL GROUP BY](https://www.ionos.at/digitalguide/server/konfiguration/sql-group-by/) angewendet. Während die letztere Ergebnisse gruppiert, schränkt SQL HAVING diese Ergebnismenge **mit Hilfe unterschiedlicher Aggregatsfunktionen** ein. Die Bedingung wurde eingeführt, da WHERE nicht mit Aggregatsfunktionen wie [SQL AVG()](https://www.ionos.at/digitalguide/server/konfiguration/sql-avg/), [SQL COUNT()](https://www.ionos.at/digitalguide/server/konfiguration/sql-count/), `MAX()`, `MIN()` und `SUM()` interagieren kann. SQL HAVING wird hinter den Anweisungen `WHERE` (sofern vorhanden) und `GROUP BY`, aber vor `ORDER BY` eingesetzt.

## Syntax und Funktionsweise

Um die Funktionsweise und den Nutzen von SQL HAVING zu verstehen, lohnt sich ein Blick auf die Syntax der Klausel. Diese sieht so aus:

```sql
SELECT name_der_spalte(n)
FROM name_der_tabelle
WHERE bedingung
GROUP BY name_der_spalte(n)
HAVING bedingung
ORDER BY name_der_spalte(n);
```

Häufig wird eine Aggregatsfunktion auf eine oder mehrere Spalten angewendet. Danach wird zur Lokalisierung der Name der Tabelle angegeben. Die Bedingung `WHERE` **ist optional**. `GROUP BY` fasst identische Werte zu Gruppen zusammen, die mit HAVING noch genauer gefiltert und mit `ORDER BY` in die gewünschte Reihenfolge gebracht werden.

## Beispiel für die Bedingung

Am einfachsten lässt sich SQL HAVING mit Hilfe eines einfachen Beispiels veranschaulichen. Dafür erstellen wir eine kleine Tabelle namens „Kundenliste“. Diese enthält die Spalten „Kundennummer“, „Name“, „Standort“ und „Artikel“:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
      <th>Artikel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Berlin</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

Nun nutzen wir SQL HAVING, um herauszufinden, wie viele Kunden und Kundinnen aus Hamburg zehn oder mehr Artikel bestellt haben. Dafür verwenden wir den folgenden Code und geben die Anzahl mit Hilfe eines [SQL-Aliases](https://www.ionos.at/digitalguide/server/konfiguration/sql-aliases/) als „AnzahlBestellungen“ an:

```sql
SELECT Standort, COUNT(Standort) AS AnzahlBestellungen
FROM Kundenliste
WHERE Standort = 'Hamburg'
GROUP BY Standort, Artikel
HAVING Artikel > 10;
```

Die entsprechende Ausgabe sieht folgendermaßen aus:

<table>
  <thead>
    <tr>
      <th>Standort</th>
      <th>AnzahlBestellungen</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hamburg</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

## Die Bedingung in Kombination mit INNER JOIN

Auch mit dem Keyword `INNER JOIN` können Sie SQL HAVING kombinieren. Dafür erstellen wir eine zweite Tabelle namens „Artikel\_01“, in der hinterlegt wird, wie oft und wann ein bestimmter Artikel bestellt wurde. Sie enthält eine Bestellnummer, eine Kundennummer, die Anzahl und ein Bestelldatum und sieht aus wie folgt:

<table>
  <thead>
    <tr>
      <th>Bestellnummer</th>
      <th>Kundennummer</th>
      <th>Anzahl</th>
      <th>Datum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00283</td>
      <td>1427</td>
      <td>4</td>
      <td>2024-01-15</td>
    </tr>
    <tr>
      <td>00284</td>
      <td>1211</td>
      <td>7</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00285</td>
      <td>1275</td>
      <td>15</td>
      <td>2024-01-29</td>
    </tr>
    <tr>
      <td>00286</td>
      <td>1431</td>
      <td>10</td>
      <td>2024-02-01</td>
    </tr>
    <tr>
      <td>00287</td>
      <td>1427</td>
      <td>9</td>
      <td>2024-02-05</td>
    </tr>
  </tbody>
</table>

Nun können wir das System zum Beispiel anweisen, uns alle Kundinnen und Kunden anzuzeigen, die mehr als eine Bestellung aufgegeben haben. Der passende Code ist dieser:

```sql
SELECT Kundenliste.Name, COUNT(Artikel_01.Bestellnummer) AS AnzahlBestellungen
FROM (Artikel_01
INNER JOIN Kundenliste ON Artikel_01.Kundennummer = Kundenliste.Kundennummer)
GROUP BY Name
HAVING COUNT(Artikel_01.Bestellnummer) > 1;
```

Dies ist die Ausgabe, die wir dann erhalten:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>AnzahlBestellungen</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Schmidt</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

## Alternative zu SQL HAVING

Eine Alternative zu SQL HAVING ist WHERE. Dabei können beide Optionen allerdings nicht genau gleich verwendet werden. WHERE wird für einzelne Einträge eingesetzt und kann neben SELECT auch mit DELETE oder UPDATE kombiniert werden. HAVING ist hingegen **ausschließlich für gruppierte Einträge** vorgesehen und nur mit SELECT kompatibel. WHERE wird vor GROUP BY eingesetzt und HAVING danach. Außerdem kann nur SQL HAVING mit Aggregatsfunktionen arbeiten.

Tipp Ein Server, der perfekt auf Ihre Anforderungen zugeschnitten ist: Mit [SQL-Server-Hosting](https://www.ionos.at/cloud/sql-server-hosting "SQL-Server-Hosting von IONOS") von IONOS wählen Sie zwischen MSSQL, MySQL und MariaDB und profitieren von einer starken Sicherheitsarchitektur, hervorragender Performance und einer persönlichen Beratung zu jeder Zeit.


This is a markdown version of: [https://www.ionos.at/digitalguide/server/konfiguration/sql-having/](https://www.ionos.at/digitalguide/server/konfiguration/sql-having/) for AI/LLM consumption.