VIEW Trong MySQL — Bảng Ảo Từ Truy Vấn
- 08-07-2025
- Toanngo92
- 0 Comments
Tuyệt! Bây giờ chúng ta sẽ tìm hiểu về VIEW trong MySQL — một công cụ cực kỳ hữu ích khi bạn cần tái sử dụng truy vấn phức tạp, đơn giản hóa câu lệnh, hoặc bảo vệ dữ liệu.
Mục lục
🪟 VIEW Trong MySQL — Bảng Ảo Từ Truy Vấn
✅ 1. VIEW là gì?
VIEWlà một bảng ảo được tạo từ kết quả của một câu lệnhSELECT.- Nó không lưu trữ dữ liệu thật, mà chỉ chứa câu truy vấn định nghĩa nó.
- Mỗi khi bạn truy vấn
VIEW, MySQL sẽ chạy lại câuSELECTgốc để lấy dữ liệu mới nhất.
✅ 2. Tại sao dùng VIEW?
| Lợi ích của VIEW | Mô tả |
|---|---|
| ✅ Tái sử dụng truy vấn phức tạp | Truy vấn chỉ viết một lần, dùng lại nhiều nơi |
| ✅ Giấu logic, bảo vệ dữ liệu | Cho phép người dùng chỉ xem cột cần thiết |
| ✅ Tăng khả năng bảo trì | Nếu cần đổi logic, chỉ cần sửa VIEW, không sửa mọi truy vấn |
✅ Có thể dùng JOIN, GROUP BY, v.v. | VIEW hỗ trợ gần như mọi loại câu lệnh SELECT |
✅ 3. Cú pháp tạo VIEW
CREATE VIEW ten_view AS
SELECT ... FROM ... WHERE ...;
✅ 4. Ví dụ thực tế
Bảng nguồn:
CREATE TABLE Orders (
id INT PRIMARY KEY,
customer VARCHAR(50),
amount DECIMAL(10,2),
status VARCHAR(20)
);
INSERT INTO Orders VALUES
(1, 'Nam', 500, 'paid'),
(2, 'Linh', 300, 'pending'),
(3, 'Hà', 700, 'paid'),
(4, 'Linh', 100, 'cancelled');
Tạo VIEW hiển thị đơn hàng đã thanh toán:
CREATE VIEW PaidOrders AS
SELECT id, customer, amount
FROM Orders
WHERE status = 'paid';
Truy vấn từ VIEW:
SELECT * FROM PaidOrders;
📌 Kết quả sẽ như một bảng thật, nhưng chỉ chứa các đơn hàng "paid".
✅ 5. Cập nhật dữ liệu qua VIEW?
Câu trả lời: CÓ, nhưng có giới hạn
- Nếu
VIEWchỉ chứa một bảng đơn, khôngGROUP BY, khôngDISTINCT, thì bạn có thể dùngINSERT,UPDATE,DELETEtrênVIEW. - Nếu
VIEWchứaJOIN,GROUP BY,HAVING,… thì thường là không thể cập nhật (trừ khi khai báoWITH CHECK OPTION).
Ví dụ UPDATE thông qua VIEW:
UPDATE PaidOrders
SET amount = 600
WHERE id = 1;
MySQL sẽ cập nhật bảng gốc (
Orders) thông quaVIEW.
✅ 6. Xóa hoặc thay đổi VIEW
Xóa VIEW:
DROP VIEW PaidOrders;
Sửa VIEW:
CREATE OR REPLACE VIEW PaidOrders AS
SELECT id, customer, amount
FROM Orders
WHERE status IN ('paid', 'pending');
✅ 7. Kiểm tra danh sách VIEW hiện có
SHOW FULL TABLES WHERE Table_type = 'VIEW';
✅ 8. VIEW với JOIN và GROUP BY
CREATE VIEW CustomerTotals AS
SELECT customer, SUM(amount) AS total
FROM Orders
WHERE status = 'paid'
GROUP BY customer;
Sau đó bạn có thể:
SELECT * FROM CustomerTotals
WHERE total > 600;
📘 Kết Luận
VIEWlà một công cụ tuyệt vời để tái sử dụng truy vấn, ẩn logic, đơn giản hóa báo cáo.- Không nên lạm dụng quá nhiều VIEW lồng nhau vì có thể ảnh hưởng hiệu suất.
- VIEW luôn truy vấn dữ liệu thật thời điểm gọi, không cache dữ liệu (trừ khi bạn dùng
MATERIALIZED VIEWtrong hệ quản trị khác như PostgreSQL).





