(感觉题号写反了,应该是(order by 题号 desc),做题怎么是由难到易了?)
1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
分析:确认学生的信息以及课程,其中条件为01课程比02课程的大,考虑用到外连接;其中01课程的学生编号和01课程的分数和02课程的学生编号和02课程的分数相比较;学生编号为连接基础
1.1 查询同时存在" 01 "课程和" 02 "课程的情况
分析:字面意思
1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
分析:看到这题用join,01课程 left join 02课程(展示01课程以及与02课程相同的字段,不同的字段默认为null)
1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
分析:not in的用法,不存在01课程的信息但存在02课程
2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
分析:将各个学生的平均成绩按照学生编号进行分组并判断分数大于等于60,查询学生编号姓名平均分数。
3. 查询在 SC 表存在成绩的学生信息
分析:确认条件为sc表中存在的学生,可以用in+条件来查询
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
分析:将学生编号进行分组,再用函数计算各个的选课总数和总成绩,最后查出学生编号,学生姓名
4.1 查有成绩的学生信息
分析:确认条件为sc表中存在的学生,所以sc.SId = student.SId
5.查询「李」姓老师的数量
分析:模糊查询 like
6.查询学过「张三」老师授课的同学的信息
分析:找到各表关联的相同信息,最后再将教师表中为张三的老师为最终条件
7.查询没有学全所有课程的同学的信息
分析:反向思维,先查出课程信息为全的学生编号并将成绩表中的课程类型的总和与课程表中的课程类型总和相比较,然后分别组成课程信息完全的学生编号组,最后全盘否定 not in
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
分析:将学号为01的同学的所有课程分出来,再将其中一门课程与其他学生的所有课程相比较,符合其中一条条件的同学打印出来。
9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
分析:首先找到名为张三的老师编号,再找到此编号对应的课程编号,通过已知的课程编号查找对应学生编号
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
分析:先查询出sc表中分数小于60的并以学生编号分组,然后having 小于60分的科目总数大于等于2的学生信息
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
分析:找到sc表中的01课程字段,并判断其是否小于60,联合前面把学生信息展示出来,并用order by score desc
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
分析:找到sc表,将所有课程的平均成绩计算出来,将学生进行分组
14.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
分析:考察 case when xxx then 1 else 2 end
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
分析:注意“保留名次空缺”意思是,相同分数并列一名,比这个分数低一位的为第三名不为第二名。
15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
分析:注意“合并名次”意思是,相同分数并列一名,比这个分数低一位的为第二名不为第三名。
count(distinct two.score)+1
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺
分析;将sc表中的不同学生的所有科目分数相加,并按照学生编号进行排序,在同一个表中自己与自己比较,分出排名
16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
分析:与上述相同,还是内连接不过条件改为不保留名次空缺,只需要加一个自表分数相同
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
分析:与14题相通
18.查询各科成绩前三名的记录
分析:算比自己分数大的记录有几条,如果小于3 就select,因为对前三名来说不会有3个及以上的分数比自己大了,最后再对所有select到的结果按照分数和课程编号排名即可
19.查询每门课程被选修的学生数
分析:先查询已选修课程的学生数量,再以课程号进行分组
20.查询出只选修两门课程的学生学号和姓名
分析:子查询
21.查询男生、女生人数
分析:找到性别、人数两个字段,统计不同性别的人数,当然需要男女两个性别,mysql中用in比较合适,最后以性别来进行分组
22.查询名字中含有「风」字的学生信息
分析:模糊查询,where sname like "%风"
23.查询同名同性学生名单,并统计同名人数
分析:对student表进行内连接,首先名字和性别要相同,其次学号不能相同
24.查询 1990 年出生的学生名单
分析:不会
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
分析:将课程分组并分别计算平均成绩,最后按照降序来排序
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
分析:先找出总分数的平均数,再找出平均数大于等85的,最后查询满足条件的学生信息
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
分析:先查找课程为数学的cid,再通过数学的cid来查询sc表中的数学成绩再来比较其是否小于60
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
分析:外连接,看代码吧
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
分析:先找到所有课程的分数,分出大于70分的,找到studen表和sc表中sid一样的学生
30.查询不及格的课程
分析:看代码吧
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
分析:联合查询,条件语句需要sid作为连接体,再根据题给出的条件写出来
32.求每门课程的学生人数
分析:核心为以课程号作为分组条件的变量
33.成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
分析:这题我用的是嵌套,先找到teacher表中名为张三的教师编号,再根据course中的的教师编号找到课程编号,再根据sc表找到学生编号,最后与student表找关系即可,当然嵌套易懂且分步理解起来简单,但套的多了找信息时容易看错,建议分行写嵌套,最好的方法是用连接
34.成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
分析:单行信息用 = ,多行信息用 in
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
分析:用自连接 inner join,其中只有课程编号不同
36.查询每门功课成绩最好的前两名
分析:要比较课程成绩,可以用sc表自己与自己比较,然后在根据sid,cid,score进行分组,不需要用到max函数,直接降序排序即可。
37.统计每门课程的学生选修人数(超过 5 人的课程才统计)
分析:以sc表中的课程号为分组的依据,分出不同课程学生的总数再来判断是否大于5
38.检索至少选修两门课程的学生学号
分析:先查找出所有学生选修的所有课程然后以学生编号为分组依据,再判断课程的总和是否大于等于2
39.查询选修了全部课程的学生信息
分析:跟38题差不多,只是以sc表中的sid与student表中的sid做联系,查多项用in。但注意in关键字后面的子查询只能返回一列数据
40.查询各学生的年龄,只按年份来算
分析:curdate()是musql中自带的日期函数,作用为只能返回当前系统的日期
41.按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
分析:timestampdiff(year, 生日, 当前日期)= 按照真实生日计算的周岁年龄
42.查询本周过生日的学生
分析:搞这么久以为一直是自己弄错了,问ai说没错,最后发现确实是没有本周过生日的学生
43.查询下周过生日的学生
分析:在当前系统日期(周)加个1
44.查询本月过生日的学生
分析:week改为month会吧
45.查询下月过生日的学生
分析:在month(curdate())后面加个1
相信你一定很好奇为什么没有"年“吧,自己去试试吧,当然你可以改改系统日期。