Definisikan emp_dept (employee yang di-JOIN dengan department), emp_tier (band gaji), dan emp_sales (total per karyawan) dengan CREATE VIEW, lalu lihat tiga kasus penggunaan — reuse, otorisasi, abstraksi — dan perhatikan view dievaluasi ulang segera ketika tabel dasarnya berubah.
Data yang dipakai di artikel ini — employee / department / sales
Sebuah view (VIEW) adalah pernyataan SELECT yang diberi nama dan disimpan yang bisa kamu rujuk seperti sebuah tabel.
Berbeda dengan tabel, view tidak menyimpan datanya sendiri — setiap kali kamu merujuknya, SELECT yang tersimpan dijalankan lagi.
Sebelum menyelam ke latihan, lihat definisi kolom dan sampel data untuk tiga tabel yang dipakai di artikel ini — employee / department / sales.
① Jalankan PRAGMA table_info(employee); / PRAGMA table_info(department); / PRAGMA table_info(sales); untuk memeriksa definisi kolom ketiga tabel.
② Jalankan SELECT * FROM employee LIMIT 5; / SELECT * FROM department LIMIT 5; / SELECT * FROM sales LIMIT 5; untuk mengintip lima baris pertama dari setiap tabel.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
CREATE VIEW — Beri nama kueri yang kompleks
Definisikan view dengan CREATE VIEW nama_view AS SELECT ...;.
Setelah didefinisikan, menulis SELECT * FROM nama_view menjalankan SELECT yang tersimpan dan mengembalikan hasilnya.
Karena view adalah kueri yang tersimpan tanpa data sendiri, setiap update pada tabel dasar muncul di kali berikutnya kamu merujuk view itu.
Ketika kamu tidak lagi membutuhkannya, buang dengan DROP VIEW nama_view;.
Kalau kamu ingin membuat ulang view dengan nama yang sama, jalankan DROP VIEW IF EXISTS nama_view; sebelum CREATE VIEW supaya skripnya tetap bisa dijalankan ulang.
View adalah SELECT yang tersimpan — tanpa barisnya sendiriTabel menyimpan data baris, tapi view hanya menyimpan pernyataan SELECT. Setiap rujukan ke view menjalankan SELECT tersimpan itu terhadap tabel dasarnya.
-- Beri nama kueri headcount per departemen sebagai viewDROPVIEWIFEXISTS dept_headcount;CREATEVIEWdept_headcountASSELECTd.dept_name, COUNT(e.emp_id) AS headcountFROM department dLEFT JOIN employee e ONe.dept_id=d.dept_idGROUP BYd.dept_name;-- Setelah definisi, rujuk seperti tabelSELECT dept_name, headcount FROM dept_headcountORDER BY headcount DESC;-- Buang ketika selesaiDROPVIEW dept_headcount;
Bayangkan kebutuhannya: "Saya ingin melihat daftar employee dengan nama department dan lokasi di samping setiap baris, tanpa menulis JOIN setiap kali." Di dalam satu eksekusi, bawa view dari definisi lewat rujukan ke penghapusan sebagai skrip mandiri. (Ketika berjalan dengan benar, penjelasan akan muncul.)
① Definisikan view bernama emp_dept yang LEFT JOIN employee dan department pada dept_id dan mengembalikan emp_id, name, salary, dept_name, dan location. Taruh pernyataan yang membuang view dengan nama yang sama sebelum definisi, supaya skripnya tidak pernah gagal saat dijalankan ulang.
② Tarik name, dept_name, dan salary dari view dan tampilkan 5 baris teratas yang diurutkan berdasarkan salary menurun.
③ Terakhir, buang view-nya supaya definisinya tidak menggantung di halaman.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
Tiga kasus penggunaan — reuse, otorisasi, abstraksi
Ada tiga alasan utama untuk memakai view.
Reuse: bungkus JOIN atau agregasi yang sering dipakai di bawah satu nama supaya kamu tidak harus menulis ulang kueri yang sama berulang-ulang.
Otorisasi: buat view yang hanya mengekspos subset kolom atau baris, dan berikan akses ke view alih-alih tabel dasarnya (sembunyikan kolom gaji tinggi, hanya tampilkan baris dari department user sendiri, dan sebagainya).
Abstraksi: pemanggil tidak perlu tahu struktur internal view (tabel apa yang di-JOIN, bagaimana) — mengetahui nama view dan kolom yang dikembalikannya sudah cukup.
Tiga kasus penggunaan viewReuse, otorisasi, dan abstraksi adalah tiga alasan klasik untuk memakai view. Ketiganya berbagi gagasan yang sama: menyembunyikan kompleksitas atau tabel dasar dari pemanggil.
-- (1) Abstraksi: view yang melabeli employee berdasarkan cohort tahun perekrutan (pemanggil tidak melihat ekspresinya)DROPVIEWIFEXISTS emp_cohort;CREATEVIEWemp_cohortASSELECTname, hired_on,CASEWHEN hired_on <'2018-01-01'THEN'Veteran'WHEN hired_on <'2021-01-01'THEN'Mid'ELSE'Recent'ENDAS cohortFROM employee;SELECT cohort, COUNT(*) AS cntFROM emp_cohortGROUP BY cohortORDER BY cohort;DROPVIEW emp_cohort;-- (2) Otorisasi: view yang mengecualikan gaji dan hanya mengekspos kolom yang bisa dipublikasikanDROPVIEWIFEXISTS emp_public;CREATEVIEWemp_publicASSELECT emp_id, name, dept_id FROM employee;DROPVIEW emp_public;
Bayangkan kebutuhan ini: "Saya ingin membungkus logika yang mengklasifikasikan employee ke tier gaji (High / Mid / Low) di satu tempat, dan mengonfirmasi bahwa mengupdate tabel employee dasar membuat hasil agregat view terupdate otomatis." Karena view adalah SELECT yang tersimpan tanpa datanya sendiri, ia mengevaluasi ulang tabel dasar setiap kali kamu merujuknya.
① Buang view dengan nama yang sama kalau ada, lalu definisikan view emp_tier dengan kolom tier yang mengembalikan High ketika salary adalah 6.500.000 atau lebih, Mid ketika antara 5.000.000 dan 6.500.000, dan Low ketika di bawahnya.
② Agregasi headcount per tier dengan alias cnt, dan periksa hitungannya sebelum update.
③ INSERT employee baru ke employee (emp_id 999 / name 'Zoe' / dept_id 1 / manager_id NULL / city 'Tokyo' / salary 8000000 / hired_on '2024-01-01'), yang masuk ke tier High.
④ Jalankan kueri agregasi yang sama dengan ②, dan konfirmasi bahwa hitungan High naik 1 (bukti bahwa update pada tabel dasar segera muncul lewat view).
⑤ Bersihkan dengan DELETE baris dengan emp_id = 999 dan DROP view.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
View agregat memperpendek kueri pemanggil
View bisa menyimpan agregasi GROUP BY, bukan hanya JOIN.
Kalau kamu membungkus agregasi yang sering dipakai — seperti total penjualan per employee — ke dalam satu view, pemanggil bisa melewati JOIN dan GROUP BY dan cukup SELECT baris yang sudah diagregasi.
Contoh di bawah mengagregasi sales per employee, men-JOIN dengan employee untuk menempelkan nama employee, dan mendefinisikannya sebagai view.
Pemanggil cukup merujuk view untuk melihat "siapa yang menjual berapa banyak" — mereka tidak perlu memikirkan join dan agregasi internal.
View agregat memperpendek kueri pemanggilKetika kamu melipat JOIN dan GROUP BY ke dalam view, pemanggil mendapatkan hasil agregat hanya dengan menjalankan SELECT terhadap view.
-- View yang menandai total penjualan per department dengan nama departmentDROPVIEWIFEXISTS dept_sales;CREATEVIEWdept_salesASSELECTd.dept_name, SUM(s.amount) AS totalFROM sales sJOIN employee e ONs.emp_id=e.emp_idJOIN department d ONe.dept_id=d.dept_idGROUP BYd.dept_name;-- Pemanggil cukup SELECT dari view yang sudah diagregasiSELECT dept_name, total FROM dept_salesORDER BY total DESC;DROPVIEW dept_sales;
Bayangkan kebutuhannya: "Untuk dashboard performa penjualan, saya ingin menampilkan employee teratas berdasarkan total penjualan tanpa menulis JOIN dan agregasi setiap kali." Bawa view dari definisi lewat rujukan ke penghapusan sebagai skrip mandiri dalam satu eksekusi.
① JOIN employee dan sales pada emp_id, agregasi total penjualan per employee dengan alias total, dan definisikan hasilnya sebagai view bernama emp_sales. Kolom view-nya adalah emp_id, name, dan total — total tiga kolom. Taruh pernyataan drop-if-exists untuk nama view yang sama sebelum definisi.
② Tarik name dan total dari view dan tampilkan 5 baris teratas yang diurutkan berdasarkan total menurun, lalu berdasarkan name menaik sebagai pemecah seri.
③ Terakhir, buang view-nya.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
QUIZ
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 1Pernyataan mana yang dengan benar menggambarkan view (VIEW)?
Soal 2Manakah yang TIDAK tercantum di artikel sebagai kasus penggunaan view?
Soal 3Setelah mendefinisikan view emp_tier, kamu INSERT baris baru ke tabel employee dasar. Apa yang terjadi ketika kamu menjalankan SELECT * FROM emp_tier tanpa mendefinisikan ulang view-nya?