PostgreSQL - Unterabfragen

Eine Unterabfrage oder innere Abfrage oder verschachtelte Abfrage ist eine Abfrage in einer anderen PostgreSQL-Abfrage und eingebettet in die WHERE-Klausel.

Eine Unterabfrage wird verwendet, um Daten zurückzugeben, die in der Hauptabfrage als Bedingung verwendet werden, um die abzurufenden Daten weiter einzuschränken.

Unterabfragen können mit den Anweisungen SELECT, INSERT, UPDATE und DELETE zusammen mit den Operatoren wie =, <,>,> =, <=, IN usw. verwendet werden.

Es gibt einige Regeln, denen Unterabfragen folgen müssen -

  • Unterabfragen müssen in Klammern stehen.

  • Eine Unterabfrage kann nur eine Spalte in der SELECT-Klausel enthalten, es sei denn, die Hauptabfrage enthält mehrere Spalten für die Unterabfrage, um die ausgewählten Spalten zu vergleichen.

  • Ein ORDER BY kann nicht in einer Unterabfrage verwendet werden, obwohl die Hauptabfrage ein ORDER BY verwenden kann. Mit GROUP BY kann dieselbe Funktion wie mit ORDER BY in einer Unterabfrage ausgeführt werden.

  • Unterabfragen, die mehr als eine Zeile zurückgeben, können nur mit mehreren Wertoperatoren verwendet werden, z. B. dem Operator IN, EXISTS, NOT IN, ANY / SOME, ALL.

  • Der Operator BETWEEN kann nicht mit einer Unterabfrage verwendet werden. Das ZWISCHEN kann jedoch innerhalb der Unterabfrage verwendet werden.

Unterabfragen mit der SELECT-Anweisung

Unterabfragen werden am häufigsten mit der SELECT-Anweisung verwendet. Die grundlegende Syntax lautet wie folgt:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Beispiel

Betrachten Sie die COMPANY- Tabelle mit den folgenden Datensätzen:

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Lassen Sie uns nun die folgende Unterabfrage mit der SELECT-Anweisung überprüfen:

testdb=# SELECT *
   FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY
      WHERE SALARY > 45000) ;

Dies würde das folgende Ergebnis erzeugen -

id | name  | age |  address    | salary
----+-------+-----+-------------+--------
  4 | Mark  |  25 | Rich-Mond   |  65000
  5 | David |  27 | Texas       |  85000
(2 rows)

Unterabfragen mit der INSERT-Anweisung

Unterabfragen können auch mit INSERT-Anweisungen verwendet werden. Die INSERT-Anweisung verwendet die von der Unterabfrage zurückgegebenen Daten, um sie in eine andere Tabelle einzufügen. Die ausgewählten Daten in der Unterabfrage können mit einer beliebigen Zeichen-, Datums- oder Zahlenfunktion geändert werden.

Die grundlegende Syntax lautet wie folgt:

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ] ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Beispiel

Stellen Sie sich eine Tabelle COMPANY_BKP mit einer ähnlichen Struktur wie die Tabelle COMPANY vor, die mit derselben CREATE TABLE unter Verwendung von COMPANY_BKP als Tabellenname erstellt werden kann. Um nun die vollständige COMPANY-Tabelle in COMPANY_BKP zu kopieren, folgt die folgende Syntax:

testdb=# INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY) ;

Unterabfragen mit der UPDATE-Anweisung

Die Unterabfrage kann in Verbindung mit der UPDATE-Anweisung verwendet werden. Bei Verwendung einer Unterabfrage mit der UPDATE-Anweisung können entweder einzelne oder mehrere Spalten in einer Tabelle aktualisiert werden.

Die grundlegende Syntax lautet wie folgt:

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Beispiel

Angenommen, wir haben die Tabelle COMPANY_BKP zur Verfügung, bei der es sich um eine Sicherung der Tabelle COMPANY handelt.

Im folgenden Beispiel wird das Gehalt in der COMPANY-Tabelle für alle Kunden, deren ALTER größer oder gleich 27 ist, um das 0,50-fache aktualisiert.

testdb=# UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

Dies würde zwei Zeilen betreffen und schließlich würde die COMPANY-Tabelle die folgenden Datensätze enthalten:

id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  1 | Paul  |  32 | California  |  10000
  5 | David |  27 | Texas       |  42500
(7 rows)

Unterabfragen mit der DELETE-Anweisung

Die Unterabfrage kann wie alle anderen oben genannten Anweisungen in Verbindung mit der Anweisung DELETE verwendet werden.

Die grundlegende Syntax lautet wie folgt:

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Beispiel

Angenommen, wir haben die Tabelle COMPANY_BKP zur Verfügung, die eine Sicherung der Tabelle COMPANY ist.

Im folgenden Beispiel werden Datensätze aus der COMPANY-Tabelle für alle Kunden gelöscht, deren ALTER größer oder gleich 27 ist.

testdb=# DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE > 27 );

Dies würde zwei Zeilen betreffen und schließlich würde die COMPANY-Tabelle die folgenden Datensätze enthalten:

id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  5 | David |  27 | Texas       |  42500
(6 rows)