一道MySQL面试题竟有GroupBy的感悟

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一道MySQL面试题竟有GroupBy的感悟

一道MySQL面试题竟有GroupBy的感悟

面试题

有一张历史评分记录表 t_score_log ,建表语句如下:

create table t_score_log (
    `id` varchar(32) not null comment '主键',
    `appid` varchar(32) not null comment '应用id',
    `type` tinyint(1) not null comment '评分类型:1运营,2用户',
    `score` double not null comment '评分',
    `crtTime` timestamp not null default now() comment '时间',
    primary key(id)
);
-- 插入数据
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('0cb2-4821-ab68-6267b6f29c07', 'C2003', 2, 32, '2020-06-22 17:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('2bb6-4875-bc63-ed3df1bfa126', 'C2002', 1, 21, '2020-06-22 17:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('2bb6-4875-bc63-ed3df222a126', 'C2002', 1, 221, '2020-06-22 19:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('75e7-422f-bffe-424fad813460', 'C2002', 2, 222, '2020-06-22 17:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('75e7-422f-bffe-424fad8134b0', 'C2002', 2, 22, '2020-06-22 17:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('cdeb-4ff8-a198-7ac3e0f1cfb1', 'C2004', 1, 41, '2020-06-22 18:41:41');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('cdeb-4ff8-a198-7ac3e0f1cfb2', 'C2003', 1, 31, '2020-06-22 17:39:53');
INSERT INTO test.t_score_log (id, appid, type, score, crtTime) VALUES ('cdeb-4ff8-a198-7ac3e0f1cfb4', 'C2004', 2, 42, '2020-06-22 18:41:41');


表数据如表格


image.png


有很多数据,每个应用都存在两种类型的评分;


请使用一条 SQL 查询,查询结果要求如下显示,查询出每个应用运营和用户最新的评分


image.pngimage.png

image.png

SELECT c.appid,
(SELECT a.score FROM t_score_log a WHERE a.appid =c.appid AND a.type =1 ORDER BY a.crtTime DESC LIMIT 1 ) AS '运营',
(SELECT a.score FROM t_score_log a WHERE a.appid =c.appid AND a.type =2 ORDER BY a.crtTime DESC LIMIT 1 ) AS '用户'
FROM t_score_log c  GROUP BY c.appid;


感悟

先执行最外层 SQL 语句,GROUP BY 语句是根据后面字段进行拆分成多个表格,然后在执行子查询语句,最后在聚合成一个表格;

select ... from ... where ... group by ... having ... order by;


  • 先 from 去查询表
  • 根据 where 的条件过滤
  • group by 分组
  • having 是对分组后的数据过滤
  • select 查询
  • 据 where 的条件过滤
  • group by 分组
  • having 是对分组后的数据过滤
  • select 查询
  • 最后 order by 排序
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
4月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
4月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
2月前
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
|
2月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
4月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
4月前
|
SQL 存储 关系型数据库
滴滴面试:明明 mysql 加的是 行锁,怎么就变 表锁 了?
滴滴面试:明明 mysql 加的是 行锁,怎么就变 表锁 了?
|
8月前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
6月前
|
消息中间件 NoSQL 关系型数据库
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
|
6月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
|
7月前
|
SQL 关系型数据库 MySQL
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?
1.请解释什么是MVCC,它在数据库中的作用是什么? 2.在MySQL中,MVCC是如何实现的?请简述其工作原理。 3.MVCC是如何解决读-写和写-写冲突的? 4.在并发环境中,当多个事务同时读取同一行数据时,MVCC是如何保证每个事务看到的数据版本是一致的? 5.MVCC如何帮助提高数据库的并发性能?
京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?

推荐镜像

更多