用于查找世界上人口数量比同一大洲所有国家大3倍的国家的SQL查询

时间:2015-02-27 11:10:52

标签: sql

我有一张名为' world'的桌子。该表按此顺序包含列:名称,大陆,区域,总体和gdp。我想写的查询是针对下一个问题: 有些国家的人口是其邻国(在同一大洲)的三倍以上。给各个国家和大陆。

我的查询是这样的:

SELECT 
    name, continent 
FROM 
    world as x
WHERE
    x.population/3 > ALL (SELECT population 
                          FROM world as y 
                          WHERE x.continent = y.continent)

但它并没有按照预期的那样发挥作用。可能出现什么问题?

3 个答案:

答案 0 :(得分:2)

就我个人而言,我发现使用anyallsome关键字有点难以理解。我发现在明确使用min()max()时解释此类查询会更容易:

SELECT w.name, w.continent 
FROM world w
WHERE w.population > (SELECT 3 * MAX(w2.population) 
                      FROM world w2
                      WHERE w2.continent = w.continent AND
                            w2.name <> w.name
                     );

此外,如果子查询可能返回min()个值,则子查询中使用max()NULL会使其行为更直观。

请注意,我为表格分别包含了表别名,使用来限定列名称。

答案 1 :(得分:1)

您可以使用WHERE NOT EXISTS

SELECT x.name, x.continent
  FROM world x
 WHERE NOT EXISTS ( SELECT 1 FROM world y
                     WHERE y.continent = x.continent
                       AND y.name <> x.name
                       AND y.population >= x.population/3 );

换句话说,让所有在同一大洲没有其他国家的国家,甚至人口的1/3。与使用子查询的聚合相比,它的优势在于它将返回仅包含一个国家的大陆的值。 See SQL Fiddle Demo here(在何处)与this one(MAX)

答案 2 :(得分:0)

SELECT name, continent FROM world x
  WHERE population>ALL (SELECT 3*population FROM world y
                         WHERE x.continent=y.continent
                         AND x.name<>y.name   
                         AND population>0)