View Adalah Query yang Disimpan
View adalah pernyataan SELECT yang diberi nama. Setelah dibuat, kamu bisa melakukan query terhadapnya seperti tabel, tapi tidak ada data yang disimpan. Setiap kali kamu membaca view, SQLite menjalankan query di baliknya dari awal.
paid_orders terlihat dan berperilaku seperti tabel. Ia punya kolom, kamu bisa SELECT darinya, kamu bisa melakukan join dengannya. Tapi di balik layar, setiap query diperluas menjadi filter asli WHERE status = 'paid'.
Itulah seluruh model mentalnya: view adalah alias untuk sebuah query.
Kenapa View Berguna
Keuntungan utamanya adalah penamaan. Query yang rumit mendapat nama yang singkat dan deskriptif, dan sisa kodemu tetap mudah dibaca:
Tanpa view, setiap pemanggil harus menulis GROUP BY sendiri, dan salah satu dari mereka bisa saja salah menulis filternya. Dengan view, agregasinya didefinisikan sekali. Pemanggil cukup meminta customer_totals lalu menambahkan filter tambahan apa pun yang mereka butuhkan.
View juga bisa berfungsi sebagai batas ala hak akses. Jika sebuah query tidak boleh menampilkan kolom password_hash, buat view yang memilih semuanya kecuali kolom itu dan minta kode aplikasi memakai view tersebut.
Sintaks CREATE VIEW
Bentuk lengkapnya:
CREATE [TEMPORARY] VIEW [IF NOT EXISTS] view_name [(column_aliases)] AS
SELECT ...;
Beberapa hal yang perlu diketahui:
IF NOT EXISTSdiam-diam melewati pembuatan jika view sudah ada.TEMPORARY(atauTEMP) membuat view yang lenyap saat koneksi ditutup.- Alias kolom di dalam tanda kurung memungkinkanmu mengganti nama kolom view tanpa menyentuh
SELECTdi baliknya.
View ini menampilkan nama yang lebih ramah (item, dollars) tanpa mengganti nama kolom di tabel sumber.
Mengganti dan Menghapus View
SQLite tidak punya CREATE OR REPLACE VIEW atau ALTER VIEW. Untuk mengubah definisi view, hapus lalu buat ulang:
DROP VIEW IF EXISTS active_orders; adalah bentuk yang aman: tidak akan error jika view-nya tidak ada. Menghapus view tidak pernah memengaruhi tabel di baliknya; kamu hanya menghapus query yang tersimpan.
View Sementara
TEMP VIEW hanya ada selama koneksi database saat ini. Saat koneksi ditutup, view-nya hilang. Berguna untuk sesi analisis sesaat ketika kamu tidak ingin meninggalkan definisi:
View sementara juga memungkinkanmu menimpa sebuah nama query tanpa harus menetapkannya di skema, praktis saat sedang bereksplorasi.
Secara Default, View Hanya Bisa Dibaca
Inilah jebakan yang paling penting. Kamu tidak bisa melakukan INSERT, UPDATE, atau DELETE lewat view secara langsung:
sqlite> INSERT INTO paid_orders (customer, amount) VALUES ('Eve', 50);
Runtime error: cannot modify paid_orders because it is a view
Solusinya adalah trigger INSTEAD OF. Kamu menulis trigger yang berjalan sebagai ganti upaya penulisan itu dan menerjemahkannya menjadi operasi sungguhan pada tabel di baliknya:
View-nya tetap view, tapi penulisan terhadapnya sekarang punya tujuan. Kita akan membahas trigger secara lengkap di halaman berikutnya.
Tidak Ada Materialized View, Buat Sendiri
Beberapa database memungkinkanmu menyimpan hasil view di disk sebagai cache dan memperbaruinya sesuai kebutuhan. SQLite tidak. Setiap pembacaan view menjalankan ulang query di baliknya. Untuk sebagian besar beban kerja itu tidak masalah, karena SQLite cepat dan query planner-nya bagus. Untuk agregasi mahal yang di-query berkali-kali, buat tabel sungguhan dan jaga sendiri agar tetap sinkron:
Setelah itu kamu memperbarui cache-nya secara terjadwal, atau memasang trigger pada orders agar tetap mutakhir. Ini pekerjaan manual, tapi juga satu-satunya pilihan di SQLite.
Melihat Daftar View
Metadata view tersimpan di sqlite_master bersama tabel dan index:
Kolom sql mengembalikan pernyataan CREATE VIEW aslinya, berguna saat kamu lupa apa yang dilakukan sebuah view. Di CLI, .schema view_name mencetak hal yang sama dengan lebih rapi.
Kapan Memakai View
View sepadan dipakai saat:
- Query yang tidak sederhana dipakai ulang di tiga tempat atau lebih. Memberinya nama sekali lebih baik daripada copy-paste.
- Kamu ingin menampilkan sebagian kolom atau baris pilihan ke bagian tertentu aplikasi.
- Sebuah agregasi secara konsep adalah satu hal (
monthly_sales,active_users) yang sebaiknya diperlakukan pemanggil sebagai kata benda.
Lewati view saat:
- Query-nya hanya dipakai di satu tempat. Tulis langsung saja.
- Performa penting dan query di baliknya mahal: kamu membayar biaya itu pada setiap pembacaan. Simpan ke tabel sungguhan sebagai cache.
- View itu bergantung pada view lain yang bergantung pada view lain lagi. SQLite menangani sarang seperti ini dengan baik, tapi rantai tiga atau empat view membuat SQL sebenarnya sulit diikuti saat debugging.
Berikutnya: Trigger
View dan trigger sering muncul bersama: pola INSTEAD OF yang membuat view bisa ditulisi adalah salah satu alasan utama trigger ada. Trigger juga berguna dengan sendirinya untuk log audit, update berantai, dan menegakkan invarian. Itu halaman berikutnya.
Pertanyaan yang sering diajukan
Apa itu view di SQLite?
View adalah pernyataan SELECT tersimpan yang bisa kamu query seperti tabel. View tidak menyimpan data apa pun: setiap kali kamu membacanya, SQLite menjalankan ulang query di baliknya. View berguna untuk memberi nama pada query yang rumit sekali saja lalu memakainya di mana-mana, atau untuk menyembunyikan kolom yang tidak boleh dilihat pemanggil.
Bisakah melakukan INSERT atau UPDATE lewat view di SQLite?
Tidak secara langsung. View di SQLite hanya bisa dibaca: INSERT, UPDATE, dan DELETE terhadap view akan gagal. Kamu bisa membuat view bisa ditulisi dengan memasang trigger INSTEAD OF yang menerjemahkan penulisan itu menjadi operasi pada tabel di baliknya.
Apakah SQLite mendukung materialized view?
Tidak. SQLite hanya punya view biasa (virtual): query-nya berjalan setiap kali kamu membaca view. Jika kamu butuh hasil yang di-cache, buat tabel sungguhan lalu perbarui sendiri, atau pakai trigger agar tetap sinkron dengan tabel sumber.
Bagaimana cara melihat daftar semua view di database SQLite?
Query sqlite_master: SELECT name FROM sqlite_master WHERE type = 'view';. Di CLI, .schema menampilkan pernyataan CREATE VIEW dan .tables mencantumkan view bersama tabel.