一道简单的mysql面试题—你能写出答案不?

丶灬走出姿态 提交于 2021-02-16 20:48:45

最近我在面试时,发现基本每个面试者都会写自己熟悉sql的使用,类似下面这种描述:

  • 熟悉MySQL的常规操作及MySQL数据库的优化方式
  • 维护公共数据库环境(oracle,Mysql,sqlserver等)
  • 熟练操作SQLserver 数据库,My Sql数据库对数据进行增、删、改、查,使用事务,存储对数据进行操作

所以,我现在每次都会出一道sql题目,考察下面试者是否真的掌握了sql语句。我将题目分享出来,大家可以看看自己是否能答的出来。

初始表

  • 假如有一张学生分数表,总共有3项:学号id、科目id、分数。我们先在本地创建个表,然后插入一些初始化数据

    create table if not exists student_score
    (
     id bigint auto_increment comment '主键'
      primary key,
     student_id bigint not null comment '学生id',
     subject_id varchar(100null comment '科目id',
     score float null comment '学生分数',
     row_state tinyint(1default 1 null comment '是否有效状态 1正常 0删除'
    )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 comment '学生分数表';

    insert into student_score(student_id, subject_id, score, row_state) values (11891);
    insert into student_score(student_id, subject_id, score, row_state) values (12891);
    insert into student_score(student_id, subject_id, score, row_state) values (13891);
    insert into student_score(student_id, subject_id, score, row_state) values (14891);
    insert into student_score(student_id, subject_id, score, row_state) values (21751);
    insert into student_score(student_id, subject_id, score, row_state) values (22751);
    insert into student_score(student_id, subject_id, score, row_state) values (23751);
    insert into student_score(student_id, subject_id, score, row_state) values (24751);
    insert into student_score(student_id, subject_id, score, row_state) values (31651);
    insert into student_score(student_id, subject_id, score, row_state) values (32651);
    insert into student_score(student_id, subject_id, score, row_state) values (33651);
    insert into student_score(student_id, subject_id, score, row_state) values (34651);
    insert into student_score(student_id, subject_id, score, row_state) values (41951);
    insert into student_score(student_id, subject_id, score, row_state) values (42951);
    insert into student_score(student_id, subject_id, score, row_state) values (43951);
    insert into student_score(student_id, subject_id, score, row_state) values (44951);

关卡1—写个sql获取总成绩排名前三的同学。

这个题目难度一般,只要对sql语句熟悉的人应该都能写出来,不过目前我面试的几个人里面,没有一个人能写的全面。大家有没有思路呢?可以先自己思考下,怎么写比较合适。

我这里提供一个思路,仅供参考:

select student_id, sum(score) sumScore
from student_score
group by student_id
order by sumScore DESC limit 3

关卡2—写个sql获取各科成绩的前3名。

如果面试者能闯过第一个关卡,那么这个题目还能变一下,怎么获取各科成绩的前3名。

这个题目,我考了考我们的开发,他想了好久也没给我最终的答案。

其实这里有个小陷阱,我也没能跳过去。这里只能给出我的一些建议:

1.整体思路是,先用科目进行分组,然后在每个分组中进行排序,取出前3名。
2. 如果是在mysql中,这道题没办法直接通过sql获取,因为mysql中没有对子集进行处理的函数,大概率需要通过写代码对结果集进行处理。
3. 但是如果面试者对oracle熟悉,那么这道题就可以通过sql实现。在oracle有对子集处理的函数sub partition,不过这个我没有验证(因为我对oracle不是特别熟悉),感兴趣的小伙伴可以尝试一下。

建议

大家平时求职时,如果简历中写到自己会mysql、sql语句时,还是需要恶补一下常规sql的写法的,最起码mysql中一些比较常用的函数最好能熟悉,有备无患嘛。


本文分享自微信公众号 - 软件测试布道师(FunnyTester)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!