在SQL Server中,DISTINCT和GROUP BY都可以用于去重,但它们有不同的使用场景和特点:
DISTINCT(推荐用于简单去重)
适用场景:
-
简单的列去重
-
不需要聚合计算
-
代码可读性要求高
sql
-- 单列去重 SELECT DISTINCT department FROM employees; -- 多列组合去重 SELECT DISTINCT department, job_title FROM employees;
GROUP BY(推荐用于复杂场景)
适用场景:
-
需要同时进行聚合计算
-
需要分组统计
-
复杂的去重逻辑
sql
-- 去重并计数 SELECT department, COUNT(*) as emp_count FROM employees GROUP BY department; -- 去重并计算平均值 SELECT department, AVG(salary) as avg_salary FROM employees GROUP BY department;
性能对比
在大多数情况下,两者的性能相似,但有些细微差别:
sql
-- 测试性能 -- DISTINCT 方式 SELECT DISTINCT department, job_title FROM employees; -- GROUP BY 方式 SELECT department, job_title FROM employees GROUP BY department, job_title;
使用建议
推荐使用 DISTINCT 的情况:
sql
-- 简单去重 - 更直观 SELECT DISTINCT city FROM customers; -- 多列去重 SELECT DISTINCT first_name, last_name FROM users;
推荐使用 GROUP BY 的情况:
sql
-- 需要聚合函数
SELECT department,
COUNT(*) as total,
AVG(salary) as avg_salary
FROM employees
GROUP BY department;
-- 使用 HAVING 子句
SELECT category, COUNT(*) as product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 10;
特殊注意事项
-
NULL值处理:两者对NULL值的处理方式相同
-
执行计划:在简单去重时,SQL Server优化器可能生成相同的执行计划
-
索引利用:两者都能利用索引提高性能
最佳实践总结
-
简单去重 → 使用
DISTINCT(代码更清晰) -
需要聚合计算 → 使用
GROUP BY -
复杂业务逻辑 → 使用
GROUP BY -
不确定时 → 先用
DISTINCT,需要扩展时改为GROUP BY


4524

被折叠的 条评论
为什么被折叠?



