1、子查询的用法(也可实现分组求最大值)
ALL的用法(很常用)
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 )
4)列出有至少100百萬(1億)(100,000,000)人口的洲份。
select distinct(continent) from world a where 100000000 <= all( select sum(b.population ) from world b where a.continent = b.continent )
# 第二种 group by ..having .. select continent from ( select continent ,sum(population ) from world group by continent having sum(population ) >= 100000000 )a
二、coalesce函数
与null有关的函数,填充第一个不是null的值,若都没有值结果为null
COALESCE(x,y,z) = x if x is not NULL COALESCE(x,y,z) = y if x is NULL and y is not NULL COALESCE(x,y,z) = z if x and y are NULL but z is not NULL COALESCE(x,y,z) = NULL if x and y and z are all NULL