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日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵