学习链接:https://sqlzoo.net/wiki/Window_LAG
● 【题目1】查询在欧洲(Europe)人均gdp大于英国 (United Kingdom)的国家名。人均国内生产总值(人均GDP)=国内生产总值(GDP)/人口(populaiton)。
分析:
(1)查询的是国家名
(2)限制是:①在欧洲(Europe),且 ②人均gdp> 英国 (United Kingdom)
题目不要分析错了!
代码:
SELECT nameFROM worldwhere gdp/population> //这个where筛选出 人均GDP>英国的国家(select gdp/populationfrom worldwhere name ='United Kingdom' //是国家名name,不是大洲)and continent ='Europe ' //限制是在欧洲
● 【题目2】查询人口数(population)超过加拿大(Canada)但是少于Argentina的国家,结果显示这些国家名(name)和人口数(population)
分析:
(1)查询国家名和人口数
(2)限制:加拿大(Canada)<人口数< Argentina
代码:
select name,populationfrom worldwhere population >(select populationfrom worldwhere name = 'Canada')and population <(select populationfrom worldwhere name = 'Argentina')
注意——between… and…也是可以的,但是<= population <=,会包含条件国家
● 【题目3】查询所有国家人口均≤25000000的大洲,及其国家名(name)和人口(population)
分析:
(1)查询大洲、其国家名(name)和人口(population)
(2)所有国家人口均≤25000000的
“所有国家人口均≤25000000”即最大人口数population≤25000000,
可以先按洲分组,再把这些国家选出来。
我的代码:
select name,continent,populationfrom worldwhere population<=25000000 //这不就可以包含所有国家了吗
上面代码不对,因为大洲会重复:
师兄代码:
selectname,continent,populationfrom worldwhere continent not in ( select distinct continent //将洲去重了from worldwhere population >25000000)
● 【题目4】查找每个大陆(continent)中最大的国家(按区域area),显示该大洲(continent),国家名(name)和面积(area).
分析:
查询的是:大洲(continent),国家名(name)和面积(area)
限制是:区域area最大的国家,每个大陆(continent)
先查询出每个大陆(continent)中最大面积的国家(不止一个):
(因为有可能一个大洲里面,不止一个最大面积的国家),所以还要再次进行筛选。
然后再在这些国家当中,找大洲和面积满足要求的。
完整代码:
select continent,name,areafrom worldwhere (continent,area) in //找world里面同时有“大洲和面积”在洲最大国家面积表中的(select continent,max(area)from worldgroup by continent )
● 【题目5】查询德国和意大利每天新增治愈人数并从高到低排名,查询结果按国家名,截至日期(输出格式为'xxxx年xx月xx日'),新增治愈人数,按排名排序.
分析:
查询:每天新增治愈人数——今天累计-昨天累计lag(,1)
限制:德国和意大利的——where
要求:从高到低排名——order by
结果:按国家名,截至日期(输出格式为'xxxx年xx月xx日'),新增治愈人数,按排名排序
代码:计算出德国和意大利的每天新增治愈人数,并降序排列
select name,
date_format(whn,'%Y年%m月%d日') 日期,
recovered-lag(recovered,1)over(partition by name order by whn) lrecovered
from covid
where name in ('Germany','Italy')
order by lrecovered desc
然后再从上面的表中
select name,日期,lrecovered, //对应子查询中返回的值rank()over(partition by name order by lrecovered desc) 排名from(select name,date_format(whn,'%Y年%m月%d日') 日期,recovered-lag(recovered,1)over(partition by name order by whn) lrecoveredfrom covidwhere name in ('Germany','Italy')order by lrecovered desc)re //子查询中的表必须要命名?order by 排名