SQLite -Unterabfragen

Eine Unterabfrage, auch innere Abfrage oder verschachtelte Abfrage genannt, bezeichnet das Einbetten einer Abfrageanweisung in die WHERE-Klausel einer SQLite-Abfrage.

Das Ergebnis einer SELECT-Anweisung kann als Eingabewert für eine andere Anweisung verwendet werden.

Unterabfragen können mit SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen verwendet werden und können von Operatoren wie =, <, >, >=, <=, IN, BETWEEN usw. begleitet werden.

Im Folgenden finden Sie mehrere Regeln, die Unterabfragen einhalten müssen:

  • Unterabfragen müssen in Klammern eingeschlossen werden.

  • Eine Unterabfrage kann nur eine Spalte in der SELECT-Klausel haben, es sei denn, die Hauptabfrage hat mehrere Spalten, um sie mit den ausgewählten Spalten der Unterabfrage zu vergleichen.

  • ORDER BY kann nicht in einer Unterabfrage verwendet werden, obwohl die Hauptabfrage ORDER BY verwenden kann. GROUP BY kann in einer Unterabfrage verwendet werden und funktioniert genauso wie ORDER BY.

  • Wenn eine Unterabfrage mehr als eine Zeile zurückgibt, kann sie nur mit Operatoren für mehrere Werte wie dem IN-Operator verwendet werden.

  • Der BETWEEN-Operator kann nicht mit einer Unterabfrage verwendet werden; BETWEEN kann jedoch innerhalb einer Unterabfrage verwendet werden.

Unterabfragen in SELECT-Anweisungen

Unterabfragen werden am häufigsten mit SELECT-Anweisungen 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

Angenommen, die COMPANY-Tabelle enthält die folgenden Datensätze:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Sehen wir uns nun die Verwendung von Unterabfragen in einer SELECT-Anweisung an:

sqlite> SELECT * 
     FROM COMPANY 
     WHERE ID IN (SELECT ID 
                  FROM COMPANY 
                  WHERE SALARY > 45000) ;

Dies erzeugt das folgende Ergebnis:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Unterabfragen in INSERT-Anweisungen

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 mithilfe beliebiger Zeichen-, Datums- oder numerischer Funktionen 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

Angenommen, COMPANY_BKP hat eine ähnliche Struktur wie die Tabelle COMPANY und kann mit demselben CREATE TABLE erstellt werden, außer dass der Tabellenname in COMPANY_BKP geändert wird. Um nun die gesamte Tabelle COMPANY nach COMPANY_BKP zu kopieren, lautet die Syntax wie folgt:

sqlite> INSERT INTO COMPANY_BKP
     SELECT * FROM COMPANY 
     WHERE ID IN (SELECT ID 
                  FROM COMPANY) ;

Unterabfragen in UPDATE-Anweisungen

Unterabfragen können in Verbindung mit UPDATE-Anweisungen verwendet werden. Wenn eine Unterabfrage mit einer UPDATE-Anweisung verwendet wird, werden eine oder mehrere Spalten in der Tabelle aktualisiert.

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, die eine Sicherung der Tabelle COMPANY ist.

Das folgende Beispiel aktualisiert das SALARY aller Kunden in der Tabelle COMPANY, deren AGE größer oder gleich 27 ist, auf das 0.50-fache des ursprünglichen Werts:

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

Dies betrifft zwei Zeilen, und die Datensätze in der Tabelle COMPANY sehen schließlich wie folgt aus:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Unterabfragen in DELETE-Anweisungen

Unterabfragen können in Verbindung mit DELETE-Anweisungen verwendet werden, genau wie die anderen oben genannten Anweisungen.

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, die eine Sicherung der Tabelle COMPANY ist.

Das folgende Beispiel löscht die Datensätze aller Kunden in der Tabelle COMPANY, deren AGE größer als oder gleich 27 ist:

sqlite> DELETE FROM COMPANY
     WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
                   WHERE AGE > 27 );

Dies betrifft zwei Zeilen, und die Datensätze in der Tabelle COMPANY sehen schließlich wie folgt aus:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0
Andere Erweiterungen