Ringkasan :dalam tutorial ini, Anda akan belajar tentang subquery SQLite untuk membuat kueri yang lebih mudah dibaca dan kompleks.
Pengantar subkueri SQLite
Subquery adalah SELECT
pernyataan bersarang di pernyataan lain. Lihat pernyataan berikut.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Kueri berikut adalah kueri luar :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
Dan kueri berikut adalah subkueri .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Anda harus menggunakan sepasang tanda kurung untuk menyertakan subquery. Perhatikan bahwa Anda dapat menyarangkan subkueri di dalam subkueri lain dengan kedalaman tertentu.
Biasanya, subquery mengembalikan satu baris sebagai nilai atom, meskipun mungkin mengembalikan beberapa baris untuk membandingkan nilai dengan IN
operator.
Anda dapat menggunakan subquery di SELECT
, FROM
, WHERE
, dan JOIN
klausa.
Contoh subkueri SQLite
Kami akan menggunakan tracks
dan albums
tabel dari database sampel untuk demonstrasi.
1) subquery SQLite di WHERE
contoh klausa
Anda dapat menggunakan subquery sederhana sebagai kondisi pencarian. Misalnya, pernyataan berikut mengembalikan semua trek dalam album dengan judul 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)
Subquery mengembalikan id album dengan judul 'Let There Be Rock'
. Kueri menggunakan operator yang sama (=) untuk membandingkan albumid
dikembalikan oleh subquery dengan albumid
di tracks
tabel.
Jika subquery mengembalikan beberapa nilai, Anda dapat menggunakan IN
operator untuk memeriksa keberadaan satu nilai terhadap satu set nilai.
Lihat employees
berikut ini dan customers
tabel dalam database sampel:
Misalnya, kueri berikut menampilkan pelanggan yang perwakilan penjualannya berada di Kanada.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Subquery mengembalikan daftar id karyawan yang berlokasi di Kanada. Kueri luar menggunakan IN
operator untuk menemukan pelanggan yang memiliki id perwakilan penjualan dalam daftar.
2) subquery SQLite di FROM
contoh klausa
Terkadang Anda ingin menerapkan fungsi agregat ke kolom beberapa kali. Misalnya, pertama, Anda ingin menjumlahkan ukuran album, lalu menghitung ukuran rata-rata semua album. Anda dapat mengajukan pertanyaan berikut.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Kueri ini tidak valid.
Untuk memperbaikinya, Anda dapat menggunakan subquery di FROM
klausa sebagai berikut:
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
Dalam hal ini, SQLite pertama-tama mengeksekusi subquery di FROM
klausa dan mengembalikan set hasil. Kemudian, SQLite menggunakan kumpulan hasil ini sebagai tabel turunan di kueri luar.
Subquery berkorelasi SQLite
Semua subquery yang telah Anda lihat sejauh ini dapat dieksekusi secara independen. Dengan kata lain, itu tidak tergantung pada kueri luar.
Subquery berkorelasi adalah subquery yang menggunakan nilai dari kueri luar. Tidak seperti subquery ordinal, subquery berkorelasi tidak dapat dieksekusi secara independen.
Subquery yang berkorelasi tidak efisien karena dievaluasi untuk setiap baris yang diproses oleh outer query.
Kueri berikut menggunakan subkueri terkait untuk mengembalikan album yang ukurannya kurang dari 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)
Cara kerja kueri.
- Untuk setiap baris yang diproses di kueri luar, subkueri yang berkorelasi menghitung ukuran album dari trek yang termasuk dalam album saat ini menggunakan
SUM
fungsi. - Predikat pada
WHERE
klausa memfilter album yang berukuran lebih besar atau sama dengan 10 MB (10000000 byte).
Subquery berkorelasi SQLite di SELECT
contoh klausa
Kueri berikut menggunakan subkueri berkorelasi di SELECT
klausa untuk mengembalikan jumlah trek dalam 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)
Dalam tutorial ini, kami telah memperkenalkan Anda ke subkueri dan menunjukkan berbagai cara menggunakan subkueri dalam kueri untuk memilih data dari tabel.