Giới thiệu
Một dạng xem trong SQL Server là một cấu trúc giống như bảng ảo dựa trên tập hợp kết quả của một câu lệnh SQL. Nhìn bề ngoài, một khung nhìn tương tự như một bảng với cấu trúc đặc trưng của các hàng và cột. Tuy nhiên, các hàng và cột này đến từ các bảng được tham chiếu trong truy vấn, định nghĩa Chế độ xem.
Chúng tôi sử dụng Chế độ xem để tập trung vào các cột cụ thể cho các mục đích mà chúng được tạo ra. Lượt xem cũng có thể phục vụ vì lý do bảo mật. Họ lọc ra các cột trong bảng bên dưới mà người dùng không muốn hiển thị. Chế độ xem lọc các cột giống như mệnh đề WHERE lọc các hàng.
Một lý do khác cho Chế độ xem là sự đơn giản. Chúng tổng hợp các cột từ một số bảng khác nhau và tạo ra một giao diện chung giống như một bảng duy nhất.
Loại chế độ xem
Các dạng xem cơ bản do người dùng xác định rất dễ tạo. Quá trình này tương tự như viết các truy vấn tham chiếu đến một hoặc nhiều bảng.
- Chế độ xem được lập chỉ mục là những chế độ xem đã được vật chất hóa hoặc lưu trữ như một bảng. Chế độ xem được lập chỉ mục có thể cải thiện hiệu suất của các truy vấn tổng hợp nhiều hàng. Tuy nhiên, chúng sẽ không phù hợp nếu các bảng bên dưới được cập nhật thường xuyên.
- Chế độ xem được phân vùng kết hợp dữ liệu được phân vùng theo chiều ngang từ các bảng cục bộ (trong cùng một phiên bản) hoặc trên nhiều bảng bằng cách sử dụng Máy chủ được liên kết.
- Chế độ xem Hệ thống là cấu trúc phổ biến mà SQL Server sử dụng để hiển thị siêu dữ liệu danh mục. Chế độ xem hệ thống là hầu hết các cấu trúc, một truy vấn để khắc phục sự cố hiệu suất hoặc điều tra một phiên bản SQL Server.
Tạo chế độ xem từ một bảng
Hãy xem ví dụ trong Liệt kê 1. Câu lệnh đầu tiên trả về TẤT CẢ các bản ghi trong bảng Purchasing.PurchaseOrders (1a), trong khi truy vấn thứ hai chỉ trả về một vài cột (1b).
Sử dụng truy vấn thứ hai, chúng ta có thể tạo Dạng xem trả về cùng một tập hợp kết quả là (1b). Khi chúng tôi làm điều này, chúng tôi có thể truy vấn một Chế độ xem để có được đầu ra mong muốn. Do đó, chúng tôi đơn giản hóa truy vấn cho người dùng cuối.
-- 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 ;
Tạo chế độ xem từ hai bảng
Sử dụng JOIN, chúng ta có thể lấy dữ liệu từ hai hoặc nhiều bảng có mối quan hệ. Sử dụng Chế độ xem, chúng tôi có thể đơn giản hóa việc truy cập dữ liệu đó.
Liệt kê 2 (2a) cho thấy sự THAM GIA giữa Purchasing.PurchaseOrders và Purchasing.PurchaseOrderLines. Chúng tôi có thể tạo một Chế độ xem từ JOIN này và nó sẽ cho phép chúng tôi truy xuất cùng một dữ liệu bằng cách sử dụng một truy vấn, như được hiển thị trong (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;
Tạo chế độ xem trên toàn bộ cơ sở dữ liệu
Sử dụng cách đặt tên nhiều phần, chúng ta có thể tham chiếu các bảng trong một cơ sở dữ liệu khác. Do đó, chúng ta có thể thực hiện các phép JOIN trên các cơ sở dữ liệu và tạo các Dạng xem mở rộng cơ sở dữ liệu. Điều này rất hữu ích cho một số ứng dụng nhất định truyền dữ liệu của chúng trên các cơ sở dữ liệu trong cùng một phiên bản SQL Server.
Liệt kê 3 cho thấy một trường hợp tương tự như Liệt kê 2, nhưng có sự khác biệt:chúng tôi thêm một bảng thứ ba vào truy vấn JOIN từ một cơ sở dữ liệu khác. Lưu ý rằng chúng ta phải sử dụng LEFT OUTER JOIN vì không tồn tại mối quan hệ thực sự nào giữa các bảng trong cả hai cơ sở dữ liệu. Ở đây, chúng tôi chỉ sử dụng nó để minh họa việc tạo một CHẾ ĐỘ XEM bao gồm các cơ sở dữ liệu khác nhau.
Chúng tôi đã giới thiệu một bí danh trong câu lệnh TẠO CHẾ ĐỘ XEM, vì chúng tôi có các cột từ hai bảng khác nhau có cùng tên. Chúng ta phải phân biệt các cột đó trong những trường hợp như vậy.
-- 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;
Hãy xem Hình 1. Nó cho thấy kết quả của việc thực hiện Liệt kê 3 (3c). Lưu ý rằng ba cột cuối cùng trống, là TSQLV4.Sales.Orders bảng không có bất kỳ hàng nào phù hợp với điều kiện JOIN.
Tạo chế độ xem trên các phiên bản
Chúng ta có thể mở rộng câu lệnh cuối cùng bằng cách giới thiệu một bảng hoàn toàn nằm trong một phiên bản khác.
Để đạt được điều này, trước tiên chúng ta phải tạo một Máy chủ được Liên kết. Chúng tôi làm điều đó với mã tương tự như được hiển thị trong Liệt kê 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
Lưu ý cách chúng tôi giải quyết bảng bên ngoài bằng cách sử dụng tên gồm bốn phần:
-- 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;
Bao gồm các Hàm trong Chế độ xem
Vì Chế độ xem về cơ bản là các truy vấn, chúng tôi có thể áp dụng cho chúng hầu như bất cứ điều gì chúng tôi làm với các truy vấn thông thường. Chúng ta có thể bao gồm các hàm, mệnh đề WHERE, biểu thức CASE, bí danh, v.v.
Tuy nhiên, điều khoản ORDER BY không được phép, ngoại trừ việc bạn sử dụng “hack TOP 100”. Danh sách 6 đến 9 minh họa cách sử dụng các mệnh đề đó trong Chế độ xem.
-- 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
Lượt xem được lập chỉ mục
Chúng tôi đã đề cập đến Chế độ xem được lập chỉ mục trước đó trong bài viết. Chế độ xem được lập chỉ mục có thể cải thiện hiệu suất, ngoại trừ trường hợp các bảng bên dưới sử dụng nhiều ghi. SQL Server yêu cầu bật một số tùy chọn SET nhất định trước khi tạo Chế độ xem được lập chỉ mục hoặc thực hiện các thao tác nhất định trên chúng.
Mệnh đề WITH SCHEMABINDING nên được sử dụng khi tạo Chế độ xem để đặt chỉ mục trên đó. Mệnh đề này liên kết Chế độ xem với các đối tượng bên dưới một cách chặt chẽ. Do đó, các đối tượng như vậy không thể bị rơi.
-- 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);
Kết luận
Trong bài viết này, chúng tôi đã xem xét các quan điểm ở một số mức độ chi tiết. Chúng tôi đã trình bày ngắn gọn về các loại Chế độ xem và đưa ra một số ví dụ về các chế độ xem do người dùng xác định và cách chúng tôi sử dụng JOIN để nhận ra các chế độ xem phụ thuộc vào nhiều bảng. Chúng tôi cũng đề cập đến các chế độ xem phức tạp bao gồm các chức năng cũng như các chế độ xem được lập chỉ mục.
Tài liệu tham khảo
- Lượt xem
- Lượt xem được lập chỉ mục
- Tạo các dạng xem được lập chỉ mục trong SQL Server