我有一张桌子(取自sqlzoo.net ),
+-------------+-----------+------------+------------+-------------------+
| name | continent | area | population | gdp |
+-------------+-----------+------------+------------+-------------------+
| Afghanistan | Asia | 652230.000 | 25500100 | 20343000000.00000 |
| Albania | Europe | 28748.000 | 2831741 | 12960000000.00000 |
+-------------+-----------+------------+------------+-------------------+
...
,查询是,
查找属于所有人口的大陆的每个国家/地区 小于25000000.显示名称,大陆和人口
我打破了查询,如下,
当我尝试编写查询时,我最终会这样,
外部查询似乎很好,
select name,continent,population from world where continent IN
内部查询让我感到困惑。
(select continent from world where population<25000000)
这是不正确的,因为它不检查一个大陆内的所有种群是否满足约束(我想检查一个大陆内的所有行,如果所有满足都包括IN
列表中的大陆名称)。 //我知道如何在C
//中做到这一点//
我如何在SQL中执行此操作?
注意:如果有有用的链接,请包含它们。解释查询执行情况的权限(与for
循环如何在C中工作一样明确 - 分配,增量,检查,循环')将非常有用
答案 0 :(得分:3)
补充fthiella优秀答案的另一种选择:
SELECT name, continent, population FROM world w1
WHERE 25000000 > ALL (
SELECT population FROM world
WHERE w1.continent = continent)
答案 1 :(得分:2)
你可以使用这样的查询:
SELECT name, continent, population
FROM world
WHERE continent IN (SELECT continent
FROM world
GROUP BY continent
HAVING COUNT(*)=SUM(population<25000000))
子查询将仅返回所有人口少于25000000的国家。
COUNT(*)
将是每个大洲所有行的计数(如果没有重复,则它将是该大陆所有国家/地区的计数)。
SUM(population<25000000)
将是人口数小于25000000的大陆的数量,因为如果条件为真,则人口&lt; 25000000将返回1,否则返回0。
或者你也可以使用它:
SELECT name, continent, population
FROM world
WHERE NOT EXISTS (SELECT NULL FROM world w1
WHERE w1.continent = world.continent
AND population>25000000)
答案 2 :(得分:0)
我似乎已经cheat page通过 googling 在线搜索
它说,
SELECT name,continent,population FROM world x
WHERE 25000000 >= ALL (
SELECT population FROM world y
WHERE x.continent=y.continent
AND y.population>0)
把它放在这里引用这个问题的人
答案 3 :(得分:0)
尝试一下:
select name, continent, population
from world x
where continent in (select continent
from world
group by continent
having max(population) <= 25000000)