10-65 查询课程成绩最高二人

分数 10

全屏浏览题目

切换布局

作者 张庆

单位 集美大学

本题目要求编写SQL语句,
检索C002号课程的成绩最高的二人学号,姓名与成绩

表结构:

请在这里写定义表结构的SQL语句。例如:

CREATE TABLE `stu` (
  `sno` char(4) NOT NULL,
  `sname` char(8) NOT NULL,
  `sex` tinyint(1) DEFAULT NULL,
  `mno` char(2) DEFAULT NULL,
  `birdate` datetime DEFAULT NULL,
  `memo` text,
  PRIMARY KEY (`sno`),
);

CREATE TABLE `sc` (
  `sno` char(4) NOT NULL,
  `cno` char(4) NOT NULL,
  `grade` decimal(6,1) DEFAULT NULL,
  PRIMARY KEY (`sno`,`cno`),
  CONSTRAINT `fk_sc_sno` FOREIGN KEY (`sno`) REFERENCES `stu` (`sno`)
);

表样例

请在这里给出上述表结构对应的表样例。例如

stu表:

sc表:

输出样例:

请在这里给出输出样例。例如:

select stu.sno,stu.sname,sc.grade from stu 
join sc on
stu.sno=sc.sno
and sc.cno='C002'
group by sno
order by grade desc
limit 2

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是两种用C语言解决这个问题的方法: 方法一: ```c #include <stdio.h> #include <string.h> #define NUM_STUDENTS 10 #define NUM_COURSES 3 struct Student { char id[10]; char name[20]; int scores[NUM_COURSES]; }; int main() { struct Student students[NUM_STUDENTS]; int total_scores[NUM_COURSES] = {0}; float max_average_score = 0.0; struct Student max_student; // 输入学生信息 printf("请输入10个学生的信息:\n"); for (int i = 0; i < NUM_STUDENTS; i++) { printf("请输入第%d个学生的学号、姓名、三门课程成绩,中间用空格隔开:\n", i+1); scanf("%s %s %d %d %d", students[i].id, students[i].name, &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]); // 计算总成绩 for (int j = 0; j < NUM_COURSES; j++) { total_scores[j] += students[i].scores[j]; } // 计算平均成绩 float average_score = (students[i].scores[0] + students[i].scores[1] + students[i].scores[2]) / 3.0; // 更新最高平均成绩的学生信息 if (average_score > max_average_score) { max_average_score = average_score; strcpy(max_student.id, students[i].id); strcpy(max_student.name, students[i].name); max_student.scores[0] = students[i].scores[0]; max_student.scores[1] = students[i].scores[1]; max_student.scores[2] = students[i].scores[2]; } } // 计算平均成绩 float average_scores[NUM_COURSES]; for (int i = 0; i < NUM_COURSES; i++) { average_scores[i] = total_scores[i] / (float)NUM_STUDENTS; } // 输出结果 printf("三门课程的总平均成绩为:%.2f %.2f %.2f\n", average_scores[0], average_scores[1], average_scores[2]); printf("最高分的学生信息为:\n"); printf("学号:%s\n", max_student.id); printf("姓名:%s\n", max_student.name); printf("三门课程成绩:%d %d %d\n", max_student.scores[0], max_student.scores[1], max_student.scores[2]); printf("平均分数:%.2f\n", max_average_score); return 0; } ``` 方法二: ```c #include <stdio.h> #include <string.h> #define NUM_STUDENTS 10 #define NUM_COURSES 3 struct Student { char id[10]; char name[20]; int scores[NUM_COURSES]; }; int main() { struct Student students[NUM_STUDENTS]; int total_scores[NUM_COURSES] = {0}; float max_average_score = 0.0; int max_student_index = 0; // 输入学生信息 printf("请输入10个学生的信息:\n"); for (int i = 0; i < NUM_STUDENTS; i++) { printf("请输入第%d个学生的学号、姓名、三门课程成绩,中间用空格隔开:\n", i+1); scanf("%s %s %d %d %d", students[i].id, students[i].name, &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]); // 计算总成绩 for (int j = 0; j < NUM_COURSES; j++) { total_scores[j] += students[i].scores[j]; } } // 计算平均成绩 float average_scores[NUM_COURSES]; for (int i = 0; i < NUM_COURSES; i++) { average_scores[i] = total_scores[i] / (float)NUM_STUDENTS; } // 找出最高平均成绩的学生 for (int i = 0; i < NUM_STUDENTS; i++) { float average_score = (students[i].scores[0] + students[i].scores[1] + students[i].scores[2]) / 3.0; if (average_score > max_average_score) { max_average_score = average_score; max_student_index = i; } } // 输出结果 printf("三门课程的总平均成绩为:%.2f %.2f %.2f\n", average_scores[0], average_scores[1], average_scores[2]); printf("最高分的学生信息为:\n"); printf("学号:%s\n", students[max_student_index].id); printf("姓名:%s\n", students[max_student_index].name); printf("三门课程成绩:%d %d %d\n", students[max_student_index].scores[0], students[max_student_index].scores[1], students[max_student_index].scores[2]); printf("平均分数:%.2f\n", max_average_score); return 0; } ``` 以上两种方法分别采用了不同的思路来解决这个问题,其中方法一在输入学生信息的同时,就计算出了每个学生的平均成绩,然后再找出最高平均成绩的学生;而方法二先输入所有学生的信息,然后再遍历所有学生,计算出每个学生的平均成绩,最后找出最高平均成绩的学生。虽然实现的思路不同,但都能得出正确的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@pon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值