View là một bảng ảo mà dữ liệu chứa trong nó được mô tả bởi một câu truy vấn.
Ví dụ về tạo 1 View đơn giản:
--Tạo một bảng gốc BaseTable và dữ liệu trong nó
CREATE TABLE BaseTable
(
CustomerID VARCHAR(20),
CustomerName VARCHAR(200),
CustomerEmail VARCHAR(200),
CustomerDOB DATETIME
);
INSERT INTO BaseTable(CustomerID, CustomerName, CustomerDOB)
SELECT 'MS001','Wayne Rooney','2005/05/05'
UNION ALL
SELECT 'MS002','Rio Ferdinand','2006/06/06'
UNION ALL
SELECT 'MS003','Ashley Young','2007/07/07'
UNION ALL
SELECT 'MS004','Nemanja Vidic','2008/08/08'
UNION ALL
SELECT 'MS005','De Gea','2009/09/09';
--Tạo một View có tên ViewBaseTable:
CREATE VIEW ViewBaseTable
AS
SELECT CustomerID, CustomerName, CustomerDOB
FROM BaseTable
ViewBaseTable đã được tạo ra, dữ liệu trong View này chính là kết quả trả về của câu truy vấn
SELECT CustomerID, CustomerName, CustomerDOB
FROM BaseTable
Về logic, ta có thể coi View như 1 bảng bình thường, tức là có thể truy vấn, thay đổi dữ liệu, tạo index trên các cột của View, v.v…
Về mặt vật lý, View KHÔNG chứa dữ liệu. Đúng như tên gọi của nó, View chỉ là một khung nhìn, cấu trúc của View trong CSDL chỉ là một câu lệnh SELECT tham chiếu đến các bảng khác.
Nhiều bạn cho rằng, sử dụng View thì truy vấn sẽ nhanh hơn. Thực chất không phải như vậy. Với ví dụ View ở trên:
SELECT *
FROM ViewBaseTable
thì SQL Server xử lý nó cũng như
SELECT *
FROM (
SELECT CustomerID,
CustomerName,
CustomerDOB
FROM BaseTable
) DT
Điều này giải thích rất đơn giản. Vì View không chưa dữ liệu, nên khi làm việc với View, bắt buộc hệ thống phải thực hiện lại truy vấn tạo View.
Khi nào thì dùng View
- Khi bạn muốn user chỉ có thể truy cập giới hạn một số lượng cột ( trong câu lệnh SELECT ), hoặc số lượng dòng (thêm WHERE để lọc điều kiện ) nhất định.
- Khi một câu truy vấn phức tạp trong tương lai có thể phải sử dụng lại nhiều lần. Tạo View để lưu câu truy vấn. Trường hợp hay xảy ra nhất là các câu truy vấn tính toán, tổng hợp dữ liệu.
- Không muốn user biết được tên bảng, cấu trúc thật sự của bảng.
Trong các hệ thống lớn, nhiều lúc chúng ta tưởng rằng mình đang SELECT trên một bảng X. Nhưng có thể, X chỉ là synonyms của View Y, mà Y lại tham chiếu lên nhiều bảng Z1, Z2, Z3, … khác nhau.
Các loại View
Trong thực tế các loại View mà ta gặp thường có dạng sau
- Là 1 tập các cột trong 1 bảng (SELECT không đủ cột)
- Là 1 tập các dòng trong 1 bảng (SELECT có mệnh đề WHERE)
- Là 1 tập các dòng, các cột trong 1 bảng (Kết hợp của hai trường hợp trên)
- Là 1 tập kết quả của các phép JOIN
- Là 1 truy vấn tổng hợp, sử dụng các hàm trên một tập giá trị như SUM, COUNT, MIN, MAX, v.v…
- Là tổng hợp của các trường hợp trên.
Ngoài cách phân loại trên, còn hai kiểu View đặc biệt mà ít người để ý đến. Đó là Updatable View và Partition View
Updatable View:
Như đã nói ở trên, View cũng có thể coi như là 1 bảng. Vì vậy có thể thực hiện các thao tác DML ( Insert, Update, Delete ) trên View. Và khi thay đổi dữ liệu trong View thì những bảng liên quan đến View dữ liệu cũng sẽ thay đổi theo.
Với ví dụ đã nói ở đầu bài.
DELETE FROM ViewBaseTable
Sau khi thực hiện câu lệnh này thì toàn bộ các rows trong BaseTable cũng bị xóa. Vì thế khi làm việc với View, các bạn nên để ý xem View của mình có phải Updatable View hay không. Nếu có thì nên GRANT quyền cho User chỉ được phép SELECT trên View để tránh trường hợp đáng tiếc.
View không phải là Updatable trong một số tình huống sau:
- Trong View sử dụng các hàm như SUM, COUNT, MIN, MAX, v.v…
- Sử dụng các mệnh đề UNION, UNION ALL, CROSSJOIN, INTERSECT, EXCEPT, v.v….
Chi tiết các bạn có thể tham khảo thêm trong MSDN
Partition View:
Nếu View có dạng sau thì được gọi là Partition View
SELECT <select_list1>
FROM T1
UNION ALL
SELECT <select_list2>
FROM T2
UNION ALL
...
SELECT <select_listn>
FROM Tn
Trong đó T1, T2,…Tn là các bảng có thể ở nhiều Server khác nhau.