SELECT within SELECT Tutorial/zh
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)