Pengantar
Tampilan di SQL Server adalah struktur seperti tabel virtual berdasarkan kumpulan hasil dari pernyataan SQL. Di permukaan, tampilan mirip dengan tabel dengan struktur khas baris dan kolom. Namun, baris dan kolom ini berasal dari tabel yang dirujuk dalam kueri, yang mendefinisikan Tampilan.
Kami menggunakan Tampilan untuk fokus pada kolom konkret untuk tujuan pembuatannya. Tampilan juga dapat berfungsi untuk alasan keamanan. Mereka memfilter kolom di tabel yang mendasarinya yang tidak ingin dilihat oleh pengguna tertentu. Menampilkan kolom filter seperti klausa WHERE memfilter baris.
Alasan lain untuk Tampilan adalah kesederhanaan. Mereka menggabungkan kolom dari beberapa tabel berbeda dan membuat tampilan umum yang terlihat seperti satu tabel.
Jenis Tampilan
Tampilan dasar yang ditentukan pengguna mudah dibuat. Prosesnya mirip dengan menulis kueri yang mereferensikan satu atau lebih tabel.
- Tampilan yang Diindeks adalah yang telah terwujud atau disimpan seperti tabel. Tampilan Terindeks dapat meningkatkan kinerja kueri yang menggabungkan banyak baris. Namun, mereka tidak cocok jika tabel yang mendasarinya sering diperbarui.
- Tampilan yang Dipartisi menggabungkan data yang dipartisi secara horizontal dari tabel secara lokal (dalam instance yang sama) atau di banyak tempat, menggunakan Server Tertaut.
- Tampilan Sistem adalah struktur umum yang digunakan SQL Server untuk mengekspos metadata katalog. Tampilan Sistem adalah sebagian besar dari struktur yang satu kueri untuk kinerja pemecahan masalah atau menyelidiki contoh SQL Server.
Membuat Tampilan dari Satu Tabel
Lihat contoh di Listing 1. Pernyataan pertama mengembalikan SEMUA record dalam tabel Purchase.PurchaseOrders (1a), sedangkan kueri kedua hanya mengembalikan beberapa kolom (1b).
Menggunakan kueri kedua, kita dapat membuat Tampilan yang mengembalikan set hasil yang sama seperti (1b). Ketika kami melakukan ini, kami dapat meminta Tampilan untuk mendapatkan output yang diinginkan. Jadi, kami menyederhanakan kueri untuk pengguna akhir.
-- Listing 1: Creating a Basic User-Defined View
-- 1a
SELECT * FROM
Purchasing.PurchaseOrders;
-- 1b
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1c
CREATE VIEW Purchasing.QuickOrders
AS
SELECT
PurchaseOrderID
, SupplierID
, OrderDate
, ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders;
-- 1d
SELECT * FROM Purchasing.QuickOrders ;
Membuat Tampilan dari Dua Tabel
Dengan menggunakan JOIN, kita dapat mengambil data dari dua atau lebih tabel yang memiliki hubungan. Dengan menggunakan Tampilan, kami dapat menyederhanakan pengaksesan data tersebut.
Daftar 2 (2a) menunjukkan GABUNG antara Purchasing.PurchaseOrders dan Purchasing.PurchaseOrderLines. Kita dapat membuat View dari JOIN ini, dan ini akan memungkinkan kita untuk mengambil data yang sama menggunakan kueri, seperti yang ditunjukkan pada (2c).
-- Listing 2: Creating a View from Two Tables
-- 2a
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2b
CREATE VIEW Purchasing.DetailedOrders
AS
SELECT
po.PurchaseOrderID
, po.SupplierID
, po.OrderDate
, po.ExpectedDeliveryDate
, pol.Description
, pol.ExpectedUnitPricePerOuter
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID;
-- 2c
SELECT * FROM Purchasing.DetailedOrders;
Membuat Tampilan di Seluruh Basis Data
Menggunakan penamaan multi-bagian, kita dapat mereferensikan tabel dalam database yang berbeda. Oleh karena itu, kita dapat melakukan JOIN di seluruh database dan membuat Tampilan yang menjangkau database. Sangat membantu untuk aplikasi tertentu yang menyebarkan datanya ke seluruh database dalam contoh SQL Server yang sama.
Listing 3 menunjukkan kasus yang sama seperti Listing 2, tetapi dengan perbedaan:kita menambahkan tabel ketiga ke query JOIN dari database yang berbeda. Perhatikan bahwa kita harus menggunakan LEFT OUTER JOIN karena tidak ada hubungan nyata antara tabel di kedua database. Di sini, kami menggunakannya hanya untuk mengilustrasikan pembuatan VIEW yang mencakup database yang berbeda.
Kami telah memperkenalkan alias dalam pernyataan CREATE VIEW, karena kami memiliki kolom dari dua tabel berbeda dengan nama yang sama. Kita harus membedakan kolom tersebut dalam kasus seperti itu.
-- Listing 3: Creating a View Across Databases
-- 3a
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3b
CREATE VIEW Purchasing.DetailedOrdersDistributed
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,so.orderid
,so.custid
,so.orderdate AS OrdersOrderDate
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
LEFT OUTER JOIN TSQLV4.Sales.Orders so
ON po.PurchaseOrderID=so.orderid;
-- 3c
SELECT * FROM Purchasing.DetailedOrdersDistributed;
Lihat Gambar 1. Ini menunjukkan hasil eksekusi Listing 3(3c). Perhatikan bahwa tiga kolom terakhir kosong, karena TSQLV4.Sales.Orders tabel tidak memiliki baris yang cocok dengan kondisi GABUNG.
Membuat Tampilan di Seluruh Instance
Kita dapat memperluas pernyataan terakhir dengan memperkenalkan tabel yang hidup di instance lain sepenuhnya.
Untuk mencapai ini, pertama-tama kita harus membuat Server Tertaut. Kami melakukannya dengan kode yang mirip dengan yang ditunjukkan pada Listing 4.
-- Listing 4: Linked Server
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'IGIRI01\SQLEXPRESS', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'IGIRI01\SQLEXPRESS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
Perhatikan bagaimana kita menangani tabel eksternal menggunakan nama empat bagian:
-- Listing 5: Creating a View Across Instances
-- 5a
CREATE VIEW Purchasing.DetailedOrdersExternal
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
,pol.Description
,pol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,ipol.LastEditedWhen
FROM Purchasing.PurchaseOrders po
INNER JOIN Purchasing.PurchaseOrderLines pol
ON po.PurchaseOrderID=pol.PurchaseOrderID
INNER JOIN [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
ON po.PurchaseOrderID=ipol.PurchaseOrderID;
-- 5b
SELECT * FROM Purchasing.DetailedOrdersExternal;
Menyertakan Fungsi dalam Tampilan
Karena Tampilan pada dasarnya adalah kueri, kami dapat menerapkannya pada hampir semua hal yang kami lakukan dengan kueri biasa. Kami dapat menyertakan fungsi, klausa WHERE, ekspresi CASE, alias, dll.
Namun, klausa ORDER BY tidak diperbolehkan, kecuali Anda menggunakan "TOP 100 hack". Daftar 6 hingga 9 mengilustrasikan penggunaan klausa tersebut di Views.
-- Listing 6: Creating a View with a Function
CREATE VIEW Purchasing.DetailedOrdersComplex
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 7: Creating a View with a WHERE Clause
CREATE VIEW Purchasing.DetailedOrdersComplexFilt
AS
SELECT
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
WHERE ipol.PurchaseOrderID<10;
-- Listing 8: Creating a View a TOP Clause
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
ipol.PurchaseOrderID
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 9: Creating a View with a CASE Expression
CREATE VIEW Purchasing.DetailedOrdersComplexTop
AS
SELECT TOP 10
CASE
ipol.PurchaseOrderID
WHEN 1 THEN 'First Order'
WHEN 2 THEN 'Second Order'
END PurchaseOrder
,ipol.Description
,ipol.ExpectedUnitPricePerOuter
,ipol.StockItemID
,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
Tampilan Terindeks
Kami merujuk ke Tampilan Terindeks di awal artikel. Tampilan Terindeks dapat meningkatkan kinerja, kecuali untuk kasus di mana tabel yang mendasarinya intensif menulis. SQL Server memerlukan opsi SET tertentu yang diaktifkan sebelum membuat Tampilan Terindeks atau melakukan operasi tertentu pada mereka.
Klausa WITH SCHEMABINDING harus digunakan saat membuat Tampilan untuk meletakkan indeks di atasnya. Klausa ini mengaitkan View dengan objek yang mendasarinya secara ketat. Dengan demikian, benda tersebut tidak dapat dijatuhkan.
-- Listing 10: Creating an Indexed View
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON;
CREATE VIEW Purchasing.DetailedOrdersIndexed
WITH SCHEMABINDING
AS
SELECT
po.PurchaseOrderID
,po.SupplierID
,po.OrderDate
,po.ExpectedDeliveryDate
FROM Purchasing.PurchaseOrders po;
CREATE UNIQUE CLUSTERED INDEX IX_ID
ON Purchasing.DetailedOrdersIndexed (PurchaseOrderID);
Kesimpulan
Dalam artikel ini, kami telah memeriksa pandangan pada beberapa tingkat detail. Kami membahas secara singkat jenis Tampilan dan memberikan beberapa contoh tampilan yang ditentukan pengguna dan bagaimana kami menggunakan GABUNG untuk mewujudkan tampilan yang bergantung pada banyak tabel. Kami juga membahas tampilan kompleks yang menyertakan fungsi serta tampilan yang diindeks.
Referensi
- Tampilan
- Tampilan Terindeks
- Buat Tampilan Terindeks di SQL Server