
Trong SQL, View hay còn được biết đến với cái tên khung nhìn là kết quả của một câu lệnh SQL. View cũng chứa các cột và dòng giống như một table bình thường.
Tổng quan về View
Khi làm việc với SQL, chúng ta có thể dễ dàng nhận ra. Kết quả của các câu truy vấn cũng có cấu trúc giống như 1 bảng dữ liệu. Người ta gọi các đối tượng này là ‘View’ hoặc khung nhìn.
Về mặt kỹ thuật, chúng ta có thể hình dung như sau:
- Bảng dữ liệu sẽ bao gồm: cấu trúc + dữ liệu.
- Khung nhìn bao gồm: cấu trúc
Và khi hiển thị, dựa vào cấu trúc, dữ liệu sẽ được truy vấn từ các bảng dữ liệu thực.
Những ưu điểm của View
Tất nhiên, khi người ta xây dựng và sử dụng đối tượng View, nó phải có những ưu điểm cụ thể:
Tính bảo mật
Với View, bạn có thể hạn chế quyền truy cập của các users đến một số bảng cụ thể. Tuy nhiên, cho phép họ truy cập một vài thuộc tính trong bảng đó.
Ví dụ, trong CSDL chúng ta muốn hạn chế một số users truy cập vào bảng customers. Để bảo vệ các thông tin của khách hàng. Tuy nhiên, những thông tin cơ bản như Firstname, Lastname thì cần thiết cho các users này thực hiện công việc.
Vậy với View, chúng ta có thể hạn chế users ở mức độ thuộc tính trên từng bảng dữ liệu.
Tính đơn giản
Để dễ hình dùng được sự đơn giản hóa khi sử dụng View, chúng ta hãy tưởng tượng. CSDL cần kết hợp từ 3-4 bảng để thể hiện đầy đủ thông tin của 1 đối tượng. Với các câu truy vấn cơ bản, chúng ta cũng có thể dễ dàng JOIN các bảng này lại. Nhưng những thành viên mới, hoặc những người không giỏi về SQL sẽ gặp ít nhiều khó khăn.
Tuy nhiên, nếu chúng ta nối nhiều bảng và thể hiện chúng qua một view. Thì việc truy vấn dữ liệu sẽ trở nên cực kỳ dễ dàng.
Tính nhất quán
Từ ví dụ của tính đơn giản, chúng ta tiếp tục hình dung. Nếu các bảng dữ liệu được nối với nhau theo 1 thứ tự, một quy chuẩn chung. Thì kết quả trả về của chúng ta cũng đồng bộ và nhất quán hơn.
Quản trị View
Cũng như các đối tượng khác, chúng ta cũng có thể thực hiện các thao tác: tạo mới, cập nhật, liệt kê, sử dụng, xóa …vv
Tạo mới
Với CSDL Chinook của chúng ta, đôi lúc chúng ta cần làm việc với bảng Track, nhưng với tên của Genre hay tên của MediaType trực tiếp, chứ không phải qua Id của chúng. Do đó, để tiện lợi hơn, mình sẽ tạo một View có tên Track_info.
Cú pháp cơ bản để tạo một View trong SQL Server như sau:
1 2 3 4 |
CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] [ WITH <view_attribute> [ ,...n ] ] AS select_statement [ ; ] |
Và với CSDL Chinook, chúng ta có.
1 2 3 4 5 6 |
CREATE VIEW Track_info AS SELECT Track.*, Genre.Name AS Genre, MediaType.Name AS MediaType FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId INNER JOIN MediaType ON Track.MediaTypeId = MediaType.MediaTypeId |
Liệt kê
Để liệt kê các Views đã tạo trong hệ thống, chúng ta có câu truy vấn:
1 2 3 4 5 |
SELECT OBJECT_SCHEMA_NAME(v.object_id) schema_name, v.name FROM sys.views as v; |
Sau khi thực thi câu truy vấn này, chúng ta sẽ thấy được View vừa tạo ở trên.
Truy vấn thông tin
Sau khi liệt kê, chúng ta chắc chắn rằng, view của mình đã được tạo. Tiếp đến có thể sử dụng thêm đoạn mã bên dưới để truy vấn một vài thông tin cơ bản của nó.
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound FROM sys.sql_modules WHERE object_id = object_id( 'Track_info' ); |
Và kết quả, chúng ta có được các thông tin:
Sử dụng view trong câu truy vấn
Sau khi tạo xong View, chúng ta có thể xem nó như 1 bảng dữ liệu. Đo đó, có thể viết các câu truy vấn sử dụng nó như một bảng.
1 2 3 |
-- Liệt kê tất cả dữ liệu SELECT * FROM Track_info; |
Chắc chắn, chúng ta sẽ nhận về kết quả tương tự như câu truy vấn khởi tạo View.
Hay với tác vụ phức tạp hơn, đếm số lượng bài hát trong từng thể loại. Chúng ta có:
1 2 3 |
SELECT Genre, COUNT(*) AS Track_no FROM Track_info GROUP BY Genre |
Thật đơn giản đúng không nào.
Xóa
Để xóa một view đã tồn tại, chúng ta có cú pháp:
1 2 3 4 |
DROP VIEW [IF EXISTS] schema_name.view_name1, schema_name.view_name2, ...; |
Với Track_info, chúng ta có thể xóa nó bằng câu lệnh:
1 |
DROP VIEW IF EXISTS Track_info; |