union是mysql中用于合并多個select查詢結果集的操作符,要求各查詢列數和數據類型一致,默認自動去重,使用union all可保留重復記錄;其常見場景包括:1.合并結構相似的不同表數據,如分表存儲的訂單信息;2.統一展示多類別內容,如論壇帖子、評論與回復的時間線;3.構造虛擬數據輔助分析或測試;使用時需注意字段數量順序一致、類型匹配、性能優化及排序僅在最后使用。
在mysql中,UNION 是一個非常實用的操作符,用于合并兩個或多個 SELECT 查詢的結果集。它不僅能讓查詢結構更清晰,還能幫助我們從不同表中提取相似數據并整合輸出。
什么是UNION?
簡單來說,UNION 可以把多個結構相似的查詢結果“拼接”在一起,形成一個統一的結果集。但需要注意的是,每個 SELECT 語句中的列數和數據類型必須一致(或者兼容),否則會報錯。
UNION的基本用法
基本語法如下:
SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2;
默認情況下,UNION 會自動去重,只保留唯一值。如果你希望保留重復記錄,可以使用 UNION ALL。
比如你有兩個用戶表:users_vip 和 users_regular,它們都有 id 和 name 字段,想查出所有用戶的姓名,就可以這樣寫:
SELECT name FROM users_vip UNION SELECT name FROM users_regular;
這樣就能得到一個不重復的用戶名單了。
使用UNION的常見場景
場景一:合并來自不同表的數據
當你的數據分散在多個結構相同或類似的表中時,可以用 UNION 來統一查詢。例如訂單系統中,可能有按月份分表的歷史訂單數據,如 orders_202401, orders_202402 等,這時可以通過 UNION 把這些表合并查詢。
SELECT order_id, amount FROM orders_202401 UNION ALL SELECT order_id, amount FROM orders_202402;
注意:這種情況下一般使用 UNION ALL,因為每個子表之間不會有重復數據,不需要去重,效率更高。
場景二:統一展示多類別的信息
假設你有一個論壇系統,里面有帖子、評論、回復三種內容類型,分別存在不同的表里,但都包含 content 和 created_at 字段。你可以通過 UNION 把這三類內容合并展示為一個時間線:
SELECT content, created_at FROM posts UNION SELECT comment_text AS content, created_at FROM comments UNION SELECT reply_text AS content, created_at FROM replies ORDER BY created_at DESC;
這樣就得到了一個混合的時間線展示。
場景三:構造虛擬數據輔助分析
有時候為了做統計或測試,需要手動構造一些數據,也可以結合 UNION 實現:
SELECT '北京' AS city, 2154 AS population UNION SELECT '上海', 2415 UNION SELECT '廣州', 1490;
這樣可以直接生成一個城市人口的小數據集,方便后續處理。
使用UNION時需要注意的地方
-
字段數量和順序要一致
每個 SELECT 的字段數量必須相同,且順序最好一致,否則可能會出現數據錯位。 -
字段類型盡量匹配
雖然MySQL允許一定程度上的隱式轉換,但為了準確性,建議字段類型保持一致或兼容。 -
性能問題
UNION 默認去重,如果數據量很大,會影響性能。這時候如果確認沒有重復,或者不關心是否重復,應優先使用 UNION ALL。 -
排序放在最后
如果你要對整個結果集排序,ORDER BY 只能出現在最后一個 SELECT 后面。
小結
總的來說,UNION 在需要合并多個查詢結果的時候非常好用,特別是在數據來源多樣但結構相似的情況下。只要注意字段匹配、性能優化和合理使用 UNION ALL,就能寫出既簡潔又高效的sql語句。
基本上就這些,用得多了自然就熟練了。