SQL - Unterabfragen
Eine Unterabfrage oder innere Abfrage oder eine verschachtelte Abfrage ist eine Abfrage in einer anderen SQL-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, ZWISCHEN 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-Befehl kann nicht in einer Unterabfrage verwendet werden, obwohl die Hauptabfrage einen ORDER BY verwenden kann. Mit dem Befehl GROUP BY kann dieselbe Funktion wie mit dem Befehl ORDER BY in einer Unterabfrage ausgeführt werden.
Unterabfragen, die mehr als eine Zeile zurückgeben, können nur mit mehreren Wertoperatoren wie dem IN-Operator verwendet werden.
Die SELECT-Liste darf keine Verweise auf Werte enthalten, die für ein BLOB, ARRAY, CLOB oder NCLOB ausgewertet werden.
Eine Unterabfrage kann nicht sofort in eine Set-Funktion eingeschlossen werden.
Der Operator BETWEEN kann nicht mit einer Unterabfrage verwendet werden. Der Operator BETWEEN 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 Tabelle CUSTOMERS mit den folgenden Datensätzen:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
Lassen Sie uns nun die folgende Unterabfrage mit einer SELECT-Anweisung überprüfen.
SQL> SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;
Dies würde das folgende Ergebnis erzeugen.
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+
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 CUSTOMERS_BKP mit einer ähnlichen Struktur wie die Tabelle CUSTOMERS vor. Um nun die vollständige CUSTOMERS-Tabelle in die CUSTOMERS_BKP-Tabelle zu kopieren, können Sie die folgende Syntax verwenden.
SQL> INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS) ;
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 CUSTOMERS_BKP zur Verfügung, die eine Sicherung der Tabelle CUSTOMERS darstellt. Im folgenden Beispiel wird das GEHALT in der Tabelle KUNDEN für alle Kunden, deren ALTER größer oder gleich 27 ist, um das 0,25-fache aktualisiert.
SQL> UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
Dies würde sich auf zwei Zeilen auswirken und schließlich würde die Tabelle CUSTOMERS die folgenden Datensätze enthalten.
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 125.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 2125.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
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 eine Tabelle CUSTOMERS_BKP zur Verfügung, die eine Sicherung der Tabelle CUSTOMERS darstellt. Im folgenden Beispiel werden die Datensätze aus der Tabelle CUSTOMERS für alle Kunden gelöscht, deren AGE größer oder gleich 27 ist.
SQL> DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
Dies würde sich auf zwei Zeilen auswirken und schließlich würde die Tabelle CUSTOMERS die folgenden Datensätze enthalten.
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+