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

前几天遇到一个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 封装的 matplotlib animation 不显示图像
  • ¥15 python摄像头画面无法显示
  • ¥15 关于#3d#的问题:d标定算法(语言-python)
  • ¥15 cve,cnnvd漏洞扫描工具推荐
  • ¥15 图像超分real-esrgan网络自己训练模型遇到问题
  • ¥15 如何构建全国统一的物流管理平台?
  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错