SQL集合运算包括UNION、UNION ALL、INTERSECT和EXCEPT,它们用于合并多个查询结果集,帮助处理数据混乱问题。使用UNION去除重复行,提升查询准确性;UNION ALL保留所有行,提高效率;INTERSECT取交集,EXCEPT取差集。示例:SELECT name FROM table1 UNION SELECT name FROM table2; 这能快速整合数据,避免手动JOIN带来的混乱和低效。
UNION与UNION ALL的区别
UNION 会对结果去重,需要排序和比较,消耗较多资源;UNION ALL 不去重,直接拼接,速度更快。日常查询中,如果不需要去重,优先UNION ALL,能显著提升效率。实际案例:在用户日志表和订单表合并时,用UNION ALL避免了多余排序,查询时间从5秒降到0.5秒。
INTERSECT和EXCEPT的应用
INTERSECT返回两个查询的公共部分,比如找出两张表共同的用户ID:SELECT id FROM users1 INTERSECT SELECT id FROM users2。EXCEPT返回第一个查询独有的部分,如SELECT product FROM sales1 EXCEPT SELECT product FROM sales2,找出仅在sales1销售的产品。这些运算让数据对比更直观,告别手动过滤的混乱。
集合运算的注意事项
所有参与集合运算的SELECT列数和数据类型必须一致,否则报错。列别名不影响运算,但为了可读性建议统一。排序用ORDER BY放在最外层,只对最终结果生效。多表集合运算常用于数据去重、审计对比,提升整体查询准确性。
实际场景:数据清洗与合并
在电商平台,从多个数据源合并商品信息:SELECT * FROM products_a UNION ALL SELECT * FROM products_b WHERE status='active'; 这避免了数据重复导入导致的混乱,同时保持高效率。结合子查询,能处理更复杂场景,如排除已删除记录。
性能优化技巧
优先UNION ALL减少开销;确保索引覆盖运算列;小表在前,大表在后。测试中,UNION ALL比UNION快3-10倍,尤其大数据量时。避免在集合运算中嵌套过多子查询,以防效率低下。
FAQ
Q: UNION和UNION ALL什么时候用?
A: 需要去重用UNION,不需要用UNION ALL,后者更快。
Q: INTERSECT在MySQL中支持吗?
A: MySQL 8.0+支持,旧版需用临时表模拟,如SELECT * FROM t1 WHERE id IN (SELECT id FROM t2)。
Q: 集合运算能处理NULL值吗?
A: 是的,NULL视作相等参与运算,但UNION会去重NULL行。
Q: 怎么提升集合运算速度?
A: 用UNION ALL,加索引,避免不必要排序。