Bisher haben wir Daten aus der Datenbank mithilfe einfacher Abfragen und einer einzigen SELECT-Anweisung abgerufen. Dennoch müssen wir immer häufiger Daten auswählen, die viele Bedingungen erfüllen, und hier können wir nicht auf erweiterte Abfragen verzichten. Zu diesem Zweck gibt es in SQL Unterabfragen oder verschachtelte Abfragen, bei denen eine SELECT-Anweisung in einer anderen verschachtelt ist.
Eine Unterabfrage ist eine SELECT-Anweisung, die in einer anderen SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE oder in einer anderen Unterabfrage verschachtelt ist.
Der Unterabfragetext muss in Klammern eingeschlossen werden. Anstelle der Verknüpfung von Tabellen werden häufig Unterabfragen verwendet (JOIN).
Die im DBMS Access verwendeten Datenbanktabellen sind relationale Tabellen, das heißt, alle Tabellen können durch gemeinsame Felder miteinander verknüpft werden. Angenommen, wir speichern Daten in zwei verschiedenen Tabellen und müssen Daten in einer davon auswählen, je nachdem, welche Daten sich in der anderen befinden. Dazu erstellen wir eine weitere Tabelle in unserer Datenbank. Dies wird beispielsweise die Tabelle Sellers mit Informationen zu Lieferanten sein:
Jetzt haben wir zwei Tabellen – Sumproduct und Sellers, die das gleiche Feld City haben. Nehmen wir an, wir müssen zählen, wie viele Produkte allein in Kanada verkauft wurden. Unterabfragen helfen uns dabei. Schreiben wir also zunächst eine Abfrage für eine Stichprobe von Städten in Kanada:
Run SQLSELECT City
FROM Sellers
WHERE Country = 'Canada'
Übergeben wir diese Daten nun an die folgende Abfrage, die Daten aus der Tabelle Sumproduct auswählt:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN ('Montreal','Toronto')
Wir können diese beiden Anfragen auch zu einer kombinieren. Somit ist eine Anfrage, die Daten ausgibt, die Hauptanfrage, und die zweite Anfrage, die Eingabedaten überträgt, ist eine Hilfsanfrage (Unterabfrage). Um eine Unterabfrage einzufügen, verwenden wir die Konstruktion WHERE ... IN (...), die im Abschnitt Erweiterte Filterung besprochen wurde:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN (SELECT City
FROM Sellers
WHERE Country = 'Canada')
Wir können sehen, dass wir die gleichen Daten wie bei zwei separaten Abfragen erhalten haben. Auf die gleiche Weise können wir die Verschachtelungstiefe von Abfragen erhöhen, indem wir Unterabfragen beliebig oft verschachteln.
Wir können Unterabfragen auch als berechnete Felder verwenden. Lassen Sie uns zum Beispiel die Anzahl der verkauften Produkte für jeden Verkäufer mit der folgenden Abfrage anzeigen:
Run SQLSELECT Seller_name, (SELECT SUM(Quantity)
FROM Sumproduct
WHERE Sellers.City = Sumproduct.City) AS Qty
FROM Sellers
Die erste Anweisung SELECT zeigt zwei Spalten an – Seller_name und Qty. Das Feld Qty wird berechnet, es entsteht als Ergebnis der Ausführung der Unterabfrage, die in runden Klammern steht. Diese Unterabfrage wird einmal für jeden Datensatz im Feld „Seller_name“ ausgeführt und wird insgesamt viermal ausgeführt, da vier Verkäufernamen ausgewählt werden.
Außerdem führt in der Unterabfrage die WHERE-Klausel die Join-Funktion aus, da wir mit Hilfe von WHERE die beiden Tabellen über das Feld City verbunden haben und dabei die vollständigen Namen der Spalten (Table.Field) verwendet haben.