最近我在面试时,发现基本每个面试者都会写自己熟悉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(100) null comment '科目id',
score float null comment '学生分数',
row_state tinyint(1) default 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 (1, 1, 89, 1);
insert into student_score(student_id, subject_id, score, row_state) values (1, 2, 89, 1);
insert into student_score(student_id, subject_id, score, row_state) values (1, 3, 89, 1);
insert into student_score(student_id, subject_id, score, row_state) values (1, 4, 89, 1);
insert into student_score(student_id, subject_id, score, row_state) values (2, 1, 75, 1);
insert into student_score(student_id, subject_id, score, row_state) values (2, 2, 75, 1);
insert into student_score(student_id, subject_id, score, row_state) values (2, 3, 75, 1);
insert into student_score(student_id, subject_id, score, row_state) values (2, 4, 75, 1);
insert into student_score(student_id, subject_id, score, row_state) values (3, 1, 65, 1);
insert into student_score(student_id, subject_id, score, row_state) values (3, 2, 65, 1);
insert into student_score(student_id, subject_id, score, row_state) values (3, 3, 65, 1);
insert into student_score(student_id, subject_id, score, row_state) values (3, 4, 65, 1);
insert into student_score(student_id, subject_id, score, row_state) values (4, 1, 95, 1);
insert into student_score(student_id, subject_id, score, row_state) values (4, 2, 95, 1);
insert into student_score(student_id, subject_id, score, row_state) values (4, 3, 95, 1);
insert into student_score(student_id, subject_id, score, row_state) values (4, 4, 95, 1);
关卡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源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/zhouliwei1989/blog/4750879