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

前几天遇到一个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 画CAD几张图片内容如下1111111111111111111111111111111111111111111
  • ¥15 基于python的电影系统推荐
  • ¥20 springmvc重定向和返回json
  • ¥15 数学建模——参会安排怎么做
  • ¥15 电脑键盘实现触摸功能
  • ¥25 matlab无法将表达式转换为双数组怎么解决?
  • ¥15 单片机汇编语言相关程序
  • ¥20 家用射频美容仪技术规格
  • ¥15 大家帮我看看为什么错了
  • ¥15 unity互动琴弦抖动效果