Bayangkan kamu bekerja di sebuah toko online. Setiap hari, atasan selalu minta laporan yang sama: "Tampilkan nama pelanggan, total pesanan, dan status pembayarannya." Kalau setiap hari kamu harus menulis ulang query panjang itu dari nol — query yang melibatkan JOIN tiga tabel — pasti capek banget, kan? Nah, di sinilah CREATE VIEW MySQL hadir sebagai penyelamatmu.
View adalah cara MySQL untuk "menyimpan" sebuah query SELECT menjadi sebuah virtual tabel. Bukan tabel sungguhan yang menyimpan data di disk, melainkan semacam "shortcut" bernama yang bisa kamu panggil kapan saja seolah-olah memanggil tabel biasa. Konsep ini sangat penting untuk dipahami, terutama saat database-mu mulai kompleks dengan banyak relasi tabel.
Ini adalah artikel ke-25 dari seri 28 artikel Belajar Query SQL MySQL. Di artikel ini, kamu akan belajar cara membuat, menggunakan, mengubah, dan menghapus View di MySQL menggunakan studi kasus toko online yang nyata. Siap? Ayo kita mulai!
Fitur VIEW sudah ada di MySQL sejak versi 5.0 (tahun 2005). Meski sudah lebih dari dua dekade, survei komunitas developer menunjukkan bahwa lebih dari 60% developer pemula masih jarang memanfaatkan View dalam proyek mereka — padahal fitur ini bisa memangkas jumlah kode SQL berulang hingga 70%!
Apa Itu View di MySQL? (dan Kenapa Kamu Butuh Ini)
Analoginya begini: kamu punya resep masakan favorit yang panjang banget — 20 langkah. Daripada menghafal ulang setiap kali masak, kamu tulis di selembar kertas dan kasih nama: "Resep Rendang Spesial". Kapan pun butuh, tinggal buka kertas itu. View di MySQL persis seperti itu.
Secara teknis, View adalah objek database yang berisi definisi query SELECT yang tersimpan. Ketika kamu memanggil View, MySQL akan menjalankan query yang tersimpan di dalamnya secara otomatis dan menampilkan hasilnya seolah-olah itu adalah tabel biasa.
CREATE VIEW nama_view
AS
SELECT kolom1, kolom2, ...
FROM nama_tabel
WHERE kondisi; -- opsional
Misalkan kita punya tabel produk, pelanggan, dan pesanan di database toko online. Berikut contoh sederhana membuat View dari tabel produk:
CREATE VIEW v_produk_aktif AS
SELECT
id_produk,
nama_produk,
harga,
stok,
kategori
FROM produk
WHERE status = 'aktif';
-- Memanggil View (semudah SELECT tabel biasa!)
SELECT * FROM v_produk_aktif;
📊 Output / Hasil Query:
| id_produk | nama_produk | harga | stok | kategori |
|---|---|---|---|---|
| 1 | Laptop Gaming A | 12.500.000 | 15 | Elektronik |
| 3 | Mouse Wireless X | 350.000 | 80 | Aksesori |
| 5 | Headphone Pro Z | 875.000 | 42 | Elektronik |
Biasakan memberi prefix v_ pada nama View (misal: v_produk_aktif). Ini memudahkan kamu membedakan antara tabel sungguhan dan View saat melihat daftar objek di database.
CREATE VIEW MySQL dengan JOIN: Studi Kasus Toko Online
Kekuatan sejati View terasa saat kamu menyimpan query yang melibatkan JOIN beberapa tabel (Artikel22). Di toko online, sangat umum ingin melihat data pesanan lengkap — siapa yang pesan, produk apa, berapa total harga, status pembayaran. Query seperti ini biasanya panjang dan berulang.
Dengan CREATE VIEW MySQL, kamu cukup tulis sekali dan simpan. Selanjutnya, cukup panggil nama View-nya!
CREATE VIEW v_laporan_pesanan AS
SELECT
ps.id_pesanan,
pl.nama_pelanggan,
pl.email,
pr.nama_produk,
ps.jumlah,
(ps.jumlah * pr.harga) AS total_harga,
ps.status_pembayaran,
ps.tanggal_pesan
FROM pesanan ps
JOIN pelanggan pl ON ps.id_pelanggan = pl.id_pelanggan
JOIN produk pr ON ps.id_produk = pr.id_produk;
-- Sekarang panggil sesimple ini!
SELECT * FROM v_laporan_pesanan
WHERE status_pembayaran = 'lunas'
ORDER BY tanggal_pesan DESC;
📊 Output / Hasil Query:
| id_pesanan | nama_pelanggan | nama_produk | jumlah | total_harga | status_pembayaran |
|---|---|---|---|---|---|
| 1021 | Andi Pratama | Laptop Gaming A | 1 | 12.500.000 | lunas |
| 1019 | Sari Dewi | Headphone Pro Z | 2 | 1.750.000 | lunas |
| 1015 | Budi Santoso | Mouse Wireless X | 3 | 1.050.000 | lunas |
View tidak menyimpan data. Setiap kali kamu memanggil View, MySQL menjalankan ulang query aslinya. Artinya, jika query di dalam View lambat (misal JOIN tabel besar tanpa index), pemanggilan View-pun akan lambat. Pastikan tabel yang direferensikan punya index yang tepat!
Mengelola View: Ubah, Cek, dan Hapus
Setelah membuat View, kamu pasti butuh mengelolanya — entah untuk mengubah definisi query-nya, mengecek daftar View yang ada, atau menghapus yang sudah tidak diperlukan. MySQL menyediakan perintah yang lengkap untuk semua itu.
CREATE OR REPLACE VIEW v_produk_aktif AS
SELECT id_produk, nama_produk, harga, stok, kategori, rating
FROM produk
WHERE status = 'aktif';
-- 2. MELIHAT DAFTAR SEMUA VIEW di database
SHOW FULL TABLES WHERE table_type = 'VIEW';
-- 3. MELIHAT DEFINISI sebuah View
SHOW CREATE VIEW v_laporan_pesanan;
-- 4. MENGHAPUS VIEW
DROP VIEW IF EXISTS v_produk_aktif;
📊 Output SHOW FULL TABLES WHERE table_type = 'VIEW':
| Tables_in_toko_online | Table_type |
|---|---|
| v_laporan_pesanan | VIEW |
| v_produk_aktif | VIEW |
Selalu gunakan CREATE OR REPLACE VIEW daripada menghapus dulu lalu membuat ulang. Perintah ini lebih aman karena tidak merusak privilege/permission pengguna yang mungkin sudah diberikan ke View tersebut.
View dengan Agregasi: Statistik Penjualan Instan
View bukan hanya untuk menyederhanakan JOIN. Kamu juga bisa menyimpan query agregasi (detail pembahasan query agregasi pada arikel14) seperti SUM(), COUNT(), dan AVG() di dalamnya. Ini sangat berguna untuk dashboard atau laporan rutin.
CREATE VIEW v_statistik_pelanggan AS
SELECT
pl.id_pelanggan,
pl.nama_pelanggan,
COUNT(ps.id_pesanan) AS total_pesanan,
SUM(ps.jumlah * pr.harga) AS total_belanja,
AVG(ps.jumlah * pr.harga) AS rata_rata_belanja
FROM pelanggan pl
LEFT JOIN pesanan ps ON pl.id_pelanggan = ps.id_pelanggan
LEFT JOIN produk pr ON ps.id_produk = pr.id_produk
GROUP BY pl.id_pelanggan, pl.nama_pelanggan;
-- Siapa pelanggan terbaik kita?
SELECT * FROM v_statistik_pelanggan
ORDER BY total_belanja DESC
LIMIT 5;
📊 Output / Hasil Query:
| id_pelanggan | nama_pelanggan | total_pesanan | total_belanja | rata_rata_belanja |
|---|---|---|---|---|
| 7 | Andi Pratama | 8 | 47.250.000 | 5.906.250 |
| 12 | Sari Dewi | 5 | 31.800.000 | 6.360.000 |
| 3 | Budi Santoso | 11 | 28.450.000 | 2.586.363 |
📋 Referensi Sintaks Lengkap CREATE VIEW MySQL
-- SINTAKS LENGKAP (dengan keterangan)
-- ============================================
CREATE [OR REPLACE] -- OR REPLACE: timpa view lama jika ada
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
-- ALGORITHM: cara MySQL memproses view
VIEW nama_view [(daftar_kolom)]
-- nama_view: identitas view kamu
AS
SELECT ... -- query yang ingin disimpan
[WITH [CASCADED | LOCAL] CHECK OPTION];
-- CHECK OPTION: validasi saat INSERT/UPDATE
🔬 Langkah Praktikum: Dari Nol Sampai Bisa
Buat database toko online dan tiga tabel utama: produk, pelanggan, pesanan.
USE toko_online;
CREATE TABLE produk (
id_produk INT PRIMARY KEY AUTO_INCREMENT,
nama_produk VARCHAR(100),
harga DECIMAL(12,2),
stok INT,
kategori VARCHAR(50),
status ENUM('aktif','nonaktif') DEFAULT 'aktif'
);
Masukkan beberapa baris data ke setiap tabel agar View punya data untuk ditampilkan.
('Laptop Gaming A', 12500000, 15, 'Elektronik', 'aktif'),
('Mouse Wireless X', 350000, 80, 'Aksesori', 'aktif'),
('Headphone Pro Z', 875000, 42, 'Elektronik', 'aktif'),
('Kabel HDMI Lama', 75000, 0, 'Aksesori', 'nonaktif');
Jalankan perintah CREATE VIEW untuk menyimpan query produk aktif.
SELECT id_produk, nama_produk, harga, stok, kategori
FROM produk
WHERE status = 'aktif';
-- Verifikasi: Query view
SELECT * FROM v_produk_aktif;
Buat View laporan pesanan yang menggabungkan tiga tabel sekaligus.
SELECT ps.id_pesanan, pl.nama_pelanggan,
pr.nama_produk, ps.jumlah,
(ps.jumlah * pr.harga) AS total_harga,
ps.status_pembayaran
FROM pesanan ps
JOIN pelanggan pl ON ps.id_pelanggan = pl.id_pelanggan
JOIN produk pr ON ps.id_produk = pr.id_produk;
Panggil View dengan berbagai filter dan ORDER BY untuk membuktikan fleksibilitasnya.
SELECT * FROM v_laporan_pesanan
WHERE total_harga > 5000000;
-- Kombinasikan dengan fungsi agregat
SELECT nama_pelanggan, SUM(total_harga)
FROM v_laporan_pesanan
GROUP BY nama_pelanggan;
📊 Tabel Perbandingan: Tabel Biasa vs View
| Aspek | Tabel Biasa | View |
|---|---|---|
| Penyimpanan Data | ✅ Menyimpan data di disk | ❌ Tidak menyimpan data (virtual) |
| Pembuatan | CREATE TABLE | CREATE VIEW |
| INSERT / UPDATE / DELETE | ✅ Selalu bisa | ⚠️ Terbatas (hanya View sederhana) |
| Performa | ✅ Lebih cepat (data sudah tersimpan) | ⚠️ Bergantung pada query di dalamnya |
| Kegunaan Utama | Menyimpan data utama | Menyederhanakan query kompleks |
| Abstraksi Keamanan | ❌ Semua kolom terekspos | ✅ Bisa sembunyikan kolom sensitif |
| Pembaruan Data | Manual (INSERT/UPDATE) | ✅ Otomatis (mencerminkan data terbaru) |
Gunakan View sebagai "lapisan keamanan" di aplikasimu. Misalnya, buat View yang hanya menampilkan kolom nama dan email pelanggan (tanpa nomor telepon atau alamat), lalu berikan akses SELECT ke View ini ke user aplikasi. Data sensitif tetap aman di tabel aslinya!
Di tim development nyata, View sering digunakan untuk standarisasi query. Satu orang database admin membuat View yang sudah dioptimasi, dan seluruh tim frontend/backend cukup memanggil View tersebut. Ini mencegah setiap developer menulis query JOIN yang mungkin berbeda-beda dan berpotensi salah. Satu sumber kebenaran, banyak pengguna!
🎓 Kesimpulan
- CREATE VIEW MySQL memungkinkan kamu menyimpan query SELECT sebagai virtual tabel yang bisa dipanggil berulang kali.
- View tidak menyimpan data — ia selalu mencerminkan data terkini dari tabel sumber.
- Gunakan CREATE OR REPLACE VIEW untuk memperbarui View tanpa menghapusnya terlebih dahulu.
- View bisa menggabungkan JOIN, agregasi, filter — query apapun yang valid bisa dijadikan View.
- View berguna untuk menyederhanakan query kompleks, keamanan data, dan standarisasi di dalam tim.
- Hapus View yang tidak diperlukan dengan DROP VIEW IF EXISTS.
View bukan fitur mewah yang hanya dipakai developer senior. Justru ini adalah salah satu alat paling praktis yang akan membuat hidupmu sebagai developer jauh lebih mudah setiap hari. Mulai sekarang, setiap kali kamu nulis query yang sama lebih dari dua kali — jadikan View!
Artikel 24/28: UNION dan UNION ALL
Menggabungkan hasil dua SELECT menjadi satu — perbedaan UNION (hapus duplikat) vs UNION ALL (tampilkan semua).
Artikel 26/28: CREATE INDEX — Mempercepat Query MySQL
Membuat indeks untuk mempercepat pencarian di tabel besar — kritis untuk performa aplikasi nyata.
No comments:
Post a Comment