mysql语句训练_mysql查询语句训练

mysql查询练习题:用到了group by,case when

Part 1

学生表

成绩表

3d9b8eaf1a13a2e9ceddddb70b0f6a59.png

1.查询所有学生的数学成绩,显示学生姓名name, 分数, 由高到低

$select s.name,g.score from student,grade where s.id=g.id and kemu=math;

cb4419402585f0343712cb43a4945fe0.png

2.统计每个学生的总成绩,显示字段:姓名,总成绩

$select s.name,sum(score) from student s,grade g where s.id=g.id group by name;

15742cd928a683919b58821d534475d4.png

3.统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生id,姓名,总成绩

select s.id,s,name,sum(g.score) from student s,grade g where s.id=g.id group by id;

66318041dabc647d38c43cecb46d4162.png

4.列出各门课程成绩最好的学生, 要求显示字段: 学号,姓名,科目,成绩

SELECT c.id,a.name, c.kemu, c.score FROM grade c,student a,

(SELECT b.kemu, MAX(b.score) as max_score FROM grade b GROUP BY kemu) t WHERE c.kemu = t.kemu AND c.score = t.max_score AND a.id = c.id;

840eea444171a08626f90240718b2bc9.png

Part02

学生表

91465f884e78bfba3f8888494fb3056a.png

成绩表

3feec45bb5e7a425af5d3eb560e264f2.png

5.计算学生平均分数:计算每个人的平均成绩, 要求显示字段: 学号,姓名,平均成绩

$select s.id,s.name,avg(g.score) from student s ,grade g where s.id=g.id group by s.id;

addba9106df7232366a629d69d4356be.png

6.统计各科目成绩:计算每个人的成绩,总分数,平均分,要求显示:学号,姓名,语文,数学,英语,总分,平均分

#这里涉及的新知识为:case when以及sum(case when),延伸包含count (case when)

使用case when 语法把科目字段分解成具体的科目:语文,数学, 英语

不加sum(case when):统计的还是每一行记录

$select s.id as 学号,s.name as 姓名,(case when g.kemu='语文' then score else 0 end) as

语文,(case when g.kemu='数学' then score else 0 end) as 数学,(case when g.kemu='英语' then

score else 0 end) as 英语 from student s,grade g where s.id=g.id;

4cb32d0dbf6f550affab9911171b68de.png

加sum (case when),对应的要加group by按照人员分组,然后统计每一门的成绩

$select s.id as 学号,s.name as 姓名,sum(case when g.kemu='语文' then score else 0 end) as

语文,sum(case when g.kemu='数学' then score else 0 end) as 数学,sum(case when g.kemu='英语' then

score else 0 end) as 英语 from student s,grade g where s.id=g.id group by s.id;

bcfc2508c604758ba950182aab75ae2e.png

tip :如果成绩表中有相同的两条记录时,比如一个学生考了语文两次的成绩,那么sun (case when)统计一个学生各个课程的成绩就会有问题了,如下图

整条查询要求对应的sql语句:

$SELECT a.id as 学号, a.name as 姓名,

sum(case when b.kemu='语文' then score else 0 end) as 语文,

sum(case when b.kemu='数学' then score else 0 end) as 数学,

sum(case when b.kemu='英语' then score else 0 end) as 英语,

sum(b.score) as 总分 , avg(b.score) as 平均分

FROM student a, grade b

where a.id = b.id GROUP BY b.id, b.id

7.每门课程平均成绩:列出各门课程的平均成绩,要求显示字段:课程,平均成绩

$select kemu,avg(score) from grade group by kemu;

8.成绩排名:列出数学成绩的排名, 要求显示字段:学号,姓名,成绩,排名

#在统计排名时,用到一个自增变量的写法,注意!

$select s.id,s.name,g.score,@paiming :=@paiming +1

from student s,grade g,(select @paiming:=0) r

where s.id=g.id and g.kemu='数学' order by g.score desc ;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值