基本SQL语句整理汇总

1、分组 GROUP BY - 基于MYSQL
DB中存在各个学生每个月的成绩,要求只查询获取学生最新一个月的成绩。
DB 表:

student{id, name, age}
score{
	id;
	student_id;
	score;
	month("yyyy-MM");
}

思路:子查询先将学生student_id和 日期month 两个字段进行分组,然后对月份进行排序,再外层循环做学生student_id 进行一次分组,即可。
疑问点:为什么不能只做子查询对学生student_id和 日期month 两个字段进行分组,而再需要对学生id 进行一次分组?和group by 的机制有关?(尝试了一遍,这样操作获取的数据并不是最新一个月的)
实现SQL:

SELECT * FROM (SELECT * FROM score WHERE  GROUP BY student_id, month ORDER BY month DESC) sc GROUP BY sc.student_id

或 查询某一学生最近的成绩

 SELECT * FROM (SELECT * FROM score WHERE student_id = 'test_id' GROUP BY student_id, month ORDER BY month DESC) sc GROUP BY sc.student_id

缺点:
此种表设计及查询方式,数据量大的时候,会造成性能问题,如查询计划执行情况:
在这里插入图片描述
优化方向:
在表中新增一个字段,标识数据新旧标识,此时的执行计划,如下:
在这里插入图片描述

n、未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值