PostgreSQL EXISTS mit SELECT Operator (Beispiel)

โšก Intelligente Zusammenfassung

PostgreSQL EXISTS ist ein boolescher Operator, der prรผft, ob eine korrelierte Unterabfrage eine Zeile zurรผckgibt, wodurch SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen Daten effizient nach dem Vorhandensein oder Fehlen รผbereinstimmender Datensรคtze filtern kรถnnen.

  • ๐Ÿ“‹ Syntax: WHERE EXISTS (Unterabfrage) gibt true zurรผck, wenn die Unterabfrage mindestens eine Zeile liefert.
  • ๐Ÿ”— Korrelierte Unterabfrage: EXISTS verknรผpft innere und รคuรŸere Abfragen und gleicht Zeilen anhand eines gemeinsamen Schlรผssels ab.
  • โšก Kurzschluss: EXISTS stoppt bei der ersten รผbereinstimmenden Zeile und eignet sich daher gut fรผr groรŸe Tabellen.
  • ๐Ÿ” Vier Aussagen: Der Operator funktioniert innerhalb von SELECT-, INSERT-, UPDATE- und DELETE-Abfragen.
  • ๐Ÿ›ก๏ธ EXISTIERT NICHT: SchlieรŸt Zeilen sicher aus und vermeidet die NULL-Falle, die zu einem Fehler in NOT IN fรผhrt.
  • ๐Ÿค– KI-Anfragen: Assistenten generieren EXISTS-Klauseln und kennzeichnen Leistungsrisiken durch korrelierte Unterabfragen.

PostgreSQL EXISTIERT mit Select OperaDo.

Was ist EXISTS in PostgreSQL?

Das PostgreSQL VORHANDEN Der Operator EXISTS prรผft, ob eine oder mehrere Zeilen in einer Unterabfrage vorhanden sind. Er wird also immer zusammen mit einer Unterabfrage verwendet. Die Bedingung des Operators EXISTS ist erfรผllt, wenn mindestens eine Zeile in der Unterabfrage gefunden wird. Diese Operation kann zusammen mit SELECT-, UPDATE-, INSERT- und DELETE-Anweisungen verwendet werden.

PostgreSQL EXISTS-Abfragesyntax

Hier ist die Syntax fรผr PostgreSQL EXISTS-Anweisung:

WHERE EXISTS (subquery);

Die obige Syntax zeigt, dass der EXISTS-Operator ein Argument annimmt, das eine Unterabfrage ist. Die Unterabfrage ist einfach eine SELECT-Anweisung das sollte mit einem SELECT * statt einer Liste von Spaltennamen oder Ausdrรผcken beginnen.

PostgreSQL EXISTS mit SELECT-Anweisung

Schauen wir uns an, wie man eine SELECT-Anweisung mit dem EXISTS-Operator verwendet. Wir haben die folgenden Tabellen:

Buch:

PostgreSQL EXISTS mit SELECT-Anweisung

Preis:

PostgreSQL EXISTS mit SELECT-Anweisung

Fรผhren Sie die folgende Anweisung aus:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Dies gibt Folgendes zurรผck:

PostgreSQL EXISTS mit SELECT-Anweisungsergebnis

Der obige Befehl sollte alle Datensรคtze in der Buchtabelle zurรผckgeben, deren ID mit der ID aller Datensรคtze der Unterabfrage รผbereinstimmt. Es wurde nur eine ID gefunden. Daher wurde nur ein Datensatz zurรผckgegeben.

PostgreSQL EXISTS mit INSERT-Anweisung

Wir kรถnnen den EXISTS-Operator in einem INSERT-Anweisung. Wir haben die folgenden 3 Tabellen:

Buch:

PostgreSQL EXISTS mit INSERT-Anweisung

Preis:

PostgreSQL EXISTS mit INSERT-Anweisung

Preis2:

PostgreSQL EXISTS mit INSERT-Anweisung

Wir kรถnnen dann die folgende Anweisung ausfรผhren:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Die Preistabelle sieht nun wie folgt aus:

PostgreSQL EXISTS mit Ergebnis der INSERT-Anweisung

Die Zeile mit der ID 5 in der Tabelle โ€žPrice2โ€œ wurde abgeglichen. Dieser Datensatz wurde dann in die Preistabelle eingefรผgt.

PostgreSQL EXISTS mit UPDATE-Anweisung

Wir kรถnnen den EXISTS-Operator in einer UPDATE-Anweisung verwenden.

Fรผhren Sie die folgende Abfrage aus:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL EXISTS mit UPDATE-Anweisung

Wir aktualisieren die Preisspalte der Preistabelle. Unser Ziel ist es, dass die Preise von Artikeln mit einer gemeinsamen ID gleich sind. Nur eine Zeile stimmte รผberein, nรคmlich 5.

Da die Preise jedoch gleich sind, also 205, wurde keine Aktualisierung vorgenommen. Wenn es einen Unterschied gรคbe, wรคre ein Update erfolgt.

PostgreSQL EXISTS mit DELETE-Anweisung

A PostgreSQL Die DELETE-Anweisung kann den EXISTS-Operator verwenden. Hier ist ein Beispiel:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Die Preistabelle sieht nun wie folgt aus:

PostgreSQL EXISTS mit DELETE-Anweisung

Die Zeile mit der ID 5 wurde gelรถscht.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Neben der SQL-Shell lassen sich dieselben EXISTS-Abfragen auch visuell รผber die pgAdmin-Oberflรคche ausfรผhren. Sehen wir uns nun an, wie diese Aktionen mit pgAdmin durchgefรผhrt werden kรถnnen:

Mit SELECT-Anweisung

Nachfolgend sind die Schritte zur Verwendung einer EXISTS-Abfrage aufgefรผhrt. PostgreSQL mit einer SELECT-Anweisung unter Verwendung von pgAdmin:

Schritt 1) Melden Sie sich bei Ihrem pgAdmin-Konto an. ร–ffnen Sie pgAdmin und melden Sie sich mit Ihren Zugangsdaten an.

Schritt 2) Erstellen Sie eine Demo-Datenbank.

  1. Klicken Sie in der Navigationsleiste links auf Datenbanken.
  2. Klicken Sie auf Demo.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Schritt 3) Geben Sie die folgende Abfrage in den Abfrageeditor ein:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

Schritt 4) Klicken Sie auf die Schaltflรคche โ€žAusfรผhrenโ€œ.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Es sollte Folgendes zurรผckgeben:

PostgreSQL EXISTS-Anweisung mit pgAdmin

Mit INSERT-Anweisung

Um dasselbe รผber pgAdmin zu erreichen, gehen Sie wie folgt vor:

Schritt 1) Melden Sie sich bei Ihrem pgAdmin-Konto an.

Schritt 2)

  1. Klicken Sie in der Navigationsleiste links auf Datenbanken.
  2. Klicken Sie auf Demo.

EXISTS-Aussage in PostgreSQL mit pgAdmin

Schritt 3) Geben Sie die Abfrage im Abfrageeditor ein:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

Schritt 4) Klicken Sie auf die Schaltflรคche โ€žAusfรผhrenโ€œ.

EXISTS-Aussage in PostgreSQL mit pgAdmin

Die Preistabelle sollte nun wie folgt aussehen:

EXISTS-Aussage in PostgreSQL mit pgAdmin

Mit UPDATE-Anweisung

Um dasselbe รผber pgAdmin zu erreichen, gehen Sie wie folgt vor:

Schritt 1) Melden Sie sich bei Ihrem pgAdmin-Konto an.

Schritt 2)

  1. Klicken Sie in der Navigationsleiste links auf Datenbanken.
  2. Klicken Sie auf Demo.

EXISTS-Aussage in PostgreSQL mit pgAdmin

Schritt 3) Geben Sie die Abfrage im Abfrageeditor ein:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

Schritt 4) Klicken Sie auf die Schaltflรคche โ€žAusfรผhrenโ€œ.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Die Preistabelle sollte nun wie folgt aussehen:

PostgreSQL EXISTS-Anweisung mit pgAdmin

Mit DELETE-Anweisung

Um dasselbe รผber pgAdmin zu erreichen, gehen Sie wie folgt vor:

Schritt 1) Melden Sie sich bei Ihrem pgAdmin-Konto an.

Schritt 2)

  1. Klicken Sie in der Navigationsleiste links auf Datenbanken.
  2. Klicken Sie auf Demo.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Schritt 3) Geben Sie die Abfrage im Abfrageeditor ein:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

Schritt 4) Klicken Sie auf die Schaltflรคche โ€žAusfรผhrenโ€œ.

PostgreSQL EXISTS-Anweisung mit pgAdmin

Die Preistabelle sollte nun wie folgt aussehen:

PostgreSQL EXISTS-Anweisung mit pgAdmin

Laden Sie die in diesem Tutorial verwendete Datenbank herunter

Hรคufig gestellte Fragen

EXISTS prรผft, ob eine korrelierte Unterabfrage eine Zeile zurรผckgibt und stoppt beim ersten Treffer; daher eignet sie sich fรผr groรŸe Unterabfragen. IN vergleicht einen Wert mit einer Liste und ist fรผr kleine, konstante Mengen geeignet.

NOT IN kann null Zeilen zurรผckgeben, wenn die Unterabfrage einen NULL-Wert enthรคlt, da der Vergleich dann undefiniert ist. NOT EXISTS ignoriert NULL-Werte und wertet jede Zeile korrekt aus, wodurch es die zuverlรคssige Wahl fรผr Anti-Joins ist.

Eine korrelierte Unterabfrage referenziert eine Spalte aus der รคuรŸeren Abfrage, z. B. WHERE Book.id = Price.id. EXISTS prรผft dies fรผr jede Zeile der รคuรŸeren Abfrage erneut und gibt true zurรผck, sobald eine รœbereinstimmung gefunden wird.

Ja. EXISTS gibt โ€žtrueโ€œ zurรผck, sobald die Unterabfrage eine Zeile liefert, sodass die restlichen Zeilen nicht durchsucht werden. Dieses Kurzschlussverhalten macht die Abfrage bei groรŸen, korrelierten Unterabfragen effizient.

Nein. EXISTS prรผft lediglich, ob die Unterabfrage eine Zeile zurรผckgibt. Daher verhalten sich SELECT *, SELECT 1 und SELECT id gleich. Die Spaltenliste innerhalb der Unterabfrage hat keinen Einfluss auf das Ergebnis.

Indizieren Sie die innerhalb der Unterabfrage verknรผpften Spalten, halten Sie die Korrelationsbedingung auf suchbar und fรผhren Sie EXPLAIN ANALYZE aus. PostgreSQL EXISTS wird hรคufig als effizienter Semi-Join umgeschrieben, wenn die Indizes dies unterstรผtzen.

KI-Assistenten wandeln Regeln in einfacher Sprache in EXISTS-Klauseln um, erstellen die zugehรถrige Unterabfrage und warnen vor NOT IN NULL-Fallen. Sie schlagen auรŸerdem Indizes und EXPLAIN-Hinweise zur Optimierung vor.

Ja. Ein KI-Copilot erkennt Unterabfragemuster und schreibt IN als EXISTS oder NOT IN als NOT EXISTS um, wodurch die NULL-Sicherheit und die Leistung bei groรŸen Tabellen verbessert werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: