# SQL EXISTS: Subqueries auf bestimmte Werte überprüfen

Mit dem Operator SQL EXISTS können Sie eine Unterabfrage auf einen bestimmten Eintrag hin überprüfen. Das Ergebnis ist ein boolescher Wert. Auch die Abfrage mehrerer Bedingungen ist möglich.

## Was ist SQL EXISTS?

In der [Structured Query Language](https://www.ionos.de/digitalguide/server/knowhow/was-ist-sql/) gibt es neben den regulären Abfragen das Prinzip der „Unterabfragen“ oder Subqueries. Wenn Sie überprüfen möchten, ob ein **bestimmter Wert innerhalb einer dieser Subqueries vorhanden** ist, können Sie den Operator SQL EXISTS nutzen. Dieser wendet eine definierte Bedingung auf die Unterabfrage an und gibt den Wert `TRUE` (also „wahr“) aus, sofern diese erfüllt wird. Nur wenn dies der Fall ist, wird dann auch die übergeordnete Abfrage durchgeführt. SQL EXISTS kann mit den [SQL-Befehlen](https://www.ionos.de/digitalguide/server/konfiguration/sql-befehle/) `DELETE`, `INSERT`, `SELECT` und `UPDATE` ausgeführt werden.

## Syntax und Funktionsweise

Im Folgenden zeigen wir Ihnen die Funktionsweise von SQL EXISTS in Kombination mit `SELECT`. Die entsprechende Syntax sieht aus wie folgt:

```sql
SELECT name_der_spalte(n)
FROM name_der_tabelle
WHERE EXISTS
(SELECT name_der_spalte FROM name_der_tabelle WHERE bedingung);
```

`name_der_spalte(n)` bezeichnet die Spalte oder die Spalten, die durch `SELECT` gefiltert werden sollen. Danach geben Sie den Namen der Tabelle an, in der der Befehl ausgeführt werden soll. Die Überprüfung der Subquery erfolgt danach über `WHERE EXISTS`. An dieser Stelle geben Sie die entsprechende Unterabfrage in Klammern an.

Bei Ausführung des Codes wird zunächst die übergeordnete Abfrage eingeleitet. Dann initiiert das System die Unterabfrage. Gibt diese ein Ergebnis (also `TRUE`) aus, wird das Ergebnis der Hauptabfrage berücksichtigt. Ist das Ergebnis der Unterabfrage aber `NULL`, wird auch das Ergebnis der Hauptabfrage übersprungen.

## Beispiel für die Anwendung des Operators

Die Bedeutung und Funktionsweise von SQL EXISTS lässt sich am einfachsten mit einem Beispiel veranschaulichen. Dafür erstellen wir zwei verschiedene Tabellen. Die erste Tabelle trägt den Namen „Kundenliste“. Darin sind verschiedene Kundinnen und Kunden eines Unternehmens mit Kundennummer, Name und Standort gelistet. Diese Tabelle sieht aus wie folgt:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Passau</td>
    </tr>
  </tbody>
</table>

Unsere zweite Tabelle trägt den Namen „Bestellungen“. Sie enthält für jeden Eintrag eine Artikelnummer, die Kundennummer und das Bestelldatum. So sieht sie aus:

<table>
  <thead>
    <tr>
      <th>Artikelnummer</th>
      <th>Kundennummer</th>
      <th>Bestelldatum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00282</td>
      <td>1172</td>
      <td>2024-01-17</td>
    </tr>
    <tr>
      <td>00311</td>
      <td>1361</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00106</td>
      <td>1431</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00378</td>
      <td>1274</td>
      <td>2024-01-30</td>
    </tr>
    <tr>
      <td>00418</td>
      <td>1118</td>
      <td>2024-02-03</td>
    </tr>
  </tbody>
</table>

Nun können wir filtern, welche Kundinnen und Kunden im Zeitraum vom 17. Januar bis zum 3. Februar mindestens eine Bestellung aufgegeben haben. Dafür nutzen wir den folgenden Code:

```sql
SELECT Kundennummer, Name, Standort
FROM Kundenliste
WHERE EXISTS
(SELECT * FROM Bestellungen WHERE Kundenliste.Kundennummer = Bestellungen.Kundennummer);
```

Jetzt überprüft das System, ob Kundennummern aus der Kundenliste auch in den Bestellungen vorkommen. Ist dies der Fall (ist der Wert also `TRUE`), werden die entsprechenden Einträge ausgelistet. Unsere Tabelle sieht nun so aus:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Becker</td>
      <td>Passau</td>
    </tr>
  </tbody>
</table>

## Mehrere Bedingungen abfragen

Sie haben auch die Möglichkeit, **mehrere Bedingungen** abzufragen und so Ihre Auswahl noch weiter zu spezifizieren. Im folgenden Beispiel wollen wir so überprüfen, ob nicht nur bestimmte Kundennummern enthalten sind, sondern auch der Standort München. Der Code sieht so aus:

```sql
SELECT Kundennummer, Name, Standort
FROM Kundenliste
WHERE EXISTS
(SELECT * FROM Bestellungen WHERE Kundenliste.Kundennummer = Bestellungen.Kundennummer AND Standort = 'München');
```

Auch hier ist das Ergebnis `TRUE` und die Ausgabe ist diese:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Müller</td>
      <td>München</td>
    </tr>
  </tbody>
</table>

## Kombination mit NOT

Auch wenn Sie den umgekehrten Weg gehen wollen, bietet Ihnen SQL EXISTS diese Option. Im folgenden Beispiel erfragen wir sämtliche Kundinnen und Kunden, die im entsprechenden Zeitrahmen *keine* Bestellung aufgegeben haben. Dafür fügen wir die **Ergänzung** `NOT` ein.

```sql
SELECT Kundennummer, Name, Standort
FROM Kundenliste
WHERE NOT EXISTS
(SELECT * FROM Bestellungen WHERE Kundenliste.Kundennummer = Bestellungen.Kundennummer);
```

Dies ist die Ausgabe:

<table>
  <thead>
    <tr>
      <th>Kundennummer</th>
      <th>Name</th>
      <th>Standort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Schmidt</td>
      <td>Berlin</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Schulz</td>
      <td>Hamburg</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Peters</td>
      <td>Hamburg</td>
    </tr>
  </tbody>
</table>

## Alternativen zu SQL EXISTS

Es gibt einige Alternativen zu SQL EXISTS, mit denen Sie ebenfalls Subqueries auf bestimmte Einträge hin untersuchen können. Die praktischsten Optionen sind die Operatoren `IN` und `JOIN`, die Sie beide ebenfalls nach Ihren Bedürfnissen spezifizieren können.

Tipp Top-Performance und persönliche Beratung! Mit [SQL-Server-Hosting](https://www.ionos.de/cloud/sql-server-hosting "SQL-Server-Hosting von IONOS") von IONOS haben Sie die Wahl zwischen MSSQL, MySQL und MariaDB. Wählen Sie das Modell, das am besten zu Ihren Bedürfnissen passt!


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