UNION ALL
是一个简单的合并操作,适合将多个查询结果合并成一个结果集,而 WITH ROLLUP
是一个更复杂的聚合功能,通常用于生成分组小计和总计。
UNION ALL
和 WITH ROLLUP
是SQL中两个不同的功能,它们的用途和行为有显著区别:
UNION ALL
- 定义:
UNION ALL
是一个用于合并两个或多个SELECT
查询结果的运算符。 - 功能:它将多个查询的结果集合并成一个结果集,包括所有行,包括重复行。
- 性能:通常比
UNION
快,因为UNION
会去除重复行,而UNION ALL
不会。 - 用法:
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
- 输出:返回两个查询结果的合并,包括所有行,不进行去重。
WITH ROLLUP
- 定义:
WITH ROLLUP
是一个用于生成分组小计和总计的子句,通常与GROUP BY
一起使用。 - 功能:它会为每个分组级别生成一个额外的汇总行,包括小计和总计。
- 性能:可能会稍微影响查询性能,因为它需要进行额外的聚合计算。
- 用法:
SELECT department, employee, SUM(salary) AS total_salary
FROM employees
GROUP BY department, employee WITH ROLLUP;
- 输出:返回每个分组的汇总行,以及所有分组的总计行。
区别
特性 |
|
|
用途 |
合并多个查询结果 |
生成分组小计和总计 |
输出 |
包含所有行,包括重复行 |
包含分组小计和总计行 |
性能 |
通常较快 |
可能稍慢 |
适用场景 |
合并多个数据源的结果 |
生成报表,包含分组小计和总计 |
示例
假设有一个名为 sales
的表,包含以下数据:
department |
employee |
amount |
Sales |
Alice |
1000 |
Sales |
Bob |
1500 |
Marketing |
Charlie |
2000 |
Marketing |
Dana |
2500 |
使用 UNION ALL
SELECT department, employee, amount FROM sales WHERE department = 'Sales'
UNION ALL
SELECT department, employee, amount FROM sales WHERE department = 'Marketing';
输出:
department |
employee |
amount |
Sales |
Alice |
1000 |
Sales |
Bob |
1500 |
Marketing |
Charlie |
2000 |
Marketing |
Dana |
2500 |
使用 WITH ROLLUP
SELECT department, employee, SUM(amount) AS total_amount
FROM sales
GROUP BY department, employee WITH ROLLUP;
输出:
department |
employee |
total_amount |
Sales |
Alice |
1000 |
Sales |
Bob |
1500 |
Sales |
NULL |
2500 |
Marketing |
Charlie |
2000 |
Marketing |
Dana |
2500 |
Marketing |
NULL |
4500 |
NULL |
NULL |
7000 |
以上示例可以看出,UNION ALL
用于合并多个查询结果,而 WITH ROLLUP
用于生成分组小计和总计。选择使用哪一个取决于具体需求。