SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite-Unterabfrage

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.