排序和分组这部分共7道题,如下,只说一说3道,其他都写对了,也不难,只有最后一题难一点点,没想到那种解法,一看到主键和外键就想利用连接。
1.销售分析的题目和表相关内容如下
就是利用product_id分组,然后利用having 选中仅在2019-01-01至2019-03-31(含)之间出售的商品。但是怎么想到这种方式需要记住。且记得加表名。如下是题解。
select p.product_id,product_name from product p join sales s on p.product_id=s.product_id group by p.product_id having min(sale_date)>='2019-01-01' and max(sale_date)<='2019-03-31';
2.只出现一次的大数字的题目和表相关内容如下
原先还有点没想通,后面发现把一条记录的单领出来就很好就解决了。所以就是说有时候看题目,要学会分解题目,第二部分可能是基于第一部分才能得出的,所以找出第一部分很重要,如下是题解:
select ifnull(max(num),null) num from (select num from mynumbers group by num having count(num)=1) a;
3.买下所有产品的客户的题目和表相关内容如下
我之前的解,其实尝试了很多种,这里讲一种,如下。
select customer_id from product p left join customer c on p.product_key=c.product_key group by customer_id having sum(distinct c.product_key)=sum(ifnull(p.product_key,0);
没想到可以利用count()相等而且即使修改后成为下面的句子,没有了连接也不行,因为having后面不能有字段是select字段或者group by的字段里没有出现过的,我在总结聚合函数的上半部分有提到过。
select customer_id from customer group by customer_id having sum(distinct product_key)=sum(select product_key from product);
正确的题解如下:
select customer_id from Customer group by customer_id having count(distinct product_key) = (select count(distinct product_key) from Product);
in换成=也行。
总结
我也还是这样,遇到我没碰过的,目前解决不了的事就不想干了,就想逃避,有好也有坏。熟悉了一遍题,然后总结思路其实很好,这样没有很多的点让你担忧或者说没接触过,不了解。缺点就是没有深刻钻研这方面的内容。多多努力多思考!!!!