weixin_46087136 2022-03-15 22:02 采纳率: 75%
浏览 92
已结题

前几天遇到一个MySQL面试题

学生成绩表

CREATE TABLE `score` (
  `score_id` INT NOT NULL AUTO_INCREMENT COMMENT '分数id',
  `exam_time` DATETIME NOT NULL COMMENT '考试时间',
  `make_up` INT NOT NULL DEFAULT '0' COMMENT '是否补考',
  `course_num` INT NOT NULL COMMENT '课程id',
  `student_num` INT NOT NULL COMMENT '学生id',
  `score` INT NOT NULL COMMENT '分数',
  PRIMARY KEY (`score_id`),
  KEY `course_num` (`course_num`),
  KEY `student_num` (`student_num`),
  CONSTRAINT `score_ibfk_1` FOREIGN KEY (`course_num`) REFERENCES `course` (`course_num`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `score_ibfk_2` FOREIGN KEY (`student_num`) REFERENCES `student` (`student_num`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1 COMMENT='学生成绩表'

img

课程表

CREATE TABLE `course` (
  `course_num` INT NOT NULL COMMENT '课程号',
  `course_name` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '课程名',
  `course_hour` INT NOT NULL COMMENT '课程学时',
  `course_score` VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '课程学分',
  PRIMARY KEY (`course_num`),
  KEY `course_num` (`course_num`)
) ENGINE=INNODB DEFAULT CHARSET=latin1 COMMENT='课程信息表'

img

学生表

CREATE TABLE `student` (
  `student_num` INT NOT NULL COMMENT '学生学号',
  `student_name` VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名',
  `student_sex` VARCHAR(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '男' COMMENT '学生性别',
  `student_birthday` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生生日',
  PRIMARY KEY (`student_num`),
  KEY `student_num` (`student_num`)
) ENGINE=INNODB DEFAULT CHARSET=latin1 COMMENT='学生基本信息表'


img

现在是想获取以下表,获取四个学生的学生id、姓名、课程编号、最新成绩

img

想问一下大家怎么写查询语句,谢谢大家了

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-15 22:55
    关注

    mysql 8.0以上支持开窗函数,可以使用row_number进行分组排序

    select t.student_num,t.student_name,t.course_name,t.score from (
    select s.student_num,s.student_name,c.course_name,sc.score,
    row_number() over (partition by s.student_num,c.course_num order by exam_time desc) rn
     from score sc,course c,student s 
    where sc.course_num=c.course_num and sc.student_num=s.student_num
    ) t where rn=1
    

    由于你没说是否可能存在缺考的情况,我就没左关联了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 3月15日

悬赏问题

  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解