这实际上来自我用来刷新我的SQL知识的交互式网站SQLzoo.net。
问题是
查找所有国家/地区人口数<= 25000000的大陆。然后查找与这些大洲相关联的国家/地区的名称。显示名称,大陆和人口。
我做了什么来制作解决方案
SELECT name, continent, population
FROM world x
WHERE population <= ALL(SELECT population
FROM world y
WHERE y.continent = x.continent
AND population > 25000000)
我不想复制和编辑输出,因为它非常繁琐 - 可以通过进入本页的第7号来检查 - http://www.sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial
我想知道我写错了什么。我做了其他问题没关系,但这个问题似乎有点棘手(或者可能是比我想象的更多嵌套的SELECT查询)。
感谢任何建议/解释。
答案 0 :(得分:8)
SELECT name, continent, population
FROM world w
WHERE NOT EXISTS ( -- there are no countries
SELECT *
FROM world nx
WHERE nx.continent = w.continent -- on the same continent
AND nx.population > 25000000 -- with more than 25M population
);
更新了删除零(两次)
答案 1 :(得分:8)
以下代码对我有用:
SELECT name, continent, population FROM world x
WHERE 25000000>=ALL (SELECT population FROM world y
WHERE x.continent=y.continent
AND population>0)
答案 2 :(得分:5)
我已经写了很长很长时间的SQL,几乎从不使用ALL
,SOME
或ANY
。
对我来说,编写此查询的明显方法是使用窗口函数:
SELECT name, continent, population
FROM (SELECT w.*, MAX(population) OVER (PARTITION BY continent) as maxpop
FROM world w
) w
WHERE maxpop < 250000000;
如果您不喜欢该解决方案,请使用明确的join
和aggregation
:
SELECT name, continent, population
FROM world w JOIN
(SELECT continent
FROM world
GROUP BY continent
HAVING max(pop) < 250000000
) c
ON w.continent = c.continent;
答案 3 :(得分:4)
SELECT name, continent, population
FROM world x
WHERE 25000000 > ALL(SELECT population
FROM world y
WHERE y.continent = x.continent
)
'ALL'
部分将一个洲的所有国家的人口与2500万比较,如果少于25000000,则会打印其中所有国家的名称和人口。
答案 4 :(得分:3)
这是一种方式:
基本上,非洲大陆必须列入各大洲的名单,其国家数量与人口数量小于或等于该数量的国家数量相同。
列表由子查询确定。
人口少于该数量的国家的数量由条件汇总确定。
select name, continent, population
from world
where continent in
(select continent
from world
group by continent
having count(*)
= sum(case when population <= 25000000 then 1 else 0 end))
另外,minus
可以在Oracle或SQL Server中使用:
select name, continent, population
from world
where continent in (select continent
from world
minus
select continent
from world
where population > 25000000)
答案 5 :(得分:2)
我认为这很简单......
从大陆不在的世界选择名称,大陆,人口( 从人口> = 25000000的世界中选择大陆
只需过滤掉人口超过25M的大陆,你就可以得到其余的......
答案 6 :(得分:1)
我写了这个并且它有效。当我使用给定条件时它变得复杂,因此我使用了否定。如果一个大陆至少有一个拥有25M人口的国家,你可能希望从选择中跳过它。你的第二个选择不符合这个逻辑。因此错误。
这就是:
select name,continent,population from world
where not continent in
(select distinct continent from world where population >25000000)
以上代码获得了拥有超过2500万人口的至少一个国家的大陆,并且首先选择了所有不属于该大陆的国家。如果你注意到我们不需要再次检查人口,因为所有国家显然都不会人口少于或等于2500万。
答案 7 :(得分:1)
这是一种简单的方法,确实可以工作
select name,continent ,population from world
where continent in( select continent from world group by
continent having MAX(population)<=25000000 )
答案 8 :(得分:0)
以下查询为我工作
从大陆不在的世界选择名称,大陆,人口 ( 从世界中选择大陆 其中人口> = 25000000)
答案 9 :(得分:0)
我认为这应该有所帮助:
SELECT name, continent, population FROM world
WHERE continent IN (
SELECT distinct continent FROM world
GROUP BY continent HAVING MAX(population)<=25000000
)
答案 10 :(得分:0)
选择姓名,大洲,人口 来自世界 不在的大陆(从世界上超过25000000的人口中选择大陆)
答案 11 :(得分:0)
这也可以使用“ ALL”语法进行工作:
SELECT name, continent, population
FROM world w1
WHERE population <= ALL(SELECT continent
FROM world w2
WHERE population > 25000000
AND w1.continent = w2.continent)
答案 12 :(得分:0)
SELECT name, continent, population FROM world WHERE continent = (SELECT continent
FROM world x
WHERE population <= 25000000
GROUP BY continent
HAVING COUNT(name) = (SELECT COUNT(name) FROM world y WHERE x.continent = y.continent GROUP BY continent))
答案 13 :(得分:0)
我想到了这个
select name,continent,population from world where continent in
(
select continent from world where population in
(select max(population) from world group by continent)
and population<= 25000000
)
答案 14 :(得分:0)
select name, continent, population
FROM
(
select continent, name, population,
SUM(indicator) OVER (PARTITION BY continent) total
FROM
(select
continent, name, population,
case when population > 25000000 THEN 1 ELSE 0 END indicator
from world
)sub1
)sub2
WHERE total = 0
ORDER BY name
答案 15 :(得分:0)
这是我使用并得到正确的代码
SELECT name, continent, population FROM world x
WHERE (SELECT MAX(y.population) FROM world y WHERE y.continent = x.continent ) <= 25000000