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 ~