描述
题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据。 示例:user_profile
| id | device_id | gender | age | university | province |
|---|---|---|---|---|---|
| 1 | 2138 | male | 21 | 北京大学 | Beijing |
| 2 | 3214 | male | 复旦大学 | Shanghai | |
| 3 | 6543 | female | 20 | 北京大学 | Beijing |
| 4 | 2315 | female | 23 | 浙江大学 | ZheJiang |
| 5 | 5432 | male | 25 | 山东大学 | Shandong |
根据示例,你的查询应返回以下结果:
| university |
|---|
| 北京大学 |
| 复旦大学 |
| 浙江大学 |
| 山东大学 |
示例1
输入:
drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`province` varchar(32) NOT NULL);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学','BeiJing');
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学','Shanghai');
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学','BeiJing');
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学','ZheJiang');
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学','Shandong');
输出:
北京大学
复旦大学
浙江大学
山东大学
题解
distinct
group by
小结
为什么使用group by比distinct更有效率
使用group by比distinct更有效率的原因是,group by允许我们同时按照多个列进行聚合(对每组数据进行计算),而distinct只能对单个列进行聚合。在进行多列聚合时,可以减少重复的操作,从而提高效率。
在处理多列时,group by可能会涉及到更多的计算量,但是group by的优势在于group by的聚合方式是在一次扫描数据时完成的,而distinct则需要对数据进行多次扫描。
例如,如果我们需要统计一年中每个月的总销售金额,使用group by可以同时按照年份和月份两个维度进行聚合,而distinct则需要先对年份去重,再对月份去重,这就导致了多次扫描数据,效率反而更低。
distinct应用场景
虽然在多数情况下,使用GROUP BY比DISTINCT更高效,但是在一些特殊情况下,使用distinct可能更为适合,例如:
- 当需要对一个
非常大的数据集去重时,使用DISTINCT可能更高效,因为它不需要为每个分组计算聚合函数。 - 当需要去重的数据
本身就已经排序好时,使用DISTINCT可能更高效,因为它只需要找到不同值的起始位置和结束位置,而不需要计算分组聚合。 - 当需要去重的数据只有
少数几个不同的值时,使用DISTINCT也可能更高效,因为它只需要在查找到不同值后停止扫描,而不需要扫描整个数据集。
总的来说,如果需要对数据进行分组聚合,并且分组条件不止一个,或者需要多个聚合函数计算,那么使用GROUP BY会更为适合。
如果只需要去重,并且数据量极大,或者数据已经排序,或者数据集中只有少数几个不同值,那么使用DISTINCT可能更高效。