刷完了简单难度的数据库题目,对sql中的一些语法特性有了简单的了解,算是学会了挺多思路,还有很多的小技巧
总之就是感觉使用sql能完成的任务越来越多了,能解决的业务场景也也越来越复杂了。有许多之前不得不拿到程序中才能处理的数据使用简单的sql就能够达成,当事人就很有成就感。
所以刷题整理这个过程还会持续下去,从这篇博文开始,就是中等难度的了,由于题目较长或者题解较简单稍微复杂。所以为了避免每篇博文过于冗长,暂定是5-6道题一篇。会挑选博主觉得比较有意义的题目(根据博主不算高的水平)
往期的题解会放在最后,刷题总结会持续更新,来关注博主一起进步啊~
产品销售分析III
题目链接
这个题需要我们找出所有产品第一年的销售信息。
如果直接分组的话,由于分组后各字段的联系被切断不能同时拿到第一年的所有信息。
所以可以先筛选出来所有产品的第一年作为答案集合。再使用in按照产品id和年份两个关键字来匹配这集合,找出所有的产品第一年销售信息。
select
product_id,
year as first_year,
quantity,
price
from
sales
where
(product_id,year) in (
select
product_id,
min(year) as year
from
sales
group by
product_id
)
;
二级关注者
题目链接
查询所有的关注者二级关注者的数目,二级关注者是关注关注者的人,这个定义就逃不掉要进行自联结。
但是在进行自联结之前我们要将一级关注者进行去重,不然在分组后会产生重复。
去重后直接进行自联结就好,后表的followee是前表的follower。
之后对联结表按照前表的follower进行分组,分别统计每组的关注者数目即可
select
f1.follower,
count(distinct f2.follower) as num
from
(
select
distinct follower
from
follow
) f1
join follow f2 on f1.follower = f2.followee
group by
f1.follower
order by
f1.follower
;
换座位
题目链接
这道题需要我们交换相邻两个学生的位置。
由于id是从1开始计数的,那么相邻的学生的id就应该满足如下关系: