美文网首页
SELECT within SELECT Tutorial/zh

SELECT within SELECT Tutorial/zh

作者: 葵小ci | 来源:发表于2018-04-10 14:56 被阅读149次

    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)

    相关文章

      网友评论

          本文标题:SELECT within SELECT Tutorial/zh

          本文链接:https://www.haomeiwen.com/subject/ezqnhftx.html