sql >> Database >  >> RDS >> SQLite

SQLite-subquery

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.


  1. In plaats van LIKE en ~, waarom werkt alleen VERGELIJKBAAR MET als regex-match met alternatieven wordt uitgevoerd?

  2. Scalaire UDF-inlining in SQL Server 2019

  3. pg gem installeren; FOUT:kan de native extensie van de edelsteen niet bouwen

  4. Databasemodel voor het reserveringssysteem van een rijschool. Deel 2