Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

  1. Beranda
  2. Blog
  3. Database & SQL

Database & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan adalah kueri tersimpan yang bisa Anda gunakan seperti tabel. Pelajari cara membuatnya, mengapa tampilan menjaga laporan tetap konsisten, apa yang dilakukan dan tidak dilakukan untuk kinerja, dan jebakan yang dapat merusaknya.

8 menit baca
Tampilan SQL menjelaskan: membuat, menggunakan, dan menghindari jebakan, dengan contoh

Poin penting

  • tampilan adalah kueri tersimpan bernama yang dapat Anda pilih seperti tabel.
  • Tampilan normal tidak menyimpan data, sehingga selalu menampilkan hasil terkini.
  • Tampilan menyederhanakan kueri kompleks, menjaga logika bisnis tetap konsisten, dan dapat membatasi akses ke kolom.
  • Mereka tidak membuat kueri lebih cepat dengan sendirinya, meskipun tampilan yang terwujud bisa.

Permintaan laporan dua puluh baris yang sama telah disalin ke lima dasbor, dan setiap salinan sedikit menyimpang. Yang satu menghitung pesanan yang dibatalkan, sementara yang lain tidak. Tampilan SQL selesaikan masalah ini dengan mendefinisikan logika tersebut satu kali, dalam database, dengan nama yang jelas.

Kami menjalankan setiap contoh di bawah ini di SQLite 3.50, dan hasil yang ditampilkan berasal dari proses tersebut. Tampilan adalah SQL standar, namun detail seperti pembaruan melalui tampilan, tampilan terwujud, dan penanganan ketergantungan bervariasi antar database, dan kami menunjukkannya.

Apa itu pemandangan?

Tampilan adalah pernyataan SELECT yang disimpan dalam database dengan nama. Saat Anda mengkueri tampilan, database menjalankan kueri yang disimpan tersebut. Ini bertindak seperti tabel untuk membaca, tetapi tampilan normal tidak menyimpan salinan datanya sendiri.

Bayangkan filter yang disimpan di spreadsheet. Filter bukanlah salinan kedua dari sheet tersebut. Ini adalah cara melihat data yang sama, yang selalu mencerminkan nilai-nilai terkini.

Tabel sampel

CREATE TABLE customers (
  id INT PRIMARY KEY, name TEXT, city TEXT, email TEXT, credit_limit INT
);
CREATE TABLE orders (
  id INT PRIMARY KEY, customer_id INT, total INT, status TEXT
);

INSERT INTO customers VALUES
 (1,'Asha','Pune','asha@example.com',50000),
 (2,'Ben','Delhi','ben@example.com',20000),
 (3,'Chitra','Pune','chitra@example.com',80000);

INSERT INTO orders VALUES
 (101,1,1200,'paid'), (102,1,800,'paid'),
 (103,2,300,'pending'), (104,3,2500,'paid');

Buat tampilan

Tampilan ini merangkum pesanan setiap pelanggan. Itu menyembunyikan join, pengelompokan dan CASE ekspresi di belakang satu nama sederhana:

CREATE VIEW customer_sales AS
SELECT c.id, c.name, c.city,
       COUNT(o.id) AS orders,
       COALESCE(SUM(CASE WHEN o.status = 'paid' THEN o.total END), 0) AS paid_total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name, c.city;

Sekarang siapa pun dapat menggunakannya, tanpa mengetahui cara kerjanya:

SELECT * FROM customer_sales ORDER BY paid_total DESC;

-- 3 | Chitra | Pune  | 1 | 2500
-- 1 | Asha   | Pune  | 2 | 2000
-- 2 | Ben    | Delhi | 1 |    0

SELECT name, paid_total FROM customer_sales WHERE city = 'Pune';

-- Asha   | 2000
-- Chitra | 2500

Ben muncul dengan nol, karena tampilannya menggunakan LEFT JOIN dan COALESCE. Keputusan seperti ini, yang diambil setelah dilihat, akan menjaga konsistensi laporan. Untuk menyegarkan pemahaman Anda tentang penanganan NULL, lihat Nilai SQL NULL.

Tampilan selalu terkini

Karena tampilan normal menjalankan kuerinya setiap saat, data baru segera muncul. Kami menambahkan pesanan berbayar untuk Ben dan menanyakan tampilannya lagi:

INSERT INTO orders VALUES (105, 2, 900, 'paid');

SELECT name, paid_total FROM customer_sales WHERE name = 'Ben';

-- Ben | 900

Tidak ada langkah penyegaran dan tidak ada salinan untuk tetap disinkronkan. Inilah perbedaan utama dari menyimpan hasil kueri ke dalam tabel terpisah.

Menyembunyikan kolom

Tampilan sering kali digunakan untuk mengekspos hanya kolom yang dibutuhkan seseorang atau aplikasi. Di sini, alamat email dan batas kredit tidak disertakan:

CREATE VIEW public_customers AS
SELECT id, name, city FROM customers;

-- columns: id, name, city

Dalam database yang memiliki izin, seperti PostgreSQL, SQL Server, dan MySQL, Anda dapat memberikan akses kepada pengguna pelaporan ke tampilan, namun tidak ke tabel yang mendasarinya. SQLite tidak memiliki akun pengguna, jadi kami hanya dapat menampilkan batasan kolom itu sendiri. Perlakukan tampilan sebagai satu lapisan perlindungan. Data sensitif masih memerlukan kontrol akses yang tepat, dan beberapa database menawarkan keamanan tingkat baris untuk memfilter baris berdasarkan pengguna.

Performa: tampilan bukanlah peningkatan kecepatan

Mitos yang umum adalah bahwa tampilan membuat kueri menjadi lebih cepat. Tampilan normal digantikan oleh definisinya saat Anda menanyakannya, sehingga database melakukan pekerjaan yang sama seolah-olah Anda sendiri yang menulis kueri lengkapnya. Rencana eksekusi kami menunjukkan penggabungan dan pengelompokan tampilan dijalankan sebagai bagian dari kueri:

EXPLAIN QUERY PLAN SELECT * FROM customer_sales WHERE city = 'Pune';

-- CO-ROUTINE customer_sales
-- SCAN c ...
-- SEARCH o USING AUTOMATIC COVERING INDEX (customer_id=?) LEFT-JOIN
-- USE TEMP B-TREE FOR GROUP BY
-- SCAN customer_sales

Jadi tampilan kueri yang lambat masih merupakan kueri yang lambat. Kecepatan berasal dari indeks dan desain kueri yang baik, seperti yang dibahas dalam optimasi kueri SQL dan penjelasan indeks SQL. Perhatikan juga tampilan yang dibangun berdasarkan tampilan lain. Lapisan bersarang memudahkan untuk bergabung dengan meja besar yang sama beberapa kali tanpa menyadarinya.

Pandangan yang terwujud

Tampilan terwujud tidak menyimpan hasilnya, seperti tabel cache. Pembacaannya cepat, namun datanya hanya segar seperti penyegaran terakhir.

-- PostgreSQL
CREATE MATERIALIZED VIEW daily_sales AS
SELECT order_date, SUM(total) AS revenue FROM orders GROUP BY order_date;

REFRESH MATERIALIZED VIEW daily_sales;
Fitur Pemandangan biasa Pandangan terwujud
Menyimpan data Tidak Ya
Kesegaran Selalu terkini Pada penyegaran terakhir
Kecepatan membaca Sama seperti kueri Cepat
Biaya penyimpanan Tidak ada Ya
Bagus untuk Menyederhanakan, konsistensi Laporan dan dasbor yang berat

Dukungan bervariasi. PostgreSQL dan Oracle memiliki tampilan yang terwujud, dan SQL Server menawarkan tampilan yang diindeks dengan aturannya sendiri. SQLite dan MySQL tidak memilikinya, sehingga orang menggunakan tabel ringkasan reguler yang disegarkan sesuai jadwal. Kami tidak menjalankan contoh PostgreSQL untuk artikel ini.

Kiat: Sebelum membuat tampilan terwujud, putuskan seberapa lama data tersebut diperbolehkan. “Disegarkan setiap jam” harus dapat diterima oleh orang-orang yang membaca laporan tersebut, jadi beri tahu mereka.

Bisakah Anda memperbarui tampilan?

Itu tergantung pada database dan tampilan. Tampilan sederhana pada satu tabel, tanpa pengelompokan atau DISTINCT, sering kali dapat diperbarui di PostgreSQL, MySQL, dan SQL Server, dan perubahan tersebut diteruskan ke tabel. Tampilan dengan gabungan atau agregat umumnya tidak bisa, karena database tidak bisa menentukan baris mana yang harus diubah.

SQLite tidak mengizinkan penulisan langsung ke tampilan sama sekali. Upaya kami gagal:

INSERT INTO customer_sales (name) VALUES ('X');

-- cannot modify customer_sales because it is a view

Beberapa database mendukung pemicu INSTEAD OF untuk membuat tampilan dapat ditulisi, dan banyak database menawarkan WITH CHECK OPTION, yang menghentikan penulisan yang tidak akan terlihat melalui tampilan. Dalam praktiknya, sebagian besar tim menyimpan tampilan hanya-baca dan menulis ke tabel.

Ketergantungan dan kerusakan

Tampilan bergantung pada tabel tempat pembacaannya. Kita membuat tampilan pada tabel, lalu membuang tabel tersebut:

CREATE TABLE ghost AS SELECT 1 AS x;
CREATE VIEW v_ghost AS SELECT x FROM ghost;
DROP TABLE ghost;

SELECT * FROM v_ghost;
-- no such table: main.ghost

SQLite mengizinkan penurunan dan hanya gagal nanti, saat tampilan digunakan. Basis data lain, seperti PostgreSQL, menolak untuk menghapus tabel yang bergantung pada tampilan, kecuali Anda menambahkan CASCADE, yang juga akan menghapus tampilan tersebut. Apa pun pilihannya, mengganti nama atau menghapus kolom dapat merusak tampilan, jadi periksalah di pengujian regresi Anda setelah perubahan skema.

Ada juga jebakan halus dengan SELECT * dalam tampilan. Kami membuat CREATE VIEW star AS SELECT * FROM customers, lalu menambahkan kolom ke tabel. Di SQLite, tampilan mengambil kolom baru. Database lain, termasuk PostgreSQL, memperluas daftar kolom saat tampilan dibuat, sehingga kolom baru tidak muncul. Jadi cantumkan kolomnya secara eksplisit. Ini mendokumentasikan tampilan, dan berperilaku sama di mana pun.

Mengelola tampilan

Tugas Sintaks umum
Buat BUAT LIHAT nama SEBAGAI PILIH ...
Ganti CREATE OR REPLACE VIEW (PostgreSQL, MySQL, Oracle)
Ganti di SQL Server BUAT ATAU UBAH TAMPILAN
Hapus JATUHKAN nama LIHAT
Hapus dengan aman DROP LIHAT JIKA ADA nama

Menghapus tampilan hanya akan menghapus kueri yang disimpan. Dalam pengujian kami, tabel customers masih memiliki ketiga baris setelah dihilangkan public_customers. Pertahankan definisi tampilan dalam kontrol versi bersama dengan migrasi Anda, sehingga perubahan ditinjau seperti kode lainnya.

Lihat vs CTE vs tabel

Pilihan Seumur hidup Menyimpan data Terbaik untuk
Lihat Hingga terjatuh Tidak Logika bersama yang digunakan oleh banyak kueri
CTE Satu pernyataan Tidak Mengatur satu kueri kompleks
Pandangan terwujud Hingga terjatuh Ya Pembacaan cepat dari hasil yang mahal
Tabel Hingga terjatuh Ya Data sebenarnya

Kesalahan umum

  • Mengharapkan peningkatan kecepatan. Tampilan normal menjalankan kuerinya setiap saat.
  • Menggunakan SELECT * dalam tampilan. Perilaku berbeda antar database saat tabel berubah.
  • Sarang yang dalam. Tampilan yang dibuat berdasarkan tampilan menyembunyikan gabungan yang mahal.
  • Menggunakan ORDER BY di dalam tampilan. Pesanan tidak dijamin saat Anda menanyakannya, jadi urutkan di kueri luar.
  • Nama yang tidak jelas. Awalan seperti v_, atau kata benda yang jelas seperti customer_sales, membantu.
  • Melupakan tampilan selama migrasi. Uji tampilan tersebut setelah setiap perubahan skema.

Penutup

Tampilan adalah cara sederhana untuk memberikan logika penting ke dalam database. Gunakan ini untuk menjaga konsistensi laporan dan menyembunyikan kolom yang tidak diperlukan, bukan sebagai trik kinerja. Untuk memulai, temukan kueri yang muncul di beberapa tempat dalam kode Anda, ubah menjadi tampilan dengan kolom eksplisit, dan arahkan setiap pemanggil ke kueri tersebut.

Pertanyaan yang sering diajukan

Apa itu tampilan di SQL?

Tampilan adalah kueri SELECT yang disimpan dengan nama. Anda menanyakannya seperti tabel, dan database menjalankan kueri yang mendasarinya setiap saat, sehingga hasilnya selalu terkini.

Apakah tampilan SQL menyimpan data?

Tampilan normal tidak menyimpan data, hanya kueri. Tampilan yang terwujud memang menyimpan hasil, dan harus disegarkan agar tetap up to date.

Apakah tampilan lebih cepat daripada tabel?

Tidak. Tampilan normal melakukan pekerjaan yang sama seperti kueri dasarnya. Tampilan yang terwujud dapat mempercepat pembacaan, dengan mengorbankan penyimpanan dan kesegaran.

Bisakah Anda menyisipkan ke dalam tampilan?

Kadang-kadang. Tampilan tabel tunggal yang sederhana sering kali dapat diperbarui di PostgreSQL, MySQL, dan SQL Server. Tampilan dengan gabungan atau pengelompokan biasanya tidak, dan SQLite tidak mengizinkannya.

Apa yang terjadi pada tampilan jika tabel dihilangkan?

Itu tergantung pada database. Beberapa menolak untuk menghapus tabel ketika tampilan bergantung padanya, sementara yang lain mengizinkannya dan tampilan gagal ketika ditanya.

Teruslah belajar

Bekerja dengan Stack Quora

Butuh bantuan dengan pengujian, WordPress atau SEO?

Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.

Teruslah membaca

Panduan lebih lanjut tentang pengujian, AI & pengembangan modern

Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.

Kecerdasan buatan

Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya

Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…

Baca artikel →
DevOps

Penjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar

Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan

Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…

Baca artikel →
Otomatisasi pengujian

Mengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong

Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…

Baca artikel →
Pengujian perangkat lunak

Penjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya

Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…

Baca artikel →
Basis data & SQL

DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…

Baca artikel →
Basis data & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…

Baca artikel →
Pengembangan perangkat lunak

Antarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler

Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas

Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…

Baca artikel →
Pengembangan perangkat lunak

Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan

Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…

Baca artikel →
Kecerdasan buatan

Apa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan

Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…

Baca artikel →
DevOps

Pemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak

Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…

Baca artikel →
DevOps

Volume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar

Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…

Baca artikel →
Otomatisasi pengujian

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…

Baca artikel →
Pengembangan perangkat lunak

Git merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing

Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.

Baca artikel →
Pengembangan perangkat lunak

List Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari

List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.

Baca artikel →
Basis data & SQL

Penjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)

Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.

Baca artikel →