Samenvatting :in deze tutorial leer je over de SQLite-subquery om leesbare en complexere queries te maken.
Inleiding tot SQLite-subquery
Een subquery is een SELECT
verklaring genest in een andere verklaring. Zie de volgende verklaring.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
De volgende zoekopdracht is de buitenste zoekopdracht :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
En de volgende zoekopdracht is de subquery .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
U moet een paar haakjes gebruiken om een subquery in te sluiten. Merk op dat je een subquery kunt nesten in een andere subquery met een bepaalde diepte.
Meestal retourneert een subquery een enkele rij als een atomaire waarde, hoewel het meerdere rijen kan retourneren voor het vergelijken van waarden met de IN
telefoniste.
U kunt een subquery gebruiken in de SELECT
, FROM
, WHERE
, en JOIN
clausules.
SQLite-subqueryvoorbeelden
We gebruiken de tracks
en albums
tabellen uit de voorbeelddatabase voor de demonstratie.
1) SQLite-subquery in de WHERE
clausule voorbeeld
U kunt een eenvoudige subquery gebruiken als zoekvoorwaarde. De volgende instructie retourneert bijvoorbeeld alle nummers in het album met de titel Let There Be Rock
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)
De subquery retourneert de id van het album met de titel 'Let There Be Rock'
. De query gebruikt de equal-operator (=) om albumid
te vergelijken geretourneerd door de subquery met de albumid
in de tracks
tafel.
Als de subquery meerdere waarden retourneert, kunt u de IN
. gebruiken operator om te controleren op het bestaan van een enkele waarde ten opzichte van een reeks waarden.
Zie de volgende employees
en customers
tabel in de voorbeelddatabase:
De volgende zoekopdracht retourneert bijvoorbeeld de klanten van wie de verkoopvertegenwoordigers in Canada zijn.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
De subquery retourneert een lijst met id's van de werknemers die zich in Canada bevinden. De buitenste query gebruikt de IN
operator om de klanten te vinden die de ID van de vertegenwoordiger in de lijst hebben.
2) SQLite-subquery in de FROM
clausule voorbeeld
Soms wilt u aggregatiefuncties meerdere keren op een kolom toepassen. U wilt bijvoorbeeld eerst de grootte van een album optellen en vervolgens de gemiddelde grootte van alle albums berekenen. U kunt de volgende vraag bedenken.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Deze zoekopdracht is niet geldig.
Om het op te lossen, kunt u een subquery gebruiken in de FROM
clausule als volgt:
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 dit geval voert SQLite eerst de subquery uit in de FROM
clausule en retourneert een resultaatset. Vervolgens gebruikt SQLite deze resultatenset als een afgeleide tabel in de buitenste query.
SQLite gecorreleerde subquery
Alle subquery's die u tot nu toe hebt gezien, kunnen onafhankelijk worden uitgevoerd. Met andere woorden, het hangt niet af van de buitenste vraag.
De gecorreleerde subquery is een subquery die de waarden uit de buitenste query gebruikt. In tegenstelling tot een ordinale subquery, kan een gecorreleerde subquery niet onafhankelijk worden uitgevoerd.
De gecorreleerde subquery is niet efficiënt omdat deze wordt geëvalueerd voor elke rij die door de buitenste query wordt verwerkt.
De volgende query gebruikt een gecorreleerde subquery om de albums te retourneren waarvan de grootte kleiner is dan 10 MB.
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)
Hoe de zoekopdracht werkt.
- Voor elke rij die in de buitenste query wordt verwerkt, berekent de gecorreleerde subquery de grootte van de albums op basis van de nummers die bij het huidige album horen met behulp van de
SUM
functie. - Het predikaat in de
WHERE
clausule filtert de albums die groter zijn dan of gelijk zijn aan 10 MB (10000000 bytes).
SQLite gecorreleerde subquery in de SELECT
clausule voorbeeld
De volgende query gebruikt een gecorreleerde subquery in de SELECT
clausule om het aantal nummers in een album terug te geven.
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 deze zelfstudie hebben we u kennis laten maken met de subquery en verschillende manieren laten zien om een subquery in een query te gebruiken om gegevens uit tabellen te selecteren.