首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【面试必备】这道MySQL面试题难住了90%的程序员。。。

【面试必备】这道MySQL面试题难住了90%的程序员。。。

作者头像
码农编程进阶笔记
发布于 2021-07-20 07:45:21
发布于 2021-07-20 07:45:21
42300
代码可运行
举报
运行总次数:0
代码可运行

问题:某游戏使用mysql数据库,数据表 scores 记录用户得分历史,uid 代表用户ID, score 表示分数, date 表示日期,每个用户每天都会产生多条记录。

数据结构以及数据行如下:

uid int(11)

score int(11)

date date

1

2

2019-02-28

1

3

2019-03-02

3

2

2019-03-17

3

1

2019-03-17

3

2

2019-03-17

4

3

2019-03-25

3

5

2019-03-27

...

...

...

现在需要一份用户列表,这些用户在2019年3月份的31天中,至少要有16天,每天得分总和大于40分。使用一条sql语句表示。

思路

重新梳理需求,画出重点。

现在需要一份用户列表,这些用户在2019年3月份的31天中至少要有16天每天得分总和大于40分。使用一条sql语句表示。

用户列表 代表一个不重复的 uid 列表,可使用 DISTINCT uidGROUP BY uid 来实现。

在2019年3月份的31天中 使用 where 语句限定时间范围。

至少要有16天 需要对天 date 进行聚合,使用聚合函数 COUNT(*) > 15来进行判断。

(每人)每天得分总和大于40 需要对每天分数 score 分数进行聚合,使用聚合函数对 SUM(score) > 40来进行判断。

此处有2处聚合函数,但是是针对不同维度的(天和每天里的分数),所以需要使用子查询,将2处聚合分别放置在内外层的sql语句上。

由“从内到外”的原则,我们先对每天的得分进行聚合,那就是对天进行聚合。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--20173月份的31天中
select * from scores where `date` >= '2019-03-01' and `date` <= '2019-03-31';


-- (每人)每天得分总和大于40
-- 使用 group by uid,date 实现对分数进行聚合,使用 having  sum() 过滤结果
select uid,date from scores where `date` >= '2019-03-01' and `date` <= '2019-03-31' group by uid, `date` having sum(score) > 40;

-- 至少要有16-- 以上条结果为基础,在对 group by uid 实现对天进行聚合,使用 having  count() 过滤结果
select uid from (
    select uid,date from scores where `date` >= '2019-03-01' and `date` <= '2019-03-31' group by uid, `date` having sum(score) > 40
) group by uid having count(*) > 15;

答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT uid FROM (
    SELECT uid,date FROM WHERE `date` >= '2019-03-01' AND `date` <= '2019-03-31' GROUP BY uid,`date` HAVING SUM(score) > 40
) WHERE GROUP BY uid HAVING count(*) > 15;

验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 结构
CREATE TABLE `scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 数据
INSERT INTO `scores` VALUES ('1', '1', '1', '2018-04-03');
INSERT INTO `scores` VALUES ('2', '1', '2', '2018-04-03');
INSERT INTO `scores` VALUES ('3', '1', '1', '2018-04-04');
INSERT INTO `scores` VALUES ('11', '1', '4', '2018-04-04');
INSERT INTO `scores` VALUES ('12', '1', '3', '2018-04-06');
INSERT INTO `scores` VALUES ('4', '1', '3', '2018-04-07');
INSERT INTO `scores` VALUES ('5', '2', '2', '2018-04-04');
INSERT INTO `scores` VALUES ('6', '2', '4', '2018-04-04');
INSERT INTO `scores` VALUES ('7', '2', '1', '2018-04-03');
INSERT INTO `scores` VALUES ('8', '3', '3', '2018-04-06');
INSERT INTO `scores` VALUES ('9', '3', '1', '2018-04-05');
INSERT INTO `scores` VALUES ('10', '3', '2', '2018-04-04');

-- 因为数据录入量有限,我们将结果改为修改改为:
-- 获取一个用户列表,时间范围是4号到6号,至少要有2天,每天分数总和大于2-- 查询
-- 非最精简语句,包含调试语句,可分段运行查看各个语句部分的效果。
SELECT
    uid
FROM
    (
        SELECT
            uid,
            `date`,
            sum(score) AS total_score
        FROM
            scores
        WHERE
            `date` > '2018-04-03'
        AND `date` < '2018-04-07'
        GROUP BY
            uid,
            `date`
        HAVING
            total_score > 2
        ORDER BY
            uid,
            date
    ) AS a
GROUP BY
    uid
HAVING
    count(*) > 1;

-- 答案是:
uid : 1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农编程进阶笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL面试题一
第四题:每个uid在9月份登录的前七次是哪几天,后7次是哪几天?(当月不足7天的取全部)
静谧星空TEL
2021/04/27
3800
hive sql(一)
每天分享一个sql,帮助大家找到sql的快乐 需求 找出所有科目成绩都大于某一学科平均成绩的学生 建表语句 create table score( uid string, subject_id string, score int ) row format delimited fields terminated by '\t' ; 数据 insert overwrite table score values ("1001","01",100), ("1001","02",100), (
大数据最后一公里
2021/08/05
8390
HiveSQL-面试题034 不及格课程数大于2的学生的平均成绩及其排名
有学生每科科目成绩,求不及格课程数大于2的学生的平均成绩及其成绩平均值后所在的排名。
数据仓库晨曦
2024/01/08
3030
HiveSQL-面试题034 不及格课程数大于2的学生的平均成绩及其排名
50道SQL面试题
9、查询所有课程成绩都小于60分的学生的学号、姓名(有意思,如果不用max可能难度不小)
九转成圣
2024/04/10
1640
互联网经典SQL面试题及答案解析
--学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数
TOMOCAT
2020/06/09
1.5K0
MySQL经典50题:面试必备
标题 MySQL经典50题解析及答案 作者 Peter 微信 756803877 公众号 尤而小屋 时间 2021-09-02 MySQL经典50题解析及答案 下面是网传经典的MySQL50题的习题及参考答案💪,供参考和学习,有更好的方法或者不恰当的地方,欢迎提出来 <!--MORE--> 题目1 题目要求 查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SQL实现 -- 方法1 select a.* ,b.s_score as 1_score ,c.s_score
皮大大
2021/09/02
2K0
MySQL经典50题:面试必备
大数据开发面试必知必会的SQL 30题!!!
解题思路:首先需要对区域进行分组,使用的是group by,然后对每个组内的用户进行计数聚合运算,使用的是count,最后运行结果如下表所示。
王强
2021/05/18
2K0
大数据开发面试必知必会的SQL 30题!!!
「SQL面试题库」 No_91 不同性别每日分数总计
题目介绍: 不同性别每日分数总计 running-total-for-different-genders
不吃西红柿
2023/10/16
1670
「SQL面试题库」 No_57 销售分析III
「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。
不吃西红柿
2023/05/07
2120
比较经典的SQL面试题
我根据题目重新梳理了一遍,包括表结构,表之间的关系,测试数据,题目,参考答案等。其中大部分参考答案在各种数据库平台上通用。
jamesjiang
2022/11/20
9210
比较经典的SQL面试题
Hive-SQL查询每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题:
数据仓库晨曦
2024/01/08
2860
Hive-SQL查询每年总成绩都有所提升的学生
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
4.1K0
Hive SQL 大厂必考常用窗口函数及相关面试题
MySQL 系列教程之(十五)SQL 面试题精讲
查询每个主播的最大level以及对应的最小gap(注意:不是每个主播的最大level和最小gap)
ruochen
2021/08/17
46K0
MySQL 系列教程之(十五)SQL 面试题精讲
mysql练习:经典50道基础题
建表共4张表,分别对应学生信息(Student)、课程信息(Course)、教师信息(Teacher)以及成绩信息(SC)
不愿意做鱼的小鲸鱼
2023/02/01
1.3K0
MySQL高频面试题:一维表转二维表
分析,课程与分数情况,用到学生表及成绩表,两张表都是一维表,将其转化为右图所示的二维表。
数据STUDIO
2021/06/24
1.3K0
MySQL面试题
DML数据操作语言,负责对数据访问工作的指令集,例如inser,update,delete语句
用户10175992
2023/10/17
3860
MySQL面试题
【Mysql学习之旅-2】经典sql面试题及答案分析
1、学生表 student(s_id:学生id,s_name:学生姓名,s_birth:学生生日,s_sex:学生性别):
云深i不知处
2020/09/16
2.1K0
经典的SparkSQL/Hive-SQL/MySQL面试-练习题
32.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
大数据学习与分享
2020/10/23
1.3K0
【数据库】MySQL经典面试题二(练习)
【数据库】MySQL经典面试题二(练习) 需要数据库表 1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 2.课程表 Course(CID,Cname,TID) --CID --课程编号,Cname 课程名称,TID 教师编号 3.教师表 Teacher(TID,Tname) --TID 教师编号,Tname 教师姓名 4.成绩表 SC(SID,CID,score) --SID 学生编号,CID 课程编号
Java帮帮
2018/03/22
8.6K0
(八)HQL手写题(1)
表结构:uid,subject_id,score 求:找出所有科目成绩都大于某一学科平均成绩的学生 数据集如下 1001 01 90 1001 02 90 1001 03 90 1002 01 85 1002 02 85 1002 03 70 1003 01 70 1003 02 70 1003 03 85 1)建表语句 create table score( uid string, subject_id string, score int) row format delimited fields terminated by '\t'; 2)求出每个学科平均成绩 select uid, score, avg(score) over(partition by subject_id) avg_score from score;t1 3)根据是否大于平均成绩记录flag,大于则记为0否则记为1 select uid, if(score>avg_score,0,1) flag from t1;t2 4)根据学生id进行分组统计flag的和,和为0则是所有学科都大于平均成绩 select uid from t2 group by uid having sum(flag)=0; 5)最终SQL select uid from (select uid, if(score>avg_score,0,1) flag from (select uid, score, avg(score) over(partition by subject_id) avg_score from score)t1)t2 group by uid having sum(flag)=0;
wolf
2020/09/21
6380
相关推荐
MySQL面试题一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档