SELECT within SELECT Tutorial/zh

2018-04-10  本文已影响149人  葵小ci

http://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial/zh

1、

select name from world

where population>(select population from world where name='Russia' )

2、原题:列出歐州每國家的人均GDP,當中人均GDP要高於英國'United Kingdom'的數值。

select name from world

where continent='Europe' and (GDP/POPULATION)>(select gdp/population from world where name='United Kingdom')

说明:人均GDP计算公式为gdp除以人口数;“GDP/population”需用单引号;原题中要求人均gdp要高于英国的数值,所以需要先求出英国的人均gdp,然后进行嵌套查询。

3、原题:在阿根廷Argentina 及 澳大利亞 Australia所在的洲份中,列出當中的國家名字 name 及洲分continent 。按國字名字順序排序。

解题思路:先得出阿根廷和澳大利亚分别所在的洲份名字,然后已知洲份名字,查询中所包含的国家名字,最后将这些国家名字按照名称排序。

select name,continent from world

where continent in (select continent from world where name in('Argentina', 'Australia')) order by name

4、

原题:哪一個國家的人口比加拿大Canada的多,但比波蘭Poland的少?列出國家名字name和人口population 。

select name,population

from world

where population>(select population from world where name='Canada ') and population<(select population from world where name='Poland')

5、

Germany德国(人口8000万),在Europe欧洲国家的人口最多。Austria奥地利(人口850万)拥有德国总人口的11%。显示欧洲的国家名称name和每个国家的人口population。以德国的人口的百分比作人口显示。

select name,CONCAT(round(population/(select population from world

where name='Germany')*100),'%')

from world

where continent='Europe'

说明:原题要求显示所属欧洲的国家名称和人口数,其中人口数的表达方式为与德国相比的百分数。

先查询出德国的人口数;然后将所属欧洲国家的人口数除以德国的人口数;

得出的欧洲国家的人口数除以德国人口数后将其取整并乘以100,此处乘以100的目的是因为除以后的数字通常为小数,为后续显示百分比准备;

最后用concat()函数将之前已取整的数字与百分号“%”连接起来,从而显示出百分比。

6、

哪些國家的GDP比Europe歐洲的全部國家都要高呢? [只需列出 name 。] (有些國家的記錄中,GDP是NULL,沒有填入資料的。)

答案一

思路:先查询出属于欧洲的所有国家的GDP;查询出属于欧洲的所有国家的GDP的最大值;最后大于这个最大值即为所得。

select name from world

where GDP > (select max(GDP) from world where continent='Europe')

答案二

SELECT name FROM world

WHERE gdp > ALL(SELECT gdp FROM world WHERE continent='Europe' AND gdp>0)

思路:使用ALL()函数。

ALL() 表示满足全部所有条件中则返回为“ture”,即all是所有。

ANY()表示满足任意一个条件即可返回为“true”,即any表示任意一个。

原题中“比Europe歐洲的全部國家都要高”则意为所有全部,使用all()函数。

原题中指部分国家GDP可能为空值,所以增加条件语句“gdp>0”

举例:

select name from world

where gdp>all(select gdp from world where continent='Europe')

等同于 select name from world

where gdp>(select max(gdp) from world where continent='Europe')

显示出的国家的GDP将是大于欧洲所有国家的gdp。

select name from world

where gdp>any(select gdp from world where continent='Europe')

等同于 select name from world

where gdp>(select min(gdp) from world where continent='Europe' )

结果显示出的国家GDP只需比欧洲任意一个国家的gdp大即满足条件。

7、

原题:在每一個州中找出最大面積的國家,列出洲份 continent, 國家名字 name 及面積 area。 (有些國家的記錄中,AREA是NULL,沒有填入資料的。)

答案一

select continent,name,area

from world

where area in(select max(area) from world

group by continent)

解题思路:

关键在于每一个洲中最大面积的国家;

先找出有哪些洲;

然后找出这些洲中最大的国家名称;

显示这些在各洲中拥有最大面积的国家名称和面积等;

group by()分组函数;此题是按照“洲份”分组,列出共有哪些洲份;

max()函数为求出最大面积,嵌套组合使用则求出各个洲份的最大面积;

“select max(area) from world group by continent”意为查询出 “按照洲份分类,每一个洲的最大面积”,

继而得出一组关于最大面积的数据;

如果某一国家面积的数据属于这组“最大面积数据”,则显示出名称、面积、洲份。

答案二

SELECT continent, name, area FROM world x

  WHERE area >= ALL

    (SELECT area FROM world y

        WHERE y.continent=x.continent

          AND area>0)

思路:假想是两份完全相同的表格“world”,暂且命名为“world X”和“world Y”,其包含的字段名分别为

X.name/X.continent/X.area/X.population/X.gdp;

Y.name/Y.continent/Y.area/Y.population/Y.gdp;

当Y.continent=X.continent时,则显示表格“world Y”中的面积“area”,此处强调面积不为0(area>0),相当于得出了相同洲份的情况下所有的面积数据组;

使用all()函数,即当表格“world X”中的面积“area”大于所有“在上一步得出的所有面积数据组”,即求出了各个洲份的最大面积数对应的面积“area”,此面积数可认为属于“world X”;

继而在表格“world X”中查询显示出符合题意的 continent, name, area。

8、列出洲份名稱,和每個洲份中國家名字按子母順序是排首位的國家名。(即每洲只有列一國)

疑问待解?

SELECT continent,name FROM world a

WHERE name <= ALL(SELECT name from world b WHERE a.continent = b.continent )ORDER by name

或者

SELECT continent,name FROM world x

WHERE x.name=(SELECT y.name FROM world y WHERE y.continent=x.continent ORDER BY name LIMIT 1);

9、找出洲份,當中全部國家都有少於或等於 25000000 人口. 在這些洲份中,列出國家名字name,continent 洲份和population人口。

疑问待解?

SELECT name,continent,population FROM world x

WHERE 25000000 >= ALL(SELECT population FROM world y WHERE y.continent = x.continent)

10、有些國家的人口是同洲份的所有其他國的3倍或以上。列出 國家名字name 和 洲份 continent。

疑问待解?

SELECT name,continent FROM world x

WHERE x.population/3 >= ALL(SELECT population FROM world y WHERE y.continent = x.continent AND

y.name != x.name)

上一篇下一篇

猜你喜欢

热点阅读