去刷了题目之后真的学到了很多不论是新的知识点还是一些组合用法总之对数据库操作尤其是dql的使用更加熟练了。感谢其他leetcoder对各种知识点和解题套路的分享学会这些小操作后写sql头不疼了腰不酸了睡得着了吃饭也更香了。
根据这些题我总结了一些常用的知识点、小技巧以及部分有代表性的题解。
这篇文章就来分享一些有价值的题解。题目有些多这篇先展示其中七题的题解。
剩下的在这里
- 题目总结——经典题目题解与分析一–简单
- 题目总结——经典题目题解与分析三–简单
项目员工II
题目链接
这个题目如果保证员工最多的项目仅有一个或者只需要输出其中的一个就会变得非常简单。
但是问题就在于这个查询结果存在多解即会有多个项目的员工数量并列第一。
所以我们先要查询出员工最多的项目有多少员工接着我们需要从所有的项目里在查询出所有的员工数量大于等于这个数字的项目。
tips需要使用到all关键字
selectproject_idfrom projectgroup byproject_idhavingcount(*) > all(selectcount(*) from projectgroup by project_id);
销售分析I
题目链接
同上一题相似这个题也需要我们找出统计数字最高的元素并且存在并列的情况
所以我们还是采用上一题的策略先查询出最高元素的数值再从所用元素中筛选出数值等于它的元素。
SELECT seller_idFROMSales sGROUP BY seller_idHAVING SUM(price) > all(SELECT SUM(price)FROMSalesGROUP BY seller_idORDER BY SUM(price) DESC);
销售分析II
题目链接
这里需要我们查找购买了其中一个商品却没有购买另一个商品的用户。
其实就在寻找两个集合交集中的元素。
我们使用in条件匹配子查询出来的购买了s8和购买了iPhone 1的集合使用and运算对集合元素进行交集运算。
select distinct buyer_idFROMSaleswherebuyer_id in(SELECT distinct buyer_idFROMSales sJOIN Product pON p.product_id s.Product_idwhereproduct_name S8)andbuyer_id not in(SELECT distinct buyer_idFROMSales sJOIN Product pON p.product_id s.Product_idwhereproduct_name iphone);
销售分析III
题目链接
这个题目需要我们统计仅在一段时间内出售过的产品不太好搞。
老规矩正难则反我们查询所有不再这一时间段内出售过的产品取这个集合的补集即可
selectdistinct p.product_id,p.product_namefromSales sjoin product p on s.product_id p.product_idwhere p.product_id not in(selectdistinct product_idfromSaleswhere sale_date 2019-03-31);
即时食物配送I
题目链接
这道题需要我们统计下单日期和送货日期相同的订单占总订单的比例
如果仅是统计即时订单的话这个题使用一个where语句进行筛选即可但是那样会筛选掉所有的语句
因此我们需要保留所有的数据最好不要使用where语句进行筛选而是在遍历所有数据的时候使用case-when-then来进行筛选。搭配上聚合函数一起使用我们可以直接得到即时订单的数量和全体的数量进而得出比率。
selectround(sum(case when order_date customer_pref_delivery_date then 1 else 0 end)/count(delivery_id)*100,2) as immediate_percentagefrom delivery;
每个帖子的评论数
题目链接
这道题的表单中存在关联关系我们的任务是统计所有帖子的评论数那么就免不了要进行联结。
在联结之前我们应该先将所有的帖子分离出来放入一张表中。在使用这张表同原表进行联结进而统计所有帖子的评论数。
另外题目中提到帖子和评论都存在重复。对于去重工作对帖子的去重我们可以在分离帖子的子查询中解决重复的评论我们可以在分完组后在聚合函数中进行去重。
selects1.sub_id as post_id,ifnull(count(distinct s2.sub_id),0) as number_of_commentsfrom(selectdistinct sub_idfromsubmissionswhere parent_id is null) s1left join submissions s2 on s1.sub_id s2.parent_idgroup bys1.sub_id;
平均售价
题目链接
这道题需要我们统计每件产品销售的平均售价对于平均售价的计算并不是难事我们使用聚合函数对单价和数量乘积进行求和即可。
这道题亮点就在于其两个表的联结条件。除了id要对应上除外我们还需要使得出售时间点位于价格时间段内因此在联结两张表时我们需要多个条件进行限制条件之间使用and算符即可。
selectu.product_id,round(sum(price * units) / sum(units),2) as average_pricefrom unitssold uleft join prices p on u.product_id p.product_id and purchase_date between start_date and end_dategroup byproduct_id;