12/08/2018, 15:46

Tìm hiểu về Database View

Tổng Quát View không phải là một khái niệm riêng của MYSQL mà tất cả các hệ quản trị CSDL hiện nay như MSSQL, Oracle, .. đều có hỗ trợ thành phần này. Nó có thể được xem như là một bảng ảo trong CSDL có nội dung được định nghĩa thông qua một câu lệnh truy vấn(SELECT). Như vậy, một View trông ...

Tổng Quát

View không phải là một khái niệm riêng của MYSQL mà tất cả các hệ quản trị CSDL hiện nay như MSSQL, Oracle, .. đều có hỗ trợ thành phần này. Nó có thể được xem như là một bảng ảo trong CSDL có nội dung được định nghĩa thông qua một câu lệnh truy vấn(SELECT). Như vậy, một View trông giống như một Table(bảng) với một tên khung nhìn và một tập các dòng, cột. Điểm khác biệt giữa View và Table là: View không được xem là một cấu trúc lưu trữ dữ liệu tồn tại trong CSDL

Lợi Ích

Các VIEW được sử dụng trong CSDL nhằm các mục đích sau:

  • Sử dụng khung nhìn để tập trung và đơn giản hóa dữ liệu: thông qua View ta có thể cung cấp cho người dùng những cấu trúc đơn giản, dễ hiểu về dữ liệu đồng thời giúp cho người dùng tập trung hơn trên những phần dữ liệu cần thiết.
  • Sử dụng khung nhìn để tuỳ biến dữ liệu: cho phép tăng hoặc giảm các Fields tùy theo yêu cầu sử dụng bởi vì nó được tạo từ một câu truy vấn SELECT nên bạn có thể JOIN nhiều Table lại với nhau và lưu vào View
  • Sử dụng khung nhìn để xuất dữ liệu: Một View đóng vai trò như một đối tượng tập hợp dữ liệu từ nhiều bảng khác nhau vào trong một bảng -> Người sử dụng có thể thực hiện các yêu cầu truy vấn dữ liệu một cách đơn giản từ View thay vì phải đưa ra những câu truy vấn phức tạp.
  • Sử dụng khung nhìn để bảo mật dữ liệu: View chỉ cho phép đọc (Read Only) nên việc hacker tấn công cập nhật dữ liệu là điều không thể.

Nhược Điểm

  • Khi truy vấn trong View có thể sẽ chậm hơn trong table
  • Bị phụ thuộc vào Table gốc, nếu Table gốc thay đổi cấu trúc thì đòi hỏi View cũng phải thiết kế lại cho phù hợp

CREATE VIEW Syntax

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

Ví dụ: Ta có bảng employees như sau:

id staff_code employee_name date_of_birth rank salary
1 B110001 Nguyễn Văn A 1990/01/02 4.3 1300$$
2 B110002 Đỗ Văn B 1989/09/01 5.1 1700$$
3 B110003 Hà Thị C 1992/02/04 3.8 1000$$
4 B110004 Phạm Thị D 1994/10/21 2.7 650$$

Tạo View có tên employee_views truy vấn dữ liệu từ bảng employees để lấy các dữ liệu, staff_code, name, salary bằng câu lệnh SELECT:

CREATE VIEW employee_views AS
SELECT staff_code, employee_name, salary
FROM  employees;

Kết qủa, ta sẽ có 1 table ảo employee_views, Và sau đó chúng ta hoàn toàn có thể lấy dữ liệu từ table ảo này bằng lệnh

SELECT * FROM employee_vews;
staff_code employee_name salary
B110001 Nguyễn Văn A 1300$$
B110002 Đỗ Văn B 1700$$
B110003 Hà Thị C 1000$$
B110004 Phạm Thị D 650$$

SQL Updating a View

Một view có thể cập nhật khi nó thỏa mãn các điều kiện

  • View được định nghĩ từ một và chỉ một bảng cơ sở
  • Trong câu lệnh SELECT định nghĩa khung nhìn không được sử dụng từ khoá DISTINCT, TOP, GROUP BY, HAVING, ORDER_BY và UNION.
  • Trong view không có bất kỳ SUBQUERIES nào được định nghĩa
  • Các thành phần xuất hiện trong danh sách chọn của câu lệnh SELECT phải là các cột trong các bảng cơ sở. Trong danh sách chọn không được chứa các biểu thức tính toán, các hàm gộp.
  • Các cột được ước lượng không thể bị cập nhật.
  • Tất cả các cột NOT NULL từ bảng ban đầu phải được bao trong view để cho truy vấn INSERT vận hành.

Khi view của bạn thỏa mãn tất cả các quy tắc trên thì bệnh có thể cập nhật view bằng câu lệnh:

CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name

VD: Cập nhật table employee_views

CREATE OR REPLACE VIEW employee_view AS
SELECT staff_code, employee_name, salary
FROM employees
WHERE condition;

SQL Dropping a View

Khi bạn đã có 1 view, nhưng khi không sử dụng đến nó nữa, thì chúng ta nên xóa view đó đi. cú pháp để xóa view như sau

DROP VIEW view_name;
0