- Chuyên mục khác :
- Git cơ bản và nâng cao
- ·
- MySQL cơ bản và nâng cao
- ·
- MongoDB cơ bản và nâng cao
- ·
- SQL cơ bản và nâng cao
- ·
- Linux cơ bản và nâng cao
- Cơ bản về SQL
- Học SQL cơ bản và nâng cao
- SQL là gì
- Các khái niệm RDBMS trong SQL
- RDBMS Database trong SQL
- Cú pháp SQL cơ bản
- Kiểu dữ liệu trong SQL
- Toán tử trong SQL
- Biểu thức trong SQL
- SQL Database
- Lệnh CREATE DATABASE trong SQL
- Lệnh DROP Database trong SQL
- Lệnh SELECT DATABASE trong SQL
- Lệnh RENAME DATABASE trong SQL
- SQL Table
- CREATE Table trong SQL - Tạo bảng trong SQL
- Lệnh DROP Table trong SQL
- DELETE trong SQL
- Lệnh RENAME Table trong SQL
- Lệnh TRUNCATE TABLE trong SQL
- Lệnh ALTER TABLE trong SQL
- Mô phỏng bảng trong SQL
- Bảng tạm (Temporary Table) trong SQL
- Nhóm lệnh thao tác cơ bản
- UPDATE trong SQL
- Truy vấn INSERT trong SQL
- Truy vấn SELECT trong SQL
- Mệnh đề ORDER BY trong SQL
- Mệnh đề GROUP BY trong SQL
- Từ khóa DISTINCT trong SQL
- Sắp xếp kết quả trong SQL
- Mệnh đề trong SQL
- Mệnh đề WHERE trong SQL
- Toán tử liên hợp AND và OR trong SQL
- Mệnh đề With trong SQL
- Mệnh đề LIKE trong SQL
- Mệnh đề TOP, LIMIT, ROWNUM trong SQL
- Hoạt động SQL nâng cao
- Mệnh đề UNION trong SQL
- Giá trị NULL trong SQL
- Alias trong SQL
- Chỉ mục (Index) trong SQL
- Sử dụng View trong SQL
- Mệnh đề HAVING trong SQL
- Transaction trong SQL
- Toán tử wildcard trong SQL
- Truy vấn con trong SQL
- Sử dụng Sequence trong SQL
- Xử lý bản sao trong SQL (DISTINCT)
- Injection trong SQL
- Ràng buộc trong SQL
- Ràng buộc (Constraint) trong SQL
- Ràng buộc NOT NULL trong SQL
- Ràng buộc DEFAULT trong SQL
- Ràng buộc UNIQUE trong SQL
- Ràng buộc PRIMARY KEY trong SQL
- Ràng buộc FOREIGN KEY trong SQL
- Ràng buộc CHECK trong SQL
- Ràng buộc INDEX trong SQL
- SQL Join
- Mệnh đề JOINS trong SQL
- INNER JOIN trong SQL
- LEFT JOIN trong SQL
- RIGHT JOIN trong SQL
- FULL JOIN trong SQL
- SELF JOIN trong SQL
- CARTESIAN JOIN hoặc CROSS JOIN trong SQL
- Hàm trong SQL
- Hàm hữu ích trong SQL
- Hàm xử lý Date và Time trong SQL
- Hàm xử lý số trong SQL
- Hàm xử lý chuỗi trong SQL
- Tài liệu SQL tham khảo
- First Normal Form (1NF) trong SQL
- Second Normal Form (2NF) trong SQL
- Third Normal Form (3NF) trong SQL
- Tuning DB trong SQL
- Tài liệu SQL tham khảo
Một view là không gì khác ngoài môt lệnh SQL mà được lưu giữ trong Database với một tên liên kết. Một view thực sự là một thành phần của một bảng trong form của một truy vấn SQL đã được định nghĩa trước.
Một view có thể chứa tất cả các hàng của một bảng hoặc các hàng đã được chọn từ một bảng. Một view có thể được tạo từ một hoặc nhiều bảng, phụ thuộc vào truy vấn SQL đã viết để tạo một view.
View, về bản chất giống các Virtual Table (bảng ảo), cho phép người dùng thực hiện:
-
Cấu trúc dữ liệu theo cách mà người dùng tìm thấy tính tự nhiên hoặc tính trực quan.
-
Giới hạn truy cập tới dữ liệu để mà một người dùng có thể thấy và (đôi khi) sửa đổi một cách chính xác nhưng gì họ cần.
-
Tổng kết dữ liệu từ các bảng đa dạng để tạo các bản báo cáo.
Tạo View trong SQL
View được tạo bởi sử dụng 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.
Để tạo một view, người dùng phải được trao quyền hệ thống thích hợp theo trình triển khai cụ thể.
Cú pháp cơ bản của lệnh CREATE VIEW trong SQL là như sau:
CREATE VIEW ten_view AS SELECT cot1, cot2..... FROM ten_bang WHERE [dieu_kien];
Bạn có thể bao nhiều bảng trong lệnh SELECT theo cách tương tự như bạn sử dụng chúng trong truy vấn SELECT thông thường.
Ví dụ
Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+ | ID | TEN | TUOI| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4000000 | | 2 | Viet | 19 | DTVT | 3000000 | | 3 | Thanh | 18 | KTDN | 4000000 | | 4 | Nhan | 19 | CK | 4500000 | | 5 | Huong | 20 | TCNH | 5000000 | +----+---------+-----+-----------+---------+
Bây giờ là một ví dụ để tạo một view từ bảng này. View này sẽ được sử dụng để có TEN và TUOI của sinh viên:
SQL > CREATE VIEW SINHVIEN_VIEW AS SELECT TEN, TUOI FROM SINHVIEN;
Bây giờ, bạn có thể truy vấn SINHVIEN_VIEW theo cách tương tự bạn truy vấn một bảng thực sự. Sau đây là ví dụ:
SQL > SELECT * FROM SINHVIEN_VIEW;
Ví dụ trên sẽ cho kết quả:
+----------+-----+ | TEN | TUOI | +----------+-----+ | Hoang | 21 | | Viet | 19 | | Thanh | 18 | | Nhan | 19 | | Huong | 20 | +----------+-----+
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ả UPDATE và INSERT 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, thì UPDATE và INSERT trả về một lỗi.
Ví dụ sau tạo cùng một view là SINHVIEN_VIEW với WITH CHECK OPTION.
CREATE VIEW SINHVIEN_VIEW AS SELECT TEN, TUOI FROM SINHVIEN WHERE TUOI IS NOT NULL WITH CHECK OPTION;
Trong trường hợp này, WITH CHECK OPTION nên từ chối bất kỳ giá trị NULL nào trong cột TUOI của view, bởi vì view được định nghĩa bởi dữ liệu mà không có giá trị NULL trong cột TUOI.
Cập nhật 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 thể chứa từ khóa DISTINCT.
-
Mệnh đề SELECT không thể chứa các hàm tổng.
-
Mệnh đề SELECT không thể chứa các hàm tập hợp.
-
Mệnh đề SELECT không thể chứa các toán tử tập hợp.
-
Mệnh đề SELECT không thể chứa một mệnh đề ORDER BY.
-
Mệnh đề FROM không thể chứa nhiều bảng.
-
Mệnh đề WHERE không thể chứa các truy vấn phụ.
-
Truy vấn không thể chứa GROUP BY hoặc HAVING.
-
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.
Vì thế, nếu một view thỏa mãn tất cả các qui tắc trên, thì bạn có thể cập nhật một view. Sau đây là ví dụ cập nhật TUOI của Hoang.
SQL > UPDATE SINHVIEN_VIEW SET TUOI = 20 WHERE TEN='Hoang';
Cuối cùng, bảng SINHVIEN ban đầu được cập nhật 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| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 20 | CNTT | 4000000 | | 2 | Viet | 19 | DTVT | 3000000 | | 3 | Thanh | 18 | KTDN | 4000000 | | 4 | Nhan | 19 | CK | 4500000 | | 5 | Huong | 20 | TCNH | 5000000 | +----+---------+-----+-----------+---------+
Chèn các hàng vào trong một View trong SQL
Các hàng dữ liệu có thể được chèn vào trong một view. Các qui tắc áp dụng cho lệnh UPDATE cũng sẽ được áp dụng cho lệnh INSERT trong SQL.
Ở đây, chúng ta không thể chèn các hàng vào trong SINHVIEN_VIEW bởi vì chúng ta không được bao gồm tất cả cột NOT NULL trong view này. Chúng ta có thể 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ừ một View trong SQL
Các hàng dữ liệu có thể bị xóa từ một view. Các qui tắc áp dụng cho lệnh UPDATE và lệnh INSERT cũng sẽ được áp dụng cho lệnh DELETE trong SQL.
Ví dụ sau sẽ xóa một hàng có TUOI = 18.
SQL > DELETE FROM SINHVIEN_VIEW WHERE TUOI = 18;
Cuối cùng, một hàng trong bảng SINHVIEN 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| KHOAHOC | HOCPHI | +----+---------+-----+-----------+---------+ | 1 | Hoang | 21 | CNTT | 4000000 | | 2 | Viet | 19 | DTVT | 3000000 | | 4 | Nhan | 19 | CK | 4500000 | | 5 | Huong | 20 | TCNH | 5000000 | +----+---------+-----+-----------+---------+
Xóa View trong SQL
Rõ ràng là, khi bạn đã có một view, và việc không cần thiết sử dụng view này nữa thì điều cần làm là xóa chúng đi. Cú pháp cơ bản để xóa view trong SQL như sau:
DROP VIEW ten_view;
Ví dụ sau để xóa SINHVIEN_VIEW từ bảng ban đầu.
DROP VIEW SINHVIEN_VIEW;
Có thể bạn chưa biết?
Trong MySQL, để một VIEW có thể cập nhật được, nó cần phải tuân theo một số điều kiện nhất định. Dưới đây là các điều kiện giúp VIEW có thể cập nhật được và các trường hợp cụ thể mà bạn có thể thực hiện cập nhật thông qua VIEW.
Điều kiện để một VIEW có thể cập nhật
- Chỉ dựa trên một bảng duy nhất: VIEW phải được tạo từ một bảng duy nhất mà không sử dụng phép JOIN hoặc các bảng khác.
- Không chứa các phép tổng hợp hoặc biểu thức tính toán: VIEW không được chứa các hàm tổng hợp (như SUM(), COUNT(), AVG(), v.v.) hoặc các biểu thức tính toán phức tạp.
- Không sử dụng DISTINCT hoặc GROUP BY: Các câu lệnh này không được xuất hiện trong định nghĩa của VIEW.
- Không có UNION hoặc UNION ALL: VIEW không được sử dụng các phép kết hợp UNION hoặc UNION ALL.
- Không chứa LIMIT: VIEW không được sử dụng LIMIT để giới hạn số lượng kết quả.
- Phải chứa tất cả các cột không thể NULL của bảng nguồn: Nếu bảng nguồn có các cột với ràng buộc NOT NULL, thì VIEW phải bao gồm tất cả các cột đó.
- Không sử dụng các câu lệnh con không tương thích với cập nhật: VIEW không được sử dụng các câu lệnh con phức tạp mà MySQL không thể dịch ngược lại thành câu lệnh cập nhật đơn giản.
Ví dụ về VIEW có thể cập nhật
employees table:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
department_id INT
);
VIEW từ một bảng duy nhất:
CREATE VIEW simple_employee_view AS
SELECT id, name, email, department_id
FROM employees;
Bạn có thể cập nhật dữ liệu thông qua VIEW này:
UPDATE simple_employee_view
SET name = 'John Doe', email = 'john.doe@example.com'
WHERE id = 1;
Ví dụ về VIEW không thể cập nhật
employees and departments tables:
CREATE TABLE departments (
id INT AUTO_INCREMENT PRIMARY KEY,
department_name VARCHAR(100)
);
VIEW với JOIN:
CREATE VIEW employee_departments AS
SELECT e.id, e.name, e.email, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
Cố gắng cập nhật dữ liệu thông qua VIEW này:
UPDATE employee_departments
SET name = 'John Doe'
WHERE id = 1;
MySQL sẽ không cho phép cập nhật trực tiếp thông qua VIEW này do nó kết hợp nhiều bảng với phép JOIN.
Kết luận
- Cập nhật được: VIEW đơn giản dựa trên một bảng duy nhất, không chứa các phép tổng hợp, biểu thức tính toán phức tạp, DISTINCT, GROUP BY, UNION, LIMIT, hoặc các câu lệnh con phức tạp.
- Không thể cập nhật: VIEW dựa trên nhiều bảng (sử dụng JOIN), chứa các phép tổng hợp, biểu thức tính toán phức tạp, DISTINCT, GROUP BY, UNION, LIMIT, hoặc các câu lệnh con phức tạp.
Hiểu rõ các điều kiện này sẽ giúp bạn biết khi nào có thể cập nhật dữ liệu thông qua VIEW
và khi nào cần cập nhật trực tiếp trên bảng nguồn.
Trong MySQL, việc cập nhật dữ liệu thông qua một VIEW có thể bị hạn chế, đặc biệt khi VIEW đó được tạo ra từ nhiều bảng. Dưới đây là các nguyên tắc và hạn chế liên quan đến việc cập nhật VIEW khi nó kết hợp nhiều bảng:
Hạn chế của VIEW khi cập nhật
- VIEW từ nhiều bảng: Nếu một VIEW được tạo từ nhiều bảng thông qua phép kết hợp (JOIN), thì việc cập nhật dữ liệu thông qua VIEW này thường không khả thi hoặc bị hạn chế nghiêm trọng.
- VIEW với các biểu thức tính toán: Nếu VIEW chứa các biểu thức tính toán, hàm tổng hợp, hoặc các cột dẫn xuất từ nhiều bảng, thì các cột này thường không thể cập nhật được.
- VIEW không chứa toàn bộ các cột chính (PRIMARY KEY) hoặc các cột duy nhất (UNIQUE): Để có thể cập nhật một VIEW, cần đảm bảo rằng VIEW này chứa tất cả các cột chính hoặc các cột duy nhất từ bảng nguồn.
Ví dụ về VIEW không thể cập nhật
Giả sử bạn có hai bảng employees và departments như sau:
employees:
id | name | department_id |
---|---|---|
1 | John | 1 |
2 | Jane | 2 |
departments:
id | department_name |
---|---|
1 | HR |
2 | Engineering |
Bạn tạo một VIEW kết hợp hai bảng này:
CREATE VIEW employee_departments AS
SELECT e.id, e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
Khi bạn cố gắng cập nhật VIEW này:
UPDATE employee_departments
SET name = 'John Doe'
WHERE id = 1;
MySQL sẽ không cho phép cập nhật trực tiếp thông qua VIEW này vì VIEW kết hợp dữ liệu từ nhiều bảng.
Cách giải quyết
Để cập nhật dữ liệu khi làm việc với VIEW, bạn có thể:
-
Sử dụng INSTEAD OF Triggers: MySQL không hỗ trợ INSTEAD OF triggers, nhưng bạn có thể tạo các thủ tục lưu trữ (stored procedures) để xử lý việc cập nhật dữ liệu cho từng bảng cụ thể.
-
Tránh sử dụng VIEW kết hợp nhiều bảng: Nếu bạn cần cập nhật dữ liệu, tốt nhất là làm việc trực tiếp với các bảng nguồn thay vì thông qua VIEW.
Ví dụ về VIEW có thể cập nhật
Nếu bạn có một VIEW đơn giản từ một bảng duy nhất, bạn có thể cập nhật nó dễ dàng hơn. Ví dụ:
CREATE VIEW simple_view AS
SELECT id, name
FROM employees;
Khi cập nhật VIEW này:
UPDATE simple_view
SET name = 'John Doe'
WHERE id = 1;
MySQL sẽ cập nhật trực tiếp bảng employees.
Kết luận
- VIEW được tạo từ nhiều bảng thường không thể cập nhật trực tiếp.
- Để cập nhật dữ liệu, tốt nhất là làm việc trực tiếp với các bảng nguồn hoặc sử dụng các thủ tục lưu trữ để xử lý logic cập nhật.
- Các VIEW đơn giản từ một bảng duy nhất thường dễ dàng cập nhật hơn.
Việc hiểu rõ các hạn chế và khả năng của VIEW trong MySQL sẽ giúp bạn thiết kế cơ sở dữ liệu và ứng dụng của mình một cách hiệu quả hơn.
Bình luận (0)