快乐SQL做题 - Day3

Hello!!今天是DAY 3啦~一起来看看今天有什么题目吧~

闯关开始啦

关卡1-删除重复的电子邮箱

要求:

执行 SQL 之后,输出是整个 Person表。

使用 delete 语句。

思路:

我们要用delete语句删除重复的电子邮箱,我们要先做一个自连接筛选出重复的电子邮箱

那应该如何才能筛选出这样的电子邮箱呢。

在DELETE官方文档中,给出了这一用法,比如下面这个DELETE语句

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;

这种DELETE方式很陌生,竟然和SELETE的写法类似。它涉及到t1和t2两张表,DELETE t1表示要删除t1的一些记录,具体删哪些,就看WHERE条件,满足就删;

这里删的是t1表中,跟t2匹配不上的那些记录。

所以,官方sql中,DELETE p1就表示从p1表中删除满足WHERE条件的记录

最后,我们创建一个自连接,where限制的是他们的email是一样的,然后第二个表的id要大于第一个表的id

delete a from Person as a, Person as b

where a.Id < b.Id

and a.Email = b.Email

恭喜过关!进入下一关!


关卡2 -上升的温度

思路:

这道题也是对比前后,那我们自然要创造自连接

然后让一边的temperature大于另一边

让日期有1天的差距

就可以啦

一开始我写的是让id有1的差距,但是id有1的差距不代表,日期差距一天~对吧!

所以我们要用一个专门比较日期的函数 DATEDIFF来比较两个日期类型的值。可以这么理解:放在前面的那个值代表被减数,中间是减数,结尾是差。

select b.id as Id from Weather a, weather b

where a.Temperature < b.Temperature

and DATEDIFF(b.recordDate, a.recordDate) = 1

恭喜过关!进入下一关!


关卡3 - 行程和用户

这道题我们按照他的要求一步一步来就可以了~

首先,我们要有一个日期,然后我们要计算cancellation rate

那么这个rate怎么计算呢,他也说了,是cancel的订单数➗总订单数

那么我们首先要计算Status 不等于 complete的订单数

那我们就写一个if statement,如果他是complete,就是0,如果不是就是1

然后sum起来,就能得出所有的不等于 complete的订单数

这个思路非常好~要记住哦!

然后➗完我们就在外围加一个round函数,跟python一样,语法是round(对象,小数点几位)。

第二个难点是join的时候要让什么等于什么呢

是U.Users_Id = T.Client_Id

为什么不需要考虑driver呢?

因为结合日常生活,打车订单都是由乘客发起生成的。所以就不需要考虑driver ID

答案:

Select T.Request_at as 'Day', Round(SUM(IF(T.Status = 'completed',0,1))/count(T.Status),2) as 'Cancellation Rate'

From Trips T

Inner join Users U

on U.Users_Id = T.Client_Id

Where Banned like 'No'

And T.Request_at BETWEEN '2013-10-01' AND '2013-10-03'

Group by T.Request_at

恭喜过关!进入下一关!


关卡4 - 大的国家

思路:

好吧这道题有点水,有点简单

但我第一次提交还是错了,因为,,,,,,

我没看清题目,把or写成了and!!!

总结经验:傻瓜一枚

select name, population, area from World

where population > 25000000

or area > 3000000

恭喜过关!进入下一关!

关卡5 - 超过5名学生的课

这道题,首先我想到的就是count(distinct 什么什么)>4,但是千万要记得,如果不是要在select语句里面用count,那就要有group by 然后在having 后面加,要不然就有error

所以我们就先group by class,再看看每个class 里面distinct 的学生

就大功告成啦

select class from courses

group by class

having count(distinct student)>5

恭喜过关!

今天学到的新知识:DELETE t1表示要删除t1的一些记录,具体删哪些,就看WHERE条件,满足就删;专门比较日期的函数 DATEDIFF可以比较两个日期类型的值,放在前面的那个值代表被减数,中间是减数,结尾是差;count在下面用的话要在group by 后面加having用;看清题目如果是或,就where……or……,;round跟python的用法一样;if也跟python一样,语法是if(语句,语句为T是的输出,语句为F时的输出),

明天继续闯关~yay ~

你可能感兴趣的:(快乐SQL做题 - Day3)