Cú pháp
CREATE VIEW ten_view AS SELECT cot1, cot2, cot3, ... FROM ten_bang WHERE dieu_kien;
Ví dụ: Tạo view LookUpTable từ ViewDemo
1. Tạo bảng gốc
mysql> CREATE TABLE ViewDemo ( -> Id INT, -> Name VARCHAR(200), -> Age INT -> ); Query OK, 0 rows affected (0.58 sec)
2. Tạo VIEW
mysql> CREATE VIEW LookUpTable AS SELECT Id, Name FROM ViewDemo; Query OK, 0 rows affected (0.15 sec)
3. Kiểm tra view đã tạo
mysql> SHOW CREATE TABLE LookUpTable;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | View | Create View | character_set_client | collation_connection | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | lookuptable | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `lookuptable` AS select `viewdemo`.`Id` AS `Id`,`viewdemo`.`Name` AS `Name` from `viewdemo` | utf8 | utf8_general_ci | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set (0.00 sec)
Sử dụng VIEW
-- Truy vấn như bảng bình thường SELECT * FROM LookUpTable; SELECT * FROM LookUpTable WHERE Id > 1; SELECT Id FROM LookUpTable ORDER BY Name;
Các tùy chọn nâng cao
ALGORITHM
CREATE ALGORITHM = MERGE VIEW ten_view AS ... -- Mặc định, gộp query view vào query cha CREATE ALGORITHM = TEMPTABLE VIEW ten_view AS ... -- Tạo temp table trung gian CREATE ALGORITHM = UNDEFINED VIEW ten_view AS ... -- MySQL tự quyết định
DEFINER & SQL SECURITY
CREATE DEFINER = 'user'@'host' SQL SECURITY DEFINER VIEW ten_view AS ... -- DEFINER: Chạy với quyền của người tạo view -- INVOKER: Chạy với quyền của người gọi view
WITH CHECK OPTION
CREATE VIEW ten_view AS SELECT * FROM ten_bang WHERE status = 'active' WITH CHECK OPTION; -- Chặn INSERT/UPDATE vi phạm điều kiện WHERE
Ưu điểm của VIEW
- Bảo mật: Che giấu cột nhạy cảm, chỉ expose cột cần thiết
- Đơn giản hóa: Gói query phức tạp (JOIN, subquery) thành bảng ảo
- Tái sử dụng: Định nghĩa 1 lần, dùng nhiều nơi
- Ổn định API: Schema view không đổi dù bảng dưới thay đổi
- Kiểm soát dữ liệu: WITH CHECK OPTION đảm bảo tính toàn vẹn
Hạn chế
- Không thể tạo index trên view (MySQL không hỗ trợ materialized view)
- Performance: Query phức tạp trong view chạy mỗi lần SELECT
- Không thể UPDATE view phức tạp (JOIN, GROUP BY, DISTINCT, subquery...)
- DEFINER privilege: Cần quyền CREATE VIEW và quyền trên bảng dưới
Xem danh sách view
SHOW FULL TABLES IN ten_database WHERE TABLE_TYPE = 'VIEW'; SELECT * FROM information_schema.VIEWS WHERE TABLE_SCHEMA = 'ten_database';
Xóa view
DROP VIEW IF EXISTS ten_view;