Zusammenfassung :In diesem Tutorial lernen Sie die SQLite-Unterabfrage kennen, um besser lesbare und komplexere Abfragen zu erstellen.
Einführung in die SQLite-Unterabfrage
Eine Unterabfrage ist ein SELECT
Anweisung, die in einer anderen Anweisung verschachtelt ist. Siehe folgende Anweisung.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Die folgende Abfrage ist die äußere Abfrage :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
Und die folgende Abfrage ist die Unterabfrage .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Sie müssen ein Klammerpaar verwenden, um eine Unterabfrage einzuschließen. Beachten Sie, dass Sie eine Unterabfrage innerhalb einer anderen Unterabfrage mit einer bestimmten Tiefe verschachteln können.
Normalerweise gibt eine Unterabfrage eine einzelne Zeile als atomaren Wert zurück, obwohl sie mehrere Zeilen zurückgeben kann, um Werte mit IN
zu vergleichen Betreiber.
Sie können eine Unterabfrage im SELECT
verwenden , FROM
, WHERE
, und JOIN
Klauseln.
Beispiele für SQLite-Unterabfragen
Wir werden die tracks
verwenden und albums
Tabellen aus der Beispieldatenbank für die Demonstration.
1) SQLite-Unterabfrage im WHERE
Klauselbeispiel
Sie können eine einfache Unterabfrage als Suchbedingung verwenden. Die folgende Anweisung gibt beispielsweise alle Tracks im Album mit dem Titel Let There Be Rock
zurück
SELECT trackid,
name,
albumid
FROM tracks
WHERE albumid = (
SELECT albumid
FROM albums
WHERE title = 'Let There Be Rock'
);
Code language: SQL (Structured Query Language) (sql)
Die Unterabfrage gibt die ID des Albums mit dem Titel 'Let There Be Rock'
zurück . Die Abfrage verwendet den Gleichheitsoperator (=), um albumid
zu vergleichen von der Unterabfrage mit albumid
zurückgegeben in den tracks
Tabelle.
Wenn die Unterabfrage mehrere Werte zurückgibt, können Sie den IN
verwenden Operator, um das Vorhandensein eines einzelnen Werts gegen eine Menge von Werten zu prüfen.
Siehe folgende employees
und customers
Tabelle in der Beispieldatenbank:
Die folgende Abfrage gibt beispielsweise die Kunden zurück, deren Vertriebsmitarbeiter sich in Kanada befinden.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Die Unterabfrage gibt eine Liste mit IDs der Mitarbeiter zurück, die sich in Kanada befinden. Die äußere Abfrage verwendet den IN
Operator, um die Kunden zu finden, die die Vertriebsmitarbeiter-ID in der Liste haben.
2) SQLite-Unterabfrage im FROM
Klauselbeispiel
Manchmal möchten Sie Aggregatfunktionen mehrmals auf eine Spalte anwenden. Sie möchten beispielsweise zuerst die Größe eines Albums summieren und dann die durchschnittliche Größe aller Alben berechnen. Sie können auf die folgende Abfrage kommen.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Diese Abfrage ist ungültig.
Um dies zu beheben, können Sie eine Unterabfrage im FROM
verwenden Klausel wie folgt:
SELECT
AVG(album.size)
FROM
(
SELECT
SUM(bytes) SIZE
FROM
tracks
GROUP BY
albumid
) AS album;
Code language: SQL (Structured Query Language) (sql)
AVG(album.size) --------------- 338288920.317
In diesem Fall führt SQLite zuerst die Unterabfrage im FROM
aus -Klausel und gibt eine Ergebnismenge zurück. Anschließend verwendet SQLite diese Ergebnismenge als abgeleitete Tabelle in der äußeren Abfrage.
Korrelierte SQLite-Unterabfrage
Alle Unterabfragen, die Sie bisher gesehen haben, können unabhängig voneinander ausgeführt werden. Mit anderen Worten, es hängt nicht von der äußeren Abfrage ab.
Die korrelierte Unterabfrage ist eine Unterabfrage, die die Werte aus der äußeren Abfrage verwendet. Im Gegensatz zu einer ordinalen Unterabfrage kann eine korrelierte Unterabfrage nicht unabhängig ausgeführt werden.
Die korrelierte Unterabfrage ist nicht effizient, da sie für jede von der äußeren Abfrage verarbeitete Zeile ausgewertet wird.
Die folgende Abfrage verwendet eine korrelierte Unterabfrage, um die Alben zurückzugeben, deren Größe weniger als 10 MB beträgt.
SELECT albumid,
title
FROM albums
WHERE 10000000 > (
SELECT sum(bytes)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
ORDER BY title;
Code language: SQL (Structured Query Language) (sql)
Funktionsweise der Abfrage.
- Für jede Zeile, die in der äußeren Abfrage verarbeitet wird, berechnet die korrelierte Unterabfrage die Größe der Alben aus den Titeln, die zum aktuellen Album gehören, unter Verwendung von
SUM
Funktion. - Das Prädikat im
WHERE
-Klausel filtert die Alben mit einer Größe größer oder gleich 10 MB (10000000 Byte).
SQLite korrelierte Unterabfrage im SELECT
Klauselbeispiel
Die folgende Abfrage verwendet eine korrelierte Unterabfrage im SELECT
-Klausel, um die Anzahl der Titel in einem Album zurückzugeben.
SELECT albumid,
title,
(
SELECT count(trackid)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
tracks_count
FROM albums
ORDER BY tracks_count DESC;
Code language: SQL (Structured Query Language) (sql)
In diesem Tutorial haben wir Ihnen die Unterabfrage vorgestellt und verschiedene Möglichkeiten gezeigt, wie Sie eine Unterabfrage in einer Abfrage verwenden können, um Daten aus Tabellen auszuwählen.