查询结果去重

56 阅读3分钟

描述

题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据。 示例:user_profile

iddevice_idgenderageuniversityprovince
12138male21北京大学Beijing
23214male复旦大学Shanghai
36543female20北京大学Beijing
42315female23浙江大学ZheJiang
55432male25山东大学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

image.png

group by

image.png

小结

为什么使用group by比distinct更有效率

使用group by比distinct更有效率的原因是,group by允许我们同时按照多个列进行聚合(对每组数据进行计算),而distinct只能对单个列进行聚合。在进行多列聚合时,可以减少重复的操作,从而提高效率。

在处理多列时,group by可能会涉及到更多的计算量,但是group by的优势在于group by的聚合方式是在一次扫描数据时完成的,而distinct则需要对数据进行多次扫描

例如,如果我们需要统计一年中每个月的总销售金额,使用group by可以同时按照年份和月份两个维度进行聚合,而distinct则需要先对年份去重,再对月份去重,这就导致了多次扫描数据,效率反而更低。

distinct应用场景

虽然在多数情况下,使用GROUP BY比DISTINCT更高效,但是在一些特殊情况下,使用distinct可能更为适合,例如:

  1. 当需要对一个非常大的数据集去重时,使用DISTINCT可能更高效,因为它不需要为每个分组计算聚合函数。
  2. 当需要去重的数据本身就已经排序好时,使用DISTINCT可能更高效,因为它只需要找到不同值的起始位置和结束位置,而不需要计算分组聚合。
  3. 当需要去重的数据只有少数几个不同的值时,使用DISTINCT也可能更高效,因为它只需要在查找到不同值后停止扫描,而不需要扫描整个数据集。

总的来说,如果需要对数据进行分组聚合,并且分组条件不止一个,或者需要多个聚合函数计算,那么使用GROUP BY会更为适合。

如果只需要去重,并且数据量极大,或者数据已经排序,或者数据集中只有少数几个不同值,那么使用DISTINCT可能更高效。