引言
在SQL查询中,GROUP BY和DISTINCT都是常用的关键字,它们都能实现数据去重的功能。但它们的实现原理和使用场景有很大的区别。
基本概念
DISTINCT
DISTINCT用于删除结果集中的重复行,确保每个结果只出现一次。它作用于整个选择的列组合。
GROUP BY
GROUP BY用于将具有相同值的行组合到汇总行中,通常与聚合函数(如COUNT、SUM、AVG等)一起使用。
实际案例分析
让我们通过一个具体的案例来理解它们的区别。假设我们有一个订单表(orders):
CREATE TABLE orders (
order_id INT,
customer_id INT,
product_id INT,
amount DECIMAL(10,2),
order_date DATE
);
INSERT INTO orders VALUES
(1, 101, 1, 100.00, '2024-02-14'),
(2, 101, 2, 200.00, '2024-02-14'),
(3, 102, 1, 150.00, '2024-02-14'),
(4, 101, 1, 300.00, '2024-02-15');
使用DISTINCT的场景
如果我们想查看有哪些客户下过订单:
SELECT DISTINCT customer_id
FROM orders;
-- 结果
customer_id
-----------
101
102
这个查询会直接返回去重后的客户ID列表。
使用GROUP BY的场景
如果我们想知道每个客户的订单总金额:
SELECT customer_id,
COUNT(*) as order_count,
SUM(amount) as total_amount
FROM orders
GROUP BY customer_id;
-- 结果
customer_id order_count total_amount
----------- ----------- ------------
101 3 600.00
102 1 150.00
GROUP BY不仅去除了重复,还能进行数据汇总计算。
主要区别
- DISTINCT:对整个结果集进行去重,通常需要排序操作
- GROUP BY:在分组的同时进行计算,可能涉及临时表的创建
- DISTINCT:不能与聚合函数直接配合使用(除特殊情况外)
- GROUP BY:可以配合多种聚合函数,支持复杂的分组计算
总结
DISTINCT和GROUP BY虽然都能实现去重,但它们的使用场景和功能特点有明显区别。
DISTINCT适合简单的去重场景,而GROUP BY更适合需要分组统计的场景。
合理使用索引和优化查询语句,可以显著提升查询性能。
阅读原文:原文链接
该文章在 2025/2/17 12:25:44 编辑过