視圖是虛擬表,本質為預定義的 SELECT 查詢結果集。善用視圖可簡化複雜查詢、實現欄位級權限控制、支援大表分片透明訪問。
| 操作 | 語法 |
|---|---|
| 建立 | CREATE VIEW view_name AS SELECT ...; |
| 修改 | ALTER VIEW view_name AS SELECT ...; |
| 刪除 | DROP VIEW [IF EXISTS] view_name; |
| 查看定義 | SHOW CREATE VIEW view_name; |
| 查看結構 | DESC view_name; / SHOW TABLE STATUS LIKE 'view_name'; |
| 查詢資料 | SELECT * FROM view_name; |
-- 原始:每次需 GROUP BY SELECT cat_id, AVG(shop_price) FROM goods GROUP BY cat_id; -- 建立視圖 CREATE VIEW avg_price AS SELECT cat_id, AVG(shop_price) AS avg_price FROM goods GROUP BY cat_id; -- 後續直接查詢 SELECT * FROM avg_price WHERE cat_id = 5;
-- 隱藏敏感價格欄位 CREATE VIEW public_goods AS SELECT goods_id, goods_name, cat_id FROM goods; -- 不含 shop_price GRANT SELECT ON public_goods TO 'report_user'@'%'; REVOKE SELECT ON goods FROM 'report_user'@'%';
-- 將 news 分為 news_1~news_4(id%4+1 路由) CREATE VIEW news AS SELECT * FROM news_1 UNION ALL SELECT * FROM news_2 UNION ALL SELECT * FROM news_3 UNION ALL SELECT * FROM news_4; -- 業務端無感知查詢 SELECT * FROM news WHERE id = 10001;
視圖可執行 INSERT/UPDATE/DELETE 需滿足:
DISTINCT/GROUP BY/UNION)。| 算法 | 機制 | 適用場景 | 限制 |
|---|---|---|---|
| MERGE(預設) | 查詢與視圖定義 SQL 合併重寫,直接查基表 | 簡單過濾/投影,可利用基表索引 | 含聚合/排序/DISTINCT 時無法合併 |
| TEMPTABLE | 先按視圖定義物化到臨時表,再查臨時表 | 視圖含 ORDER BY + 外層 GROUP BY 等無法合併場景 | 臨時表無索引,大數據集性能差 |
-- 需求:每個分類價格最高的商品 -- MERGE 會合併導致 ORDER BY 失效 CREATE ALGORITHM=TEMPTABLE VIEW top_per_cat AS SELECT cat_id, goods_id, goods_name, shop_price FROM goods ORDER BY cat_id, shop_price DESC; -- 外層 GROUP BY 正確取每組第一行 SELECT * FROM top_per_cat GROUP BY cat_id;
-- 所有視圖 SELECT TABLE_NAME FROM information_schema.VIEWS WHERE TABLE_SCHEMA = 'db_name'; -- 視圖依賴關係 SELECT * FROM information_schema.VIEW_TABLE_USAGE WHERE VIEW_NAME = 'view_name';
v_ 前綴,語義清晰(如 v_user_order_summary)。ANALYZE TABLE 更新基表統計,確保視圖查詢走最優計劃。