1、子查询的用法(也可实现分组求最大值)
1)在每一个州中找出最大面积的国家,列出洲份 continent, 国家名字 name 及面积 area。 (有些国家的记录中,AREA是NULL,没有填入资料的。)
数据库world表:
name | continent | area | population | gdp | capital | tld | flag |
---|---|---|---|---|---|---|---|
Afghanistan | Asia | 652230 | 25500100 | 20364000000 | Kabul | .af | //upload.wikimedia.org/wikipedia/commons/9/9a/Flag_of_Afghanistan.svg |
Albania | Europe | 28748 | 2821977 | 12044000000 | Tirana | .al | //upload.wikimedia.org/wikipedia/commons/3/36/Flag_of_Albania.svg |
Algeria | Africa | 2381741 | 38700000 | 207021000000 | Algiers | .dz | //upload.wikimedia.org/wikipedia/commons/7/77/Flag_of_Algeria.svg |
Andorra | Europe | 468 | 76098 | 3222000000 | Andorra la Vella | .ad | //upload.wikimedia.org/wikipedia/commons/1/19/Flag_of_Andorra.svg |
...
分析area中含有null值,若不含null值,sql中可采用row_number() over(partition by ) 分组排序实现.
代码:
select a.name, a.continent , a,area from (select name ,continent ,area , row_number() over(partition by continent order by area desc) rank from world ) a where a.rank =1
area 中含有null值,采用子查询的方式:(2个表比较实现查询结果:比较条件区域相同,比较a的面积大于b的面积,区域下的所有其他项,引入all函数).
select continent ,name, area from world a where a.area >= all(select area from world b where a.continent = b.continent and b.area >0)
2)找出洲份,当中全部国家都有少于或等于 25000000 人口. 在这些洲份中,列出国家名字name,continent 洲份和population人口。
select name, continent ,population from world a where 25000000 > all( select b.population from world b where a.continent = b.continent and b.population >0 )
3) 有些国家的人口是同洲份的所有其他国的3倍或以上。列出 国家名字name 和 洲份 continent。
select name,continent from world a where a.population/3 >= all( select b.population from world b where a.continent = b.continent and b.population >0 and a.name <> b.name )
原文:https://www.cnblogs.com/hqczsh/p/11721465.html