

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ì?
VIEW
là 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âuSELECT
gố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
VIEW
chỉ chứa một bảng đơn, khôngGROUP BY
, khôngDISTINCT
, thì bạn có thể dùngINSERT
,UPDATE
,DELETE
trênVIEW
. - Nếu
VIEW
chứ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
VIEW
là 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 VIEW
trong hệ quản trị khác như PostgreSQL).