HQL,SQL刷题,尚硅谷(初级)

目录

相关表数据:

题目及思路解析:

 查询结果排序&分组指定条件

1、查询学生的总成绩并按照总成绩降序排序

2、按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示 

3、查询一共参加三门课程且其中一门为语文课程的学生的id和姓名

总结归纳:

知识补充:


相关表数据:

1、student_info

2、course_info

3、score_info

题目及思路解析:

 查询结果排序&分组指定条件

1、查询学生的总成绩并按照总成绩降序排序

代码:

select
    stu_id,
    sum(score) total_score
from score_info
group by stu_id
order by total_score desc ;

思路分析:

首先进行分组,获取到每位学生的所有(参加考试的)课程的成绩,接着使用sum()函数求和,按照题目要求进行输出。

注:这里使用sum(),不可以用count(),因为count()求的是表的行数

结果:

2、按照如下格式显示学生的语文、数学、英语三科成绩,没有成绩的输出为0,按照学生的有效平均成绩降序显示 

输出显示 :学生id  语文    数学    英语   有效课程数      平均成绩

这里结果需要输出有效课程, 参加考试(在表中有成绩)的课程数

代码:

方法1:

Tips: 使用sum(if())函数判断

  select
      stu_id,
      sum(if(course_name='语文',score,0))  `语文`,
      sum(if(course_name='数学',score,0))  `数学`,
      sum(if(course_name='英语',score,0)) `英语`,
      count(*) `有效课程`,
      avg(score) `平均成绩`
  from score_info
  join course_info
  on score_info.course_id=course_info.course_id
  group by stu_id
  order by avg(score) desc;

思路:

首先在score_info表中进行按照stu_id分组,得到每位学生的所有(参加考试的)课程的成绩,接着join连接course_info表得到语文、数学、英语对应的course_id, 然后使用sum(if())输出三个课程的成绩,最后按照题目要求输出内容

注:

`count(*)即score_info表中的行数(即每个人有成绩的课程数)

`avg(score)即所有参考课程成绩的平均值 

`sum(if(a,b,c))即如果满足a条件则输出b(若b非空),否则输出c

方法2:

Tips: 使用nvl()函数判断

select
    t4.stu_id,
    nvl(t1.score,0) `语文`,
    nvl(t2.score,0) `数学`,
    nvl(t3.score,0) `英语`
from
(select
    stu_id,
    score
from score_info
where course_id='01'
)t1
full join

(select
    stu_id,
    score
from score_info
where course_id='02'
)t2
on t1.stu_id=t2.stu_id
full join
(select
    stu_id,
    score
from score_info
where course_id='03'
)t3
on nvl(t1.stu_id,t2.stu_id)=t3.stu_id
full join
(select
     stu_id,
    count(*) cnt,
    avg(score) avg_score
from score_info
group by stu_id
)t4
on coalesce(t1.stu_id,t2.stu_id,t3.stu_id)=t4.stu_id;

思路:

首先获取有语文,有数学,有英语成绩的学生,以及统计课程数查询,平均成绩查询,

接着通过stu_id进行满外连接,最后进行嵌套输出题目要求的内容

注:使用满外连接的原因

 因为题目要求输出三科的成绩,但可能存在只有其中某一科或两科成绩的学生,这样才能在最后按照要求输出三科成绩 

结果:

3、查询一共参加三门课程且其中一门为语文课程的学生的id和姓名

代码:

select
    t2.stu_id id,
    stu_name `姓名`
from
(
        select
        t1.stu_id
    from
        ( select
             stu_id,
             course_id
         from score_info
         where stu_id
         in (select
            stu_id
            from score_info
            join course_info
            on score_info.course_id=course_info.course_id
            where course_name='语文')
         )t1
    group by t1.stu_id
    having count(t1.course_id)=3
)t2
join student_info
on t2.stu_id=student_info.stu_id;

思路:

本题主要是嵌套查询,首先查询在score_info表中有语文成绩的(即course_id为语文的course_id(需join连接course_info表获取))学生,接着在上面基础上,查询有成绩的课程数为3的学生,最后join连接student_info表输出学生id与name

结果:

总结归纳:

以上题主要考察了聚合函数使用,嵌套子查询,分组聚合,结果排序,join连接的使用等 

知识补充:

1、在dataGrip中使用中文别名需要键盘左上角的反单引号(即波浪线下面的小点)

2、sum(if(a,b,c))即如果满足a条件则输出b(若b非空),否则输出c

3、

 nvl(a,b),若a为空则判断b,   nvl()与mysql中的 if not逻辑类似,可嵌套,有两个参数

coalesce(a,b,c...)相当于增强版的nvl函数,与nvl不同的是,coalesce可有多个参数

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值