Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hiểu các chế độ xem trong SQL

Bởi Manoj Debnath

Các bảng trong cơ sở dữ liệu SQL có thể chứa một lượng lớn dữ liệu, nhưng chúng không phải lúc nào cũng ở định dạng hữu ích để dễ sử dụng. Khối lượng dữ liệu phải được lọc dựa trên một số tiêu chí cụ thể để sử dụng hiệu quả. Vì lý do bảo mật, chúng tôi có thể chỉ muốn công khai một lượng dữ liệu nhất định trong khi những người dùng đặc quyền có thể truy cập phần còn lại. Các hoạt động SQL DML có thể mở rộng và được sử dụng để lọc qua một hoặc nhiều bảng bằng cách sử dụng các biểu thức truy vấn phức tạp. Tận dụng ý tưởng, chúng ta có thể tạo các bảng ảo từ các bảng cơ sở liên tục bằng cách sử dụng SQL có chứa dữ liệu chính xác mà chúng ta cần. Đây là lý do tại sao tiêu chuẩn SQL:2006 đã giới thiệu việc sử dụng các bảng dạng xem hoặc dạng xem. Định nghĩa của một khung nhìn hoặc một bảng ảo tồn tại dưới dạng một đối tượng lược đồ. Bài viết này giới thiệu khái niệm về khung nhìn trong SQL, cách hoạt động và chỉ ra cách nó được triển khai với một số ví dụ.

Giới thiệu về Chế độ xem SQL

Các khung nhìn SQL không là gì ngoài các bảng ảo nằm trong bộ nhớ bắt nguồn từ một hoặc nhiều bảng cơ sở. Bảng ảo có nghĩa là các bộ giá trị trong dạng xem không tồn tại vật lý và không được lưu trữ trong cơ sở dữ liệu. Các bộ giá trị giống như dữ liệu tạm thời được tạo ra dưới dạng kết quả của truy vấn SQL thường lấy dữ liệu đã lọc từ một hoặc nhiều bảng cơ sở. Do đó, có một giới hạn về loại hoạt động có thể được áp dụng cho một bảng xem. Ví dụ:thao tác cập nhật không thể được áp dụng cho tất cả các kiểu xem, nhưng nó không có giới hạn về việc áp dụng truy vấn SQL trên đó.

Các ví dụ dưới đây được thử nghiệm với cơ sở dữ liệu MySQL. Bắt đầu bằng cách tạo một vài bảng:

my_company cơ sở dữ liệu:

CREATE DATABASE my_company;

CREATE TABLE Employee(
    empId INT(11) UNSIGNED CHECK (empId > 0),
    empName VARCHAR(20),
    birthDate DATE,
    address TEXT(128),
    gender VARCHAR(1),
    salary DECIMAL(15,2),
    managerId INT(11) UNSIGNED,
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(empId)
);
 
CREATE TABLE Department(
    deptId INT(11) UNSIGNED CHECK (empId > 0),
    deptName VARCHAR(20),
    deptMgrId INT(11) UNSIGNED,
    mgrStartDate DATE,
    PRIMARY KEY(deptId)
);

CREATE TABLE Project(
    projId INT(11) UNSIGNED CHECK (empId > 0),
    projName VARCHAR(20),
    projLocation TEXT(128),
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(projId)
);
 
CREATE TABLE EmpWorksOnProj(
    empId INT(11) UNSIGNED,
    projId INT(11) UNSIGNED,
    hoursWorked DECIMAL(4,2)
);  
 
ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId);
ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId);
ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);

Các khung nhìn có thể được coi như một bảng tham chiếu và chúng ta có thể sử dụng nó thường xuyên nếu chúng ta muốn mặc dù nó có thể không tồn tại về mặt vật lý. Ví dụ:chúng tôi có thể thường xuyên cần tham chiếu đến my_company cơ sở dữ liệu và tìm Nhân viên Dự án thông tin. Lưu ý rằng có nhiều mối quan hệ giữa Nhân viên Dự án vì một người có thể làm việc trên nhiều dự án và một dự án có nhiều nhân viên. Do đó, thay vì chỉ định kết hợp của ba bảng: Nhân viên , EmpWorksOnProj Dự án mỗi khi chúng tôi cần một thông tin cộng tác và đưa ra một truy vấn, chúng tôi xác định một dạng xem được chỉ định làm kết quả của phép nối giữa các bảng này. Dạng xem tạo thành bảng ảo được tạo từ kết quả của truy vấn. Ưu điểm là bây giờ truy vấn có thể truy xuất từ ​​một bảng kết quả duy nhất thay vì phải truy xuất từ ​​ba bảng đã kết hợp. Bộ sưu tập các bảng: Nhân viên , Dự án , Cục v.v ... do đó tạo thành các bảng cơ sở hoặc bảng xác định của dạng xem.

Hãy tạo một số chế độ xem dựa trên lược đồ đã cho ở trên.

CREATE VIEW V1
AS
SELECT
   empName, projName, hoursWorked
FROM
   Employee, Project, EmpWorksOnProj
WHERE
   Employee.empId=EmpWorksOnProj.empId
AND
   Project.projId=EmpWorksOnProj.projId;
 

Cách chỉ định truy vấn SQL trên khung nhìn hoặc bảng ảo cũng giống như cách chỉ định truy vấn liên quan đến bảng cơ sở. Bạn có thể sử dụng SQL SELECT trên các dạng xem để lấy dữ liệu như sau:

CHỌN * TỪ V1;

EmpName

ProjName

Giờ làm việc

Chuột Mickey

ClubHouse

6,50

Vịt Donald

Làm ruộng

7,0

Sau đây tạo ra một chế độ xem thứ hai:

TẠO CHẾ ĐỘ XEM V2 NHƯ CHỌN tên deptName, COUNT (*), SUM (lương) TỪ Bộ phận, Nhân viên TẠI ĐÂU Employee.deptId =Department.deptId GROUP BY deptName;

SQL SELECT cho kết quả là

SELECT * FROM V1;

DeptName

COUNT (*)

SUM (lương)

Âm nhạc

5

56000,00

Chính kịch

2

25400,00

Lưu ý rằng trong dạng xem V1, các tên thuộc tính có nguồn gốc từ bảng cơ sở. Trong phiên bản V2, tên thuộc tính mới được chỉ định rõ ràng bằng cách sử dụng tương ứng 1-1 giữa các thuộc tính được chỉ định của mệnh đề CREATE VIEW và các thuộc tính được chỉ định trong mệnh đề CHỌN. Mệnh đề SELECT với chế độ xem là quyết định của định nghĩa về chế độ xem.

Thông tin về chế độ xem luôn được cho là phải cập nhật. Điều đó có nghĩa là nó phải luôn phản ánh những thay đổi được thực hiện trên các bảng cơ sở mà nó được xác định. Điều này thật thú vị, bởi vì nó có nghĩa là chế độ xem không thực sự được hiện thực hóa tại thời điểm xác định nó, nhưng sau đó khi một truy vấn được chỉ định trên nó. Hệ thống quản lý cơ sở dữ liệu ở nền có trách nhiệm giữ cho chế độ xem được cập nhật.

CẬP NHẬT, CHÈN và XÓA trên các chế độ xem

Trong SQL, có thể tạo các dạng xem có thể cập nhật có thể được sử dụng để thay đổi dữ liệu hiện có hoặc chèn các hàng mới vào dạng xem mà lần lượt chèn hoặc sửa đổi bản ghi trong bảng cơ sở . Một khung nhìn có thể cập nhật được hay không được xác định bởi câu lệnh SELECT được xác định trong định nghĩa khung nhìn. Không có điều khoản đặc biệt nào để chỉ định một chế độ xem có thể cập nhật được. Thông thường, định nghĩa dạng xem phải đơn giản và không được chứa bất kỳ hàm tổng hợp nào như SUM, AVG, MAX, MIN, COUNT. Bất kỳ loại phân nhóm hoặc mệnh đề DISTINCT hoặc JOIN cũng làm cho chế độ xem không thể cập nhật. Tham khảo sổ tay hướng dẫn cơ sở dữ liệu liên quan của RDBMS cụ thể để biết điều gì làm cho một chế độ xem không thể cập nhật.

Hãy tạo một chế độ xem có thể cập nhật:

CREATE VIEW v3_ch_dept_name
AS
SELECT
   deptId, deptName, deptMgrId, mgrStartDate
FROM
   Department;

Truy vấn CHỌN trên chế độ xem:

SELECT * FROM v3_ch_dept_name;

DeptId

DeptName

DeptMgrId

MgrStartDate

1

Âm nhạc

123456789

2020-01-01

5

Chính kịch

987654321

2018-03-05

Bây giờ hãy cập nhật chế độ xem bằng cách thay đổi tên bộ phận (deptName).

UPDATE
   v3_ch_dept_name
SET
   deptName = 'Security'
WHERE
   deptId = 5;

Một hàng có thể được chèn vào dạng xem như sau:

INSERT
   INTO v3_ch_dept_name
VALUES (7,'Logistics',666884444,'1982-07-07');

Ngoài ra, chúng ta có thể XÓA một hàng khỏi dạng xem như sau:

DELETE FROM v3_ch_dept_name WHERE deptId = 7;

Trong MySQL, bạn có thể dễ dàng tìm thấy các dạng xem trong cơ sở dữ liệu có thể cập nhật hoặc không bằng cách sử dụng lệnh SELECT sau.

SELECT
   table_name
FROM
   information_schema.views
WHERE
   is_updatable like 'YES'
AND
   table_schema like 'my_company';

DROP lượt xem từ cơ sở dữ liệu

Một chế độ xem luôn có thể được xử lý bằng DROP VIEW lệnh.

DROP VIEW V1;

Lưu ý rằng khi chúng ta thực hiện lệnh drop view, nó sẽ xóa định nghĩa view. Dữ liệu cơ bản được lưu trữ trong các bảng cơ sở mà từ đó chế độ xem này được dẫn xuất vẫn không thay đổi. Một chế độ xem sau khi bị loại bỏ có thể được tạo lại với cùng tên.

Câu lệnh ALTER VIEW

Các chế độ xem thường không thể thay đổi theo tiêu chuẩn SQL:2006, điều đó có nghĩa là câu lệnh ALTER VIEW không hoạt động với các chế độ xem. Tuy nhiên, có những RDBMS như MySQL hoặc SQL Server hỗ trợ loại câu lệnh này. Oracle tin vào việc loại bỏ chế độ xem trước sau đó tạo lại nó hơn là thay đổi nó. Do đó, các chức năng được hỗ trợ trên các chế độ xem của RDBMS thay đổi tùy theo từng sản phẩm.

Kết luận

Dạng xem SQL cũng là công cụ hữu ích để truy cập nhiều kiểu dữ liệu. Các truy vấn phức tạp có thể được lưu trữ trong định nghĩa chế độ xem. Điều này thúc đẩy việc sử dụng lại vì chúng ta có thể gọi chế độ xem thay vì tạo lại các truy vấn mỗi khi chúng ta cần chúng. Đó là một cách thuận tiện để trình bày thông tin cho người dùng ẩn nhiều thông tin mà chúng tôi không muốn tiết lộ cho mọi người. Điều này cũng quan trọng từ góc độ bảo mật. Các cấu trúc phức tạp có thể được tổng hợp và trình bày ở định dạng dễ dàng cho người dùng cuối.

Tài liệu tham khảo:

Elmasri, Ramez và Shamkant B. Navathe. Nguyên tắc cơ bản của hệ thống cơ sở dữ liệu . Giáo dục Pearson.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách Bootstrap MySQL hoặc MariaDB Galera Cluster - Đã cập nhật

  2. Điều kiện WHERE trong MySQL với 16 ví dụ truy vấn khác nhau

  3. Chỉ trả lại hàng nếu giá trị không tồn tại

  4. sử dụng mysql SUM () trong mệnh đề WHERE

  5. Cách tạo MySQL máy chủ liên kết