Podsumowanie :w tym samouczku dowiesz się o podzapytaniu SQLite do tworzenia bardziej czytelnych i złożonych zapytań.
Wprowadzenie do podzapytania SQLite
Podzapytanie to SELECT
instrukcja zagnieżdżona w innej instrukcji. Zobacz następujące oświadczenie.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Poniższe zapytanie to zapytanie zewnętrzne :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
A następujące zapytanie to podzapytanie .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Aby umieścić podzapytanie, musisz użyć pary nawiasów. Zwróć uwagę, że możesz zagnieździć podzapytanie w innym podzapytaniu o określonej głębokości.
Zazwyczaj podzapytanie zwraca pojedynczy wiersz jako wartość niepodzielną, chociaż może zwrócić wiele wierszy w celu porównania wartości z IN
operatora.
Możesz użyć podzapytania w SELECT
, FROM
, WHERE
i JOIN
klauzule.
Przykłady podzapytań SQLite
Użyjemy tracks
i albums
tabele z przykładowej bazy danych do demonstracji.
1) Podzapytanie SQLite w WHERE
przykład klauzuli
Możesz użyć prostego podzapytania jako warunku wyszukiwania. Na przykład poniższa instrukcja zwraca wszystkie utwory w albumie o tytule 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)
Podzapytanie zwraca identyfikator albumu o tytule 'Let There Be Rock'
. Zapytanie używa operatora równości (=) do porównania albumid
zwrócone przez podzapytanie z albumid
w tracks
tabela.
Jeśli podzapytanie zwraca wiele wartości, możesz użyć IN
operatora, aby sprawdzić istnienie pojedynczej wartości w zestawie wartości.
Zobacz następujących employees
i customers
tabela w przykładowej bazie danych:
Na przykład poniższe zapytanie zwraca klientów, których przedstawiciele handlowi znajdują się w Kanadzie.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Podzapytanie zwraca listę identyfikatorów pracowników, którzy znajdują się w Kanadzie. Zapytanie zewnętrzne używa IN
operatora, aby znaleźć klientów, którzy mają identyfikator przedstawiciela handlowego na liście.
2) Podzapytanie SQLite w FROM
przykład klauzuli
Czasami chcesz wielokrotnie zastosować funkcje agregujące do kolumny. Na przykład najpierw chcesz zsumować rozmiar albumu, a następnie obliczyć średni rozmiar wszystkich albumów. Możesz wymyślić następujące zapytanie.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
To zapytanie jest nieprawidłowe.
Aby to naprawić, możesz użyć podzapytania w FROM
klauzula w następujący sposób:
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
W tym przypadku SQLite najpierw wykonuje podzapytanie w FROM
klauzula i zwraca zestaw wyników. Następnie SQLite używa tego zestawu wyników jako tabeli pochodnej w zewnętrznym zapytaniu.
skorelowane podzapytanie SQLite
Wszystkie podzapytania, które do tej pory widziałeś, mogą być wykonywane niezależnie. Innymi słowy, nie zależy to od zewnętrznego zapytania.
Skorelowane podzapytanie to podzapytanie, które używa wartości z zapytania zewnętrznego. W przeciwieństwie do podzapytania porządkowego, skorelowane podzapytanie nie może być wykonane niezależnie.
Skorelowane podzapytanie nie jest wydajne, ponieważ jest oceniane dla każdego wiersza przetwarzanego przez zapytanie zewnętrzne.
Poniższe zapytanie używa skorelowanego podzapytania, aby zwrócić albumy, których rozmiar jest mniejszy niż 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)
Jak działa zapytanie.
- Dla każdego wiersza przetworzonego w zapytaniu zewnętrznym skorelowane podzapytanie oblicza rozmiar albumów na podstawie utworów należących do bieżącego albumu za pomocą
SUM
funkcja. - Predykat w
WHERE
Klauzula filtruje albumy o rozmiarze większym lub równym 10 MB (10000000 bajtów).
skorelowane podzapytanie SQLite w SELECT
przykład klauzuli
Poniższe zapytanie używa skorelowanego podzapytania w SELECT
klauzula zwracająca liczbę utworów w albumie.
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)
W tym samouczku wprowadziliśmy Cię do podzapytania i pokazaliśmy różne sposoby użycia podzapytania w zapytaniu w celu wybrania danych z tabel.