sql >> Database teknologi >  >> RDS >> SQLite

SQLite underforespørgsel

Oversigt :i dette selvstudie lærer du om SQLite-underforespørgslen for at konstruere mere læsbare og komplekse forespørgsler.

Introduktion til SQLite-underforespørgsel

En underforespørgsel er en SELECT sætning indlejret i en anden erklæring. Se følgende erklæring.

SELECT column_1
FROM table_1
WHERE column_1 = (
   SELECT column_1 
   FROM table_2
);Code language: SQL (Structured Query Language) (sql)

Følgende forespørgsel er den ydre forespørgsel :

SELECT column_1
  FROM table_1
 WHERE colum_1 =Code language: SQL (Structured Query Language) (sql)

Og den følgende forespørgsel er underforespørgslen .

(SELECT column_1
  FROM table_2)Code language: SQL (Structured Query Language) (sql)

Du skal bruge et par parenteser for at omslutte en underforespørgsel. Bemærk, at du kan indlejre en underforespørgsel i en anden underforespørgsel med en vis dybde.

Typisk returnerer en underforespørgsel en enkelt række som en atomværdi, selvom den kan returnere flere rækker for at sammenligne værdier med IN operatør.

Du kan bruge en underforespørgsel i SELECT , FROM , WHERE , og JOIN klausuler.

Eksempler på SQLite-underforespørgsler

Vi vil bruge tracks og albums tabeller fra prøvedatabasen til demonstrationen.

1) SQLite-underforespørgsel i WHERE klausuleksempel

Du kan bruge en simpel underforespørgsel som en søgebetingelse. For eksempel returnerer følgende sætning alle numrene i albummet med titlen 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)

Underforespørgslen returnerer albummets id med titlen 'Let There Be Rock' . Forespørgslen bruger lige-operatoren (=) til at sammenligne albumid returneres af underforespørgslen med albumid i tracks tabel.

Hvis underforespørgslen returnerer flere værdier, kan du bruge IN operatør for at kontrollere, om der findes en enkelt værdi i forhold til et værdisæt.

Se følgende employees og customers tabel i eksempeldatabasen:

For eksempel returnerer følgende forespørgsel de kunder, hvis salgsrepræsentanter er i Canada.

SELECT customerid,
       firstname,
       lastname
  FROM customers
 WHERE supportrepid IN (
           SELECT employeeid
             FROM employees
            WHERE country = 'Canada'
       );
Code language: SQL (Structured Query Language) (sql)

Underforespørgslen returnerer en liste over id'er for de medarbejdere, der befinder sig i Canada. Den ydre forespørgsel bruger IN operatør for at finde de kunder, der har salgsrepræsentant-id'et på listen.

2) SQLite-underforespørgsel i FROM klausuleksempel

Nogle gange vil du anvende aggregerede funktioner til en kolonne flere gange. For eksempel vil du først summere størrelsen af ​​et album og derefter beregne den gennemsnitlige størrelse af alle albums. Du kan komme med følgende forespørgsel.

SELECT AVG(SUM(bytes) 
FROM tracks
GROUP BY albumid;Code language: SQL (Structured Query Language) (sql)

Denne forespørgsel er ikke gyldig.

For at rette det, kan du bruge en underforespørgsel i FROM klausul som følger:

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

I dette tilfælde udfører SQLite først underforespørgslen i FROM klausul og returnerer et resultatsæt. Derefter bruger SQLite dette resultatsæt som en afledt tabel i den ydre forespørgsel.

SQLite-korreleret underforespørgsel

Alle de underforespørgsler, du har set indtil videre, kan udføres uafhængigt. Med andre ord afhænger det ikke af den ydre forespørgsel.

Den korrelerede underforespørgsel er en underforespørgsel, der bruger værdierne fra den ydre forespørgsel. I modsætning til en ordinær underforespørgsel kan en korreleret underforespørgsel ikke udføres uafhængigt.

Den korrelerede underforespørgsel er ikke effektiv, fordi den evalueres for hver række, der behandles af den ydre forespørgsel.

Følgende forespørgsel bruger en korreleret underforespørgsel til at returnere de album, hvis størrelse er mindre end 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)

Sådan fungerer forespørgslen.

  • For hver række, der behandles i den ydre forespørgsel, beregner den korrelerede underforespørgsel størrelsen af ​​albummene ud fra de spor, der tilhører det aktuelle album ved hjælp af SUM funktion.
  • Prdikatet i WHERE klausul filtrerer de album, der har en størrelse større end eller lig med 10 MB (10000000 bytes).

SQLite-korreleret underforespørgsel i SELECT klausuleksempel

Følgende forespørgsel bruger en korreleret underforespørgsel i SELECT klausul for at returnere antallet af spor i et album.

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)

I denne øvelse har vi introduceret dig til underforespørgslen og vist forskellige måder at bruge en underforespørgsel i en forespørgsel til at vælge data fra tabeller.


  1. Postgresql COPY-kommando, der giver tilladelser nægtet fejl

  2. Sådan opdaterer du en kolonne baseret på en anden kolonne i SQL

  3. MySQL – Forskellige metoder til at kende nuværende bruger

  4. ASIN() Funktion i Oracle