視圖是虛擬表,不存儲數據,只存儲查詢邏輯。UNION 合併多個查詢結果集。兩者結合可解決字段不一致表的聯合查詢、大表分表聚合、權限隔離等經典問題。本文結合 phpMyAdmin 界面操作與 SQL 語法,全面講解實戰用法。
SELECT * FROM viewUNION ALL 將分表數據聚合為邏輯整表
CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
| 選項 | 含義 |
|---|---|
ALGORITHM=MERGE | 查詢視圖時,將視圖定義與外層查詢合併為單一 SQL 執行(預設) |
ALGORITHM=TEMPTABLE | 先將視圖結果物化為臨時表,再查詢臨時表 |
WITH CHECK OPTION | 更新視圖時需滿足視圖定義條件 |
CASCADED | 級聯檢查所有相關視圖條件(預設) |
LOCAL | 僅檢查當前視圖條件 |
-- 視圖定義
CREATE VIEW g2 AS SELECT goods_id, goods_name, shop_price FROM goods WHERE shop_price > 3000;
-- 外層查詢
SELECT * FROM g2 WHERE shop_price < 5000;
-- 實際執行(合併後)
SELECT goods_id, goods_name, shop_price FROM goods WHERE shop_price > 3000 AND shop_price < 5000;
優勢:可使用底表索引。劣勢:ORDER BY + GROUP BY 組合時語義可能不符預期。
CREATE ALGORITHM=TEMPTABLE VIEW lmj AS
SELECT cat_id, goods_id, goods_name, shop_price FROM goods ORDER BY cat_id, shop_price DESC;
-- 外層分組
SELECT * FROM lmj GROUP BY cat_id;
-- 能正確取得每組第一行(最貴商品)
適用場景:視圖內含 ORDER BY、LIMIT、聚合函數,外層需再次聚合/分組。
INSERT 視圖要求視圖包含所有無默認值的底表列SELECT 列數、順序、類型必須一致SELECT 列名為準UNION 去重(預設),UNION ALL 保留重複(性能更好)| 類型 | SQL | 結果行數 | 適用場景 |
|---|---|---|---|
| INNER JOIN | SELECT * FROM T1 INNER JOIN T2 ON T1.userid=T2.userid | 僅匹配行 | 雙方必須存在 |
| LEFT JOIN | SELECT * FROM T1 LEFT JOIN T2 ON T1.userid=T2.userid | 左表全量 + 匹配 | 主表為準,輔表可無 |
| RIGHT JOIN | SELECT * FROM T1 RIGHT JOIN T2 ON T1.userid=T2.userid | 右表全量 + 匹配 | 輔表為準 |
| FULL JOIN | SELECT * FROM T1 FULL JOIN T2 ON T1.userid=T2.userid | 全集合(MySQL 需用 UNION 模擬) | 雙向全量 |
-- 建立統一字段視圖
CREATE VIEW view_price AS SELECT id, name, price, 'price' AS type FROM price_table;
CREATE VIEW view_combo AS SELECT id, name, combo_price AS price, 'combo' AS type FROM combo_table;
-- 聯合查詢分頁
(SELECT * FROM view_price) UNION ALL (SELECT * FROM view_combo) LIMIT 1, 10;
-- 統計總數
SELECT COUNT(*) FROM ((SELECT * FROM view_price) UNION ALL (SELECT * FROM view_combo)) AS T;
UNION ALL,去重需求再用 UNIONALGORITHM=TEMPTABLE 避免合併語義錯誤ORDER BY/LIMIT 的子查詢請用括號包裹視圖與 UNION 是應對「業務邏輯複雜、底層結構多變」的利器,善用它們能讓 SQL 更乾淨、維護成本更低。