一、引言
在日常開發中,我們經常需要從多個表或多個查詢中整合數據。SQL 中的組合查詢(Combination Query)提供了一種靈活且強大的方式,幫助我們高效地處理這些需求。本文將詳細講解 SQL 中常見的組合查詢,包括 UNION
、UNION ALL
、INTERSECT
和 EXCEPT
,并通過實例幫助讀者掌握其使用方法。
什么是組合查詢?
組合查詢是一種將多個查詢結果集合并到一起的技術。它可以用于合并數據、過濾數據或靈活地構建復雜查詢。
使用場景
二、組合查詢的基本語法
1. UNION
UNION
用于合并兩個查詢結果集,同時去除重復數據。
語法
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
示例
-- 查詢來自兩個表的用戶姓名
SELECT name FROM users_2023
UNION
SELECT name FROM users_2024;
2. UNION ALL
UNION ALL
與 UNION
類似,但不會去除重復數據。
語法
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
示例
-- 查詢兩個表的所有用戶名,包括重復值
SELECT name FROM users_2023
UNION ALL
SELECT name FROM users_2024;
3. INTERSECT
INTERSECT
用于獲取兩個查詢結果集的交集。
語法
SELECT column1, column2 FROM table1
INTERSECT
SELECT column1, column2 FROM table2;
示例
-- 查詢兩個表中共同的用戶名
SELECT name FROM users_2023
INTERSECT
SELECT name FROM users_2024;
4. EXCEPT
EXCEPT
用于獲取第一個查詢結果集中存在但第二個結果集中不存在的數據(差集)。
語法
SELECT column1, column2 FROM table1
EXCEPT
SELECT column1, column2 FROM table2;
示例
-- 查詢存在于 users_2023 表中但不存在于 users_2024 表中的用戶名
SELECT name FROM users_2023
EXCEPT
SELECT name FROM users_2024;
?注意:INTERSECT
和 EXCEPT
并非所有數據庫都支持,使用前需檢查數據庫兼容性。
三、組合查詢的使用要點
1. 列數與列類型一致
組合查詢的所有子查詢必須選擇相同數量的列,且列的數據類型需要兼容。
示例
-- 錯誤示例:列數不一致
SELECT name FROM users_2023
UNION
SELECT name, email FROM users_2024;
-- 正確示例:
SELECT name, 'N/A' AS email FROM users_2023
UNION
SELECT name, email FROM users_2024;
2. 排序與分頁
組合查詢結果可以通過 ORDER BY
排序,也可以使用 LIMIT
或 OFFSET
實現分頁。
示例
-- 合并兩個表的用戶名,并按字母排序
SELECT name FROM users_2023
UNION
SELECT name FROM users_2024
ORDER BY name ASC;
3. NULL 值的處理
組合查詢中的 NULL
值會按數據庫的默認規則處理,需注意結果中的空值。
四、性能優化
1. 優先使用 UNION ALL
當確定結果集中不需要去重時,使用 UNION ALL
替代 UNION
可以提升性能。
示例
-- 性能優化:使用 UNION ALL 避免去重開銷
SELECT name FROM users_2023
UNION ALL
SELECT name FROM users_2024;
2. 優化子查詢
確保子查詢的條件過濾、索引使用合理,減少中間結果集的大小。
示例
-- 在子查詢中添加過濾條件
SELECT name FROM users_2023 WHERE active = 1
UNION
SELECT name FROM users_2024 WHERE active = 1;
五、實踐案例
案例一:合并用戶數據
需求
從兩張用戶表中合并所有用戶數據,并去除重復。
示例代碼
SELECT user_id, name, email FROM users_2023
UNION
SELECT user_id, name, email FROM users_2024;
案例二:獲取交集數據
需求
找出兩張訂單表中共同的商品 ID。
示例代碼
SELECT product_id FROM orders_2023
INTERSECT
SELECT product_id FROM orders_2024;
案例三:計算差集
需求
找出存在于所有商品表中但未出售的商品。
示例代碼
SELECT product_id FROM products_all
EXCEPT
SELECT product_id FROM products_sold;
結語
- 組合查詢是 SQL 中的重要工具,能高效地整合和處理多個結果集。
- 熟練掌握
UNION
、UNION ALL
、INTERSECT
和 EXCEPT
的語法和使用場景,有助于構建更靈活的查詢邏輯。 - 優化性能 是實際應用中的關鍵,可以通過減少去重操作和優化子查詢實現更高效的查詢。
閱讀原文:原文鏈接
該文章在 2025/1/11 18:22:42 編輯過