Khung nhìn VIEW trong SQL

Trong SQL, một khung nhìn VIEW là một bảng ảo trong cơ sở dữ liệu có nội dung được định nghĩa thông qua một câu lệnh SQL nào đó. Một VIEW bao gồm các hàng và cột giống như một bảng thực. Các trường trong một khung nhìn là các trường từ một hoặc nhiều bảng thực trong Database.

Điểm khác biệt giữa khung nhìn VIEW và bảng là VIEW không được xem là một cấu trúc lưu trữ dữ liệu tồn tại trong cơ sở dữ liệu. Thực chất dữ liệu quan sát được trong VIEW được lấy từ các bảng thông qua câu lệnh truy vấn dữ liệu và được sử dụng để hạn chế truy cập cơ sở dữ liệu hoặc để ẩn dữ liệu phức tạp.

Ở bài viết này, Quantrimang sẽ hướng dẫn chi tiết cho bạn cách sử dụng VIEW trong SQL với cú pháp và những ví dụ cụ thể để dễ hình dung và nắm bắt lệnh tốt hơn.

Tạo VIEW trong SQL

VIEW được tạo ra bởi câu lệnh CREATE VIEW. Các VIEW có thể được tạo từ một bảng đơn, nhiều bảng hoặc từ VIEW khác.

Cú pháp cơ bản của lệnh CREATE VIEW trong SQL như sau:

CREATE VIEW ten_view AS
SELECT cot1, cot2.....
FROM ten_bang
WHERE [dieu_kien];

Bạn có thể thêm nhiều bảng trong câu lệnh SELECT tương tự như cách sử dụng chúng trong một truy vấn SQL SELECT bình thường.

Ví dụ về VIEW trong SQL

Giả sử bảng NHANVIEN có các bản ghi như sau:

 +----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  1 | Thanh    |  32 | Haiphong  |  2000.00 |
 |  2 | Loan     |  25 | Hanoi     |  1500.00 |
 |  3 | Nga      |  23 | Hanam     |  2000.00 |
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  5 | Huy      |  27 | Hatinh    |  8500.00 |
 |  6 | Cao      |  22 | HCM       |  4500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+

Sau đây là một ví dụ để tạo một VIEW từ bảng NHANVIEN. VIEW này được sử dụng để lấy tên và tuổi từ bảng NHANVIEN.

SQL > CREATE VIEW NHANVIEN_VIEW AS
SELECT ten, tuoi
FROM NHANVIEN;

Bây giờ, bạn có thể truy vấn NHANVIEN_VIEW theo cách tương tự như bạn truy vấn bảng thực tế, ví dụ:

SQL > SELECT * FROM NHANVIEN_VIEW;

Lệnh trên trả về kết quả:

 +----------+-----+
 | ten      | tuoi|
 +----------+-----+
 | Thanh    |  32 |
 | Loan     |  25 |
 | Nga      |  23 |
 | Manh     |  25 |
 | Huy      |  27 |
 | Cao      |  22 |
 | Lam      |  24 |
 +----------+-----+
 

Tùy chọn WITH CHECK OPTION trong SQL

WITH CHECK OPTION là một tùy chọn của lệnh CREATE VIEW. Mục đích của WITH CHECK OPTION là bảo đảm rằng tất cả UPDATEINSERT thỏa mãn các điều kiện trong định nghĩa VIEW.

Nếu chúng không thỏa mãn các điều kiện, UPDATE và INSERT sẽ trả về một lỗi.

Ví dụ sau tạo ra view NHANVIEN_VIEW với tùy chọn WITH CHECK OPTION.

CREATE VIEW NHANVIEN_VIEW AS
SELECT ten, tuoi
FROM NHANVIEN
WHERE tuoi IS NOT NULL
WITH CHECK OPTION;

Trong trường hợp này, nếu bạn cố gắng UPDATE hoặc INSERT NHANVIEN_VIEW với giá trị tuoi = null thì sẽ xảy ra lỗi, còn nếu tuoi khác NULL thì UPDATE hoặc INSERT sẽ thành công.

UPDATE một VIEW trong SQL

Một VIEW có thể được cập nhật dưới các điều kiện cụ thể sau:

  • Mệnh đề SELECT không được chứa từ khoá DISTINCT.
  • Mệnh đề SELECT không được chứa các hàm tổng.
  • Mệnh đề SELECT không được chứa các hàm tập hợp.
  • Mệnh đề SELECT không được chứa các biểu thức tính toán.
  • Mệnh đề SELECT không được chứa mệnh đề ORDER BY.
  • Mệnh đề FROM không được chứa nhiều bảng.
  • Mệnh đề WHERE không được chứa các truy vấn con.
  • Truy vấn không chứa GROUP BY hoặc HAVING.
  • Các cột được ước lượng không thể được update.
  • Tất cả các cột NOT NULL từ bảng ban đầu phải được select trong VIEW để truy vấn INSERT hoạt động.

Vì vậy, nếu một VIEW thỏa mãn tất cả các quy tắc trên thì bạn có thể sử dụng câu lệnh UPDATE cho VIEW đó. Ví dụ sau cập nhật tuoi cho nhân viên có tên là Thanh.

SQL > UPDATE NHANVIEN_VIEW
SET AGE = 35
WHERE ten = 'Thanh';

Cuối cùng, bảng NHANVIEN ban đầu được update và theo đó VIEW được cập nhật. Bây giờ, thử truy vấn bảng ban đầu và lệnh SELECT sẽ cho kết quả:

 +----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  1 | Thanh    |  35 | Haiphong  |  2000.00 |
 |  2 | Loan     |  25 | Hanoi     |  1500.00 |
 |  3 | Nga      |  23 | Hanam     |  2000.00 |
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  5 | Huy      |  27 | Hatinh    |  8500.00 |
 |  6 | Cao      |  22 | HCM       |  4500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+

Chèn hàng vào VIEW trong SQL

Các hàng dữ liệu có thể được chèn vào trong một VIEW. Các quy tắc tương tự UPDATE cũng áp dụng cho lệnh INSERT.

Ở đây không thể chèn hàng vào trong NHANVIEN_VIEW bởi ta không select tất cả các cột NOT NULL từ bảng ban đầu vào trong VIEW. Chúng ta chèn các hàng vào trong một VIEW theo cách tương tự khi bạn chèn chúng vào trong một bảng.

Xóa hàng từ VIEW trong SQL

Các hàng dữ liệu có thể bị xóa khỏi một VIEW. Các quy tắc tương tự UPDATE và INSERT cũng áp dụng cho lệnh DELETE trong SQL.

Ví dụ sau sẽ xóa một hàng có TUOI = 22:

SQL > DELETE FROM NHANVIEN_VIEW
WHERE tuoi = 22;

Kết quả một hàng trong bảng NHANVIEN ban đầu sẽ bị xóa và kết quả tương tự với chính VIEW đó. Bây giờ, thử truy vấn bảng ban đầu, và lệnh SELECT sẽ cho kết quả:

 +----+----------+-----+-----------+----------+
 | ID | TEN      |TUOI | DIACHI    | LUONG    |
 +----+----------+-----+-----------+----------+
 |  1 | Thanh    |  32 | Haiphong  |  2000.00 |
 |  2 | Loan     |  25 | Hanoi     |  1500.00 |
 |  3 | Nga      |  23 | Hanam     |  2000.00 |
 |  4 | Manh     |  25 | Hue       |  6500.00 |
 |  5 | Huy      |  27 | Hatinh    |  8500.00 |
 |  7 | Lam      |  24 | Hanoi     | 10000.00 |
 +----+----------+-----+-----------+----------+

Xóa VIEW trong SQL

Bạn có thể xóa VIEW nếu nó không còn cần thiết. Cú pháp như sau:

DROP VIEW ten_view;

Ví dụ xóa view NHANVIEN_VIEW từ bảng ban đầu:

DROP VIEW NHANVIEN_VIEW;

Trong phần tiếp theo, chúng ta sẽ tìm hiểu về cách sử dụng mệnh đề HAVING trong SQL, các bạn nhớ theo dõi nhé.

Bài trước: Lệnh TRUNCATE TABLE trong SQL

Bài tiếp: Mệnh đề HAVING trong SQL

Thứ Hai, 18/03/2019 10:36
52 👨 367