Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách tạo VIEW trong MySQL


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;