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.0Andere Erweiterungen