Резюме :в този урок ще научите за подзаявката SQLite, за да конструирате по-четливи и сложни заявки.
Въведение в подзаявката на SQLite
Подзаявката е SELECT
изявление, вложено в друго изявление. Вижте следното изявление.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Следната заявка е външната заявка :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
И следната заявка е подзаявката .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Трябва да използвате двойка скоби, за да затворите подзаявка. Имайте предвид, че можете да вмъкнете подзаявка в друга подзаявка с определена дълбочина.
Обикновено подзаявката връща един ред като атомна стойност, въпреки че може да върне няколко реда за сравняване на стойности с IN
оператор.
Можете да използвате подзаявка в SELECT
, FROM
, WHERE
и JOIN
клаузи.
Примери за подзаявки за SQLite
Ще използваме tracks
и albums
таблици от примерната база данни за демонстрацията.
1) SQLite подзаявка в WHERE
пример за клауза
Можете да използвате проста подзаявка като условие за търсене. Например следното изявление връща всички песни в албума със заглавие 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)
Подзаявката връща идентификатора на албума със заглавие 'Let There Be Rock'
. Заявката използва оператора за равенство (=), за да сравни albumid
върнати от подзаявката с albumid
в tracks
таблица.
Ако подзаявката върне множество стойности, можете да използвате IN
оператор за проверка за съществуването на една стойност спрямо набор от стойности.
Вижте следните employees
и customers
таблица в примерната база данни:
Например следната заявка връща клиентите, чиито търговски представители са в Канада.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Подзаявката връща списък с идентификатори на служителите, които се намират в Канада. Външната заявка използва IN
оператор, за да намерите клиентите, които имат идентификатор на търговския представител в списъка.
2) SQLite подзаявка в FROM
пример за клауза
Понякога искате да приложите агрегатни функции към колона няколко пъти. Например, първо искате да сумирате размера на албум и след това да изчислите средния размер на всички албуми. Може да излезете със следната заявка.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Тази заявка не е валидна.
За да го коригирате, можете да използвате подзаявка в FROM
клауза, както следва:
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
В този случай SQLite първо изпълнява подзаявката в FROM
клауза и връща набор от резултати. След това SQLite използва този набор от резултати като производна таблица във външната заявка.
SQLite корелирана подзаявка
Всички подзаявки, които сте виждали досега, могат да бъдат изпълнени независимо. С други думи, не зависи от външната заявка.
Корелираната подзаявка е подзаявка, която използва стойностите от външната заявка. За разлика от редовна подзаявка, корелирана подзаявка не може да бъде изпълнена независимо.
Корелираната подзаявка не е ефективна, защото се оценява за всеки ред, обработен от външната заявка.
Следната заявка използва корелирана подзаявка, за да върне албумите, чийто размер е по-малък от 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)
Как работи заявката.
- За всеки ред, обработен във външната заявка, корелираната подзаявка изчислява размера на албумите от песните, които принадлежат на текущия албум, като използва
SUM
функция. - Предикатът в
WHERE
Клаузата филтрира албумите с размер, по-голям или равен на 10MB (10000000 байта).
SQLite корелирана подзаявка в SELECT
пример за клауза
Следната заявка използва корелирана подзаявка в SELECT
клауза за връщане на броя на песните в албум.
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)
В този урок ви запознахме с подзаявката и показахме различни начини за използване на подзаявка в заявка за избор на данни от таблици.