现有四张表格,分别是教师表、学生表、课程表和成绩表:
教师表:(t_id, t_name)-教室编号,教师姓名
表一 教师表
学生表:(s_id,s_name,s_birth,s_sex)-学生编号,学生姓名,出生日期,学生性别
表二 学生表
课程表:(c_id,c_name,ct_id)-课程编号,课程名称,教师编号
表三 课程表
成绩表:(s_id,c_id,s_score)-学生编号,课程编号,分数
表四 成绩表
根据以上信息按照要求写出对应的SQL语句。
一、建表
[建表并导入数据]
1.1、建立教师表语句,并进行相应的赋值
建立教师表语句
1.2、建立学生表语句,并进行相应的赋值
建立学生表语句
1.3、建立课程表语句,并进行相应的赋值
建立课程表语句
1.4、建立成绩表语句,并进行相应的赋值
建立成绩表语句
对应建表后的结果:
2.1、教师表运行结果
2.2、学生表运行结果
2.3、课程表运行结果
2.4、成绩表运行结果
二、根据以上建立的表格进行相关的数据分析
1、查询”0001″课程比”0002″课程成绩高的学生的信息及课程分数
解决思路:先查询出c_id分别为0001和0002的所有s_id和s_score作为内嵌视图A和B,通过筛选条件同时满足A分数大于B分数且A和B的s_id相同,MySQL语句如下:
运行结果:
2、查询平均成绩大于60分的同学的学生编号和学生姓名和平均成绩
解决思路:通过Score表格的s_id分组后即可求出所有学生的平均成绩,然后通过having子句过滤出平均分数大于60的s_id,MySQL语句如下:
运行结果:
3、查询所有学生的学号、姓名、选课数、总成绩
解决思路: 通过join on函数通s_id将学生表和成绩表联结,并用count和sum函数将学生的选课数和总成绩统计后通过group by函数整理出来,MySQL语句如下:
运行结果:
4、查询姓“张”的老师的个数
解决思路: 通过教师表进行模糊查询,MySQL语句如下:
运行结果:
5、查询学过“张三”老师所教的所有课的同学的学号、姓名
解决思路:可以通过教师表、课程表和成绩表的联结,通过distinct from语句查询出“张三”老师授课的学生的学号和姓名,MySQL语句如下:
运行结果:
6、查询没学过”张三”老师授课的学生的学号、姓名
解决思路: 在上题的基础上,先通过教师表、课程表和成绩表的联结,查询出“张三”老师授课的学生的学号和姓名,然后再运用not in来筛选出没有学过的学生学号和姓名,MySQL语句如下:
运行结果:
7、查询学过编号为“0001”的课程并且也学过编号为“0002”的课程的学生的学号、姓名
解决思路: 通过学生表student和成绩表score联结,运用内嵌exists语句将同时学习过0001和0002的学生学号和姓名筛选出来,MySQL语句如下:
运行结果:
8、查询课程编号为“0002”的总成绩
解决思路: 直接使用sum求和函数,将成绩表中课程编号0002的成绩进行汇总,MySQL语句如下:
运行结果:
9、查询所有课程成绩小于等于60分的学生的学号、姓名
解决思路: 使用内嵌将学生表和成绩表进行联结,并筛选出所有成绩大于60分的学生学号和姓名,再运用not in反向得到成绩小于等于60的学生学号和姓名,MySQL语句如下:
运行结果:
10、查询没有学全所有课的学生的学号、姓名
解决思路: 在学生表和成绩表中通过having子句筛选出每个学生学习课程数小于总课程数的学生学号和姓名,MySQL语句如下:
运行结果:
11、查询至少有一门课与学号为“0001”的学生所学课程相同的学生的学号和姓名
解决思路: 主要通过联结学生表和成绩表的内容进行查询,通过找出学号0001的所学课程,然后再将其它学号的学生学习课程与之匹配,即可查询出所需要的结果,MySQL语句如下:
运行结果:
12、查询和“0001”号同学所学课程完全相同的其他同学的学号
解决思路:主要通过联结学生表和成绩表的内容进行查询,通过找出学号0001的所学课程,然后再将其它学号的学生学习课程与之匹配,即可查询出所需要的结果,MySQL语句如下:
运行结果:
13、查询各科成绩最高和最低的分: 以如下的形式显示:课程ID,最高分,最低分
解决思路:使用到了重命名,将名称中文化,另外使用到了赋值和select内嵌select语句,MySQL语句如下:
运行结果:
14、按各科平均成绩从低到高和及格率的百分数从高到低排列,以如下形式显示:课程号课程名平均成绩及格百分数
解决思路:使用到了重命名列名,group by语句以及排序语句order by进行排序,MySQL语句如下:
运行结果:
15、查询不同老师所教不同课程平均分从高到低显示
解决思路: 主要对教师表、课程表和成绩表进行联结分析,并使用order by进行排序,MySQL语句如下:
运行结果:
16、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
解决思路: 条件语句的综合使用,MySQL语句如下:
运行结果:
17、查询学生平均成绩及其名次
解决思路: 比较复杂的排序问题,首先要解决成绩表中每个学生的平均成绩,裂化为成绩T1、T2进行判断,如果成绩对比大于所有成绩,那么对应的排序为第一,以此类推,第二、三,MySQL语句如下:
运行结果:
18、查询每门课程被选修的学生数
解决思路: 对课程表进行分析,并对课程的数量进行count汇总,MySQL语句如下:
运行结果:
19、查询出只选修了一门课程的全部学生的学号和姓名
解决思路: 对学生表和成绩表进行分析,运用count函数进行汇总,MySQL语句如下:
运行结果:
20、查询男生、女生人数
解决思路: 针对学生表分析,使用简单的语句select+group by+having即可解决,性别为准确查询,MySQL语句如下:
运行结果:
21、查询姓“李”的学生名单
解决思路: 简单模糊查询运用,使用like函数,MySQL语句如下:
运行结果:
22、查询同名同姓学生名单并统计同名人数
解决思路: 只需要对学生表进行分析即可得到结果,因此使用的语句select+group by+having, MySQL语句如下:
运行结果:
23、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
解决思路: 相应的数据要通过学生表和成绩表获知,因此使用的语句有select、group by和having子句,同时求平均数要使用avg 函数,MySQL语句如下:
运行结果:
24、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
解决思路: 只需要对成绩表进行分析,使用avg函数与order by进行排序,MySQL语句如下:
运行结果:
25、查询课程名称为“语文”且分数低于60的学生姓名和分数
解决思路: 相关数据需要通过学生表、课程表、成绩表来获取,因此要进行三表的关联,并通过ifnull(s_score,0)来取出相应的分数,MySQL语句如下:
运行结果:
26、查询所有学生的选课情况
解决思路: 对教师表、学生表、课程表进行关联分析,将课程表中的学生ID与学生表中的学生ID关联,将课程表汇总的课程名与成绩表中的课程名进行关联,最后得到相应的筛选结果,MySQL语句如下:
运行结果:
27、查询任何一门课程成绩在70分以上的学生学号、姓名、课程名称和分数
解决思路: 在学生表和成绩表中,筛选出分数大于70的学生学号、姓名,以及课程名称、分数,使用distinct语句,MySQL语句如下:
运行结果:
28、查询不及格的课程并按课程号从大到小排列
解决思路:使用select语句对成绩表中小于60分的课程筛选并使用order by排序, MySQL语句如下:
运行结果:
29、查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名
解决思路: 在成绩表和学生表中筛选出相应的分数大于80,且选修课程ID为0003的课程的学生学号和姓名,MySQL语句如下:
运行结果:
30、查询选了课程的学生人数
解决思路: 使用count函数对全部课程进行合计统计,MySQL语句如下:
运行结果:
31、查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩
解决思路: 分别要从四个表格中筛选出学生表中的学生姓名和成绩表中的成绩两列,要将四个表格中的相同列名进行判断,并筛选出教师姓名为“张三”的老师所教授的课程中分数最高的成绩,分数最高的成绩要在成绩表中筛选,过程利用到Max函数,MySQL语句如下:
运行结果:
32、查询各个课程及相应的选修人数
解决思路: 使用count函数对课程c_id进行统计,默认按照课程序号排列,MySQL语句如下:
运行结果:
33、查询有2门不同课程成绩相同的学生的学号、学生成绩
解决思路: 将score进行裂变a,b项后,进行成绩相同但是学号不同的并列想进行判断得出结果,MySQL语句如下:
运行结果:
34、统计每门课程的学生选修人数,要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号降序排序
解决思路: 对列名进行重命名,并使用order by语句进行desc降序排列,MySQL语句如下:
运行结果:
35、查询至少选修两门课程的学生学号
解决思路:通过select、group by、having语句的综合运用进行筛选,过程中要对课程数量进行count求和后,进行having的判断, MySQL语句如下:
运行结果:
36、查询全部学生都选修的课程的课程号和课程名
解决思路: 对课程表和成绩表进行综合筛选,运用select叠加语句,MySQL语句如下:
运行结果:
37、查询没学过“张三”老师讲授的任一门课程的学生姓名
解决思路: 对表格course、teacher、score三个表格进行关联,并筛选出姓名为“张三”老师所教授的学生姓名后,通过not in进行反向判断,MySQL语句如下:
运行结果:
38、查询两门以上不及格课程的同学的学号及其平均成绩
解决思路: 综合应用select、group by、having语句,包含嵌套使用,对成绩表中成绩小于60且数量大于2的学生统计出来后,再应用平均数avg使用ifnull(s_score,0)函数进行筛选后得到结果,MySQL语句如下:
运行结果:
39、检索课程编号为“0003”且分数小于60的学生学号,结果按按分数降序排列
解决思路: 综合应用select语句与order by排序语句,按照desc降序排列,MySQL语句如下:
运行结果:
40、删除学生编号为“0002”的课程编号为“0001”的成绩
解决思路: 使用delete语句进行Score表格中相应位置数据的处理,MySQL语句如下:
运行结果:
[完]