Bài này sẽ hướng dẫn bạn sử dụng View trong SQL. Trong SQL, một View là một bảng thực dựa trên tập kết quả của một câu lệnh SQL, một View chứa các hàng và các cột như một bảng thực. Các trường trong View là các trường của một hoặc nhiều bảng trong database.
Để thực hành việc sử dụng View trong SQL, bạn có thể thực hành trên bất kỳ hệ quản trị cơ sở dữ liệu (CSDL) nào.
Trước tiên, chúng ta tạo ra bảng CUSTOMERS như sau:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
Tiếp theo, chèn 7 bản ghi vào bảng CUSTOMERS:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ha Anh', 32, 'Da Nang', 2000.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Van Ha', 25, 'Ha Noi', 1500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Vu Bang', 23, 'Vinh', 2000.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Thu Minh', 25, 'Ha Noi', 6500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (5, 'Hai An', 27, 'Ha Noi', 8500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (6, 'Hoang', 22, 'Ha Noi', 4500.00 ); INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (7, 'Binh', 24, 'Ha Noi', 10000.00 );
Nội dung chính
Tạo View trong SQL
Các View được tạo ra bằng cách sử dụng câu lệnh CREATE VIEW . Các view có thể được tạo ra từ một bảng, nhiều bảng hoặc từ một view khác.
Cú pháp CREATE VIEW cơ bản như sau:
CREATE VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
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ụ
Giả sử bảng CUSTOMERS có các bản ghi sau đây:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Sau đây là một ví dụ để tạo một view từ bảng CUSTOMERS. View này được sử dụng để lấy name và age từ bảng CUSTOMERS.
CREATE VIEW CUSTOMERS_VIEW AS SELECT id, name, age FROM CUSTOMERS;
Bây giờ, bạn có thể truy vấn CUSTOMERS_VIEW theo cách tương tự như bạn truy vấn bảng thực tế. Sau đây là một ví dụ cho cùng một.
SELECT * FROM CUSTOMERS_VIEW;
Kết quả:
+----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | Ha Anh | 32 | | 2 | Van Ha | 25 | | 3 | Vu Bang | 23 | | 4 | Thu Minh | 25 | | 5 | Hai An | 27 | | 6 | Hoang | 22 | | 7 | Binh | 24 | +----+----------+-----+
Tùy chọn WITH CHECK OPTION
Tùy chọn WITH CHECK OPTION là ràng buộc trong câu lệnh CREATE VIEW. Mục đích của WITH CHECK OPTION là đảm bảo rằng tất cả sự kiện UPDATE và INSERT view đều phải 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, câu lệnh UPDATE hoặc INSERT view sẽ trả về lỗi.
Khối lệnh sau đây là một ví dụ về việc tạo ra view CUSTOMERS_VIEW với tùy chọn WITH CHECK OPTION.
CREATE VIEW CUSTOMERS_VIEW AS SELECT id, name, age FROM CUSTOMERS WHERE age IS NOT NULL WITH CHECK OPTION;
Trong trường hợp này, nếu bạn cố gắng UPDATE hoặc INSERT CUSTOMERS_VIEW với giá trị age = null thì sẽ bị lỗi, ví dụ:
INSERT INTO CUSTOMERS_VIEW VALUES(14, 'TEST', null)
Kết quả:
[Err] 44000 - [SQL Server]The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint. 01000 - [SQL Server]The statement has been terminated.
Ví dụ, age khác NULL thì sẽ UPDATE hoặc INSERT thành công:
INSERT INTO CUSTOMERS_VIEW VALUES(14, 'TEST', 17)
Kết quả:
+----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | Ha Anh | 32 | | 2 | Van Ha | 25 | | 3 | Vu Bang | 23 | | 4 | Thu Minh | 25 | | 5 | Hai An | 27 | | 6 | Hoang | 22 | | 7 | Binh | 24 | | 14| TEST | 17 | +----+----------+-----+
Update một view
View có thể được update với các điều kiện nhất định được đưa ra dưới đây:
- 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 có thể không chứa các hàm tập hợp.
- Mệnh đề SELECT không được chứa các toán tử tập hợp.
- 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 ứng lượng không thể được update.
- Tất cả các cột NOT NULL từ bảng cơ sở 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 nói trên thì bạn có thể sử dụng câu lệnh UPDATE hoặc INSERT cho view đó. Ví dụ sau cập nhật age cho customers có tên là Ha Anh.
UPDATE CUSTOMERS_VIEW SET AGE = 35 WHERE name = 'Ha Anh';
Kết quả, bảng CUSTOMERS được cập nhật như sau:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 35 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Insert một view
Bạn cũng có thể insert một bản ghi vào một view. Các quy tắc tương tự UPDATE cũng áp dụng cho lệnh INSERT.
Ở mục "Tùy chọn WITH CHECK OPTION" chúng ta đã có một ví dụ về việc insert View.
Xóa hàng trong một view
Các bản ghi có thể bị xóa khỏi một view. Các quy tắc tương tự áp dụng cho các lệnh UPDATE và INSERT áp dụng cho lệnh DELETE.
Sau đây là một ví dụ để xóa một bản ghi có age = 22.
DELETE FROM CUSTOMERS_VIEW WHERE AGE = 22;
Kết quả, bảng CUSTOMERS được cập nhật như sau:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 35 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Xóa view
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 view_name;
Ví dụ xóa view CUSTOMERS_VIEW từ bảng CUSTOMERS.
DROP VIEW CUSTOMERS_VIEW;