Cara bermain Subquery Matryoshka
- Baca instruksi level. Arena menampilkan kotak hasil tiap query dalam, query luar dengan kotak itu sudah dicolokkan, baris query luar beserta nilai TRUE, FALSE, atau UNKNOWN, lalu hasil query-mu dan hasil yang dicari (putus-putus).
- Ketik query di editor. Query dalam yang tidak membaca kolom query luar dijalankan sekali, jadi kotaknya berisi satu nilai, satu daftar, atau satu tabel.
- Query dalam yang membaca kolom query luar (berkorelasi) dijalankan ulang untuk tiap baris luar. Hasilnya per baris muncul di kolom berhuruf sama pada tabel query luar.
- Tekan Cek jawaban atau Ctrl + Enter. Yang dicek isi hasilnya, jadi
IN (SELECT ...)danEXISTSsama-sama benar kalau barisnya sama. - Kalau buntu, buka Petunjuk. Level yang sudah selesai tetap tercentang di browser yang sama.
Yang kamu pelajari
- Level 1
Subquery satu nilai
harga > (SELECT AVG(harga) FROM kopi)membandingkan dengan hasil query dalam. - Level 3
Harus tepat satu baris
Subquery yang dipakai dengan
=atau>error kalau menghasilkan lebih dari satu baris. - Level 4
IN (SELECT ...)
Query dalam menghasilkan daftar, query luar memakai
IN. - Level 6
NOT IN dan NULL
Satu NULL di daftar membuat
NOT INbernilai UNKNOWN untuk semua baris. - Level 7
EXISTS berkorelasi
Query dalam membaca kolom query luar dan dijalankan ulang per baris.
- Level 8
NOT EXISTS
Mencari baris tanpa pasangan, aman dari NULL di tabel dalam.
- Level 10
Subquery di FROM
Hasil query dalam dipakai seperti tabel, wajib diberi alias.
NOT IN dengan NULL hasilnya kosong
id NOT IN (1, 3, NULL) sama dengan id <> 1 AND id <> 3 AND id <> NULL. Perbandingan dengan NULL selalu UNKNOWN, jadi untuk kopi nomor 2 hasilnya TRUE AND TRUE AND UNKNOWN, yaitu UNKNOWN. WHERE membuang UNKNOWN, jadi tidak ada kopi yang lolos, walaupun kopi nomor 2 jelas tidak ada di daftar.
Ada dua cara aman. Buang NULL di query dalam dengan WHERE kopi_id IS NOT NULL, atau pakai NOT EXISTS (SELECT 1 FROM ulasan AS u WHERE u.kopi_id = k.id). NOT EXISTS hanya bertanya apakah ada baris yang cocok, dan baris berisi NULL tidak pernah cocok, jadi NULL tidak ikut mengacaukan hasilnya.
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Apakah query-nya dijalankan di database sungguhan?
Tidak. Query diurai dan dijalankan oleh mesin SQL kecil di browser dengan data contoh, jadi tidak ada data yang bisa rusak.
Lebih cepat mana, subquery atau JOIN?
Untuk IN dan EXISTS, database modern biasanya mengubahnya jadi rencana yang mirip dengan JOIN, jadi pilih yang paling mudah dibaca. Subquery berkorelasi yang tidak bisa diubah seperti itu memang dijalankan per baris, dan bisa lambat di tabel besar tanpa indeks di kolom penghubungnya.
Kenapa SELECT 1 di dalam EXISTS?
EXISTS hanya peduli ada baris atau tidak, bukan isinya. SELECT 1 menegaskan hal itu. SELECT * di dalam EXISTS juga sah dan hasilnya sama.
Subquery apa saja yang belum didukung di game ini?
Yang sudah ada: subquery satu nilai di SELECT dan WHERE, IN (SELECT ...), EXISTS, subquery berkorelasi, dan subquery di FROM dengan alias. ANY, ALL, LATERAL, dan WITH (CTE) belum didukung.