题目:现在运营想要找到每个学校gpa最低的同学来做调研,请你取出每个学校的最低gpa。
示例:user_profile
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
---|---|---|---|---|---|---|---|---|
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | female | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
根据示例,你的查询结果应参考以下格式,输出结果按university升序排序:
device_id | university | gpa |
---|---|---|
6543 | 北京大学 | 3.2000 |
4321 | 复旦大学 | 3.6000 |
2131 | 山东大学 | 3.3000 |
2315 | 浙江大学 | 3.6000 |
解题思路:
找到每个学校gpa最低的同学
- 学校分组、使用min()函数
- 第一步查最小值
- 第二步用最小值作为条件,查询出其他字段
- 三步添加排序关键字order by
select device_id , university , gpa
from user_profile
where gpa in (
select min(gpa) from user_profile
group by university
)
order by university
SQL语句的执行顺序如下:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
这个顺序中,所有的查询语句都是从FROM开始执行的。在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。
错误sql分析如下:
select device_id,university,min(gpa) gpa
from user_profile
group by university
这段错误diamante主要错在 device_id与最小gpa的device_id对不上
分析:
首选根据上面的sql执行顺序可知:
先执行from,在执行group by 有去重和剔除null的作用(这里分组之后会出现下面这个现象,只会查出表中出现在前面的university,重复的并不会查出来),在执行select 在执行 min 最后会发现,device_id 对应不上。
2138 male 21 北京大学 3.4 7 2 12
3214 male 复旦大学 4 15 5 25
5432 male 25 山东大学 3.8 20 15 70
2315 female 23 浙江大学 3.6 5 1 2