VIEW: Menyimpan Query Favoritmu Sebagai "Tabel Virtual"
Membuat VIEW agar query laporan yang panjang bisa dipakai ulang seperti tabel, menyembunyikan kolom sensitif, dan mengetahui batas-batasnya.
Query laporan yang itu-itu lagi
Ingat query laporan di bab JOIN yang panjang itu? Bayangkan tim keuangan, tim marketing, dan aplikasi dashboard semuanya membutuhkannya. Menyalin query sepanjang 10 baris ke mana-mana berbahaya: jika ada yang diubah, harus mengedit di banyak tempat. VIEW menyelesaikannya.
View adalah query yang disimpan dengan sebuah nama. Setelah dibuat, kamu memakainya persis seperti tabel:
CREATE VIEW v_laporan_pesanan AS
SELECT p.id AS no_pesanan,
pl.nama AS pelanggan,
p.tanggal,
p.status,
SUM(d.jumlah * pr.harga) AS total
FROM pesanan p
JOIN pelanggan pl ON pl.id = p.pelanggan_id
JOIN detail_pesanan d ON d.pesanan_id = p.id
JOIN produk pr ON pr.id = d.produk_id
GROUP BY p.id, pl.nama, p.tanggal, p.status;
-- memakainya semudah ini:
SELECT * FROM v_laporan_pesanan WHERE status = 'lunas' AND total >= 60000;
Analogi: view seperti shortcut di desktop atau jendela kaca ke tabel aslinya. Datanya tidak disalin; setiap kali dipakai, MySQL menjalankan query di dalamnya dan mengembalikan data terbaru.
Manfaat view
- Menyederhanakan: query rumit ditulis sekali, dipakai di mana-mana.
- Konsisten: definisi "total pesanan" satu versi saja, bukan tiga versi berbeda di tiga laporan.
- Keamanan: berikan hak akses ke view yang hanya menampilkan kolom tertentu, bukan ke tabel aslinya. Misalnya view pelanggan tanpa kolom email dan alamat.
- Menjaga kompatibilitas: struktur tabel berubah, cukup perbarui view, aplikasi tetap bekerja.
Mengelola view
CREATE OR REPLACE VIEW v_laporan_pesanan AS SELECT ...; -- mengubah definisi
DROP VIEW v_laporan_pesanan; -- menghapus view (data tabel aman)
SHOW FULL TABLES WHERE Table_type = 'VIEW'; -- daftar view
Batasan yang perlu diketahui
- View biasa tidak menyimpan data sehingga tidak otomatis lebih cepat; ia hanya menyingkat penulisan. View di atas tabel raksasa dengan JOIN berat tetap berat.
- View sederhana (satu tabel, tanpa GROUP BY) umumnya bisa di-
INSERT/UPDATE/DELETE; view dengan JOIN/agregat umumnya hanya untuk dibaca. - Jika tabel dasar diubah (kolom dihapus), view yang bergantung padanya bisa error.
- MySQL tidak punya materialized view bawaan (view yang benar-benar menyimpan hasil); biasanya ditiru dengan tabel ringkasan yang diperbarui terjadwal.
Konvensi: awali nama view dengan v_ (atau vw_) supaya mudah dibedakan dari tabel di daftar objek database.