牛客网-刷SQL(10)

题目:现在运营想要找到每个学校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语句的执行顺序如下:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. 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

你可能感兴趣的:(JAVA常用SQL,sql,算法,数据库)