首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询查找世界上人口比同一大陆上所有国家都大3倍的国家

SQL查询查找世界上人口比同一大陆上所有国家都大3倍的国家
EN

Stack Overflow用户
提问于 2015-02-27 11:10:52
回答 3查看 3.9K关注 0票数 0

我有一张桌子,名字叫“世界”。该表按以下顺序排列:名称、大陆、地区、人口和国内生产总值。我想要写的问题是下一个问题:一些国家的人口是其邻国(同一大陆)的三倍以上。给这些国家和大陆。

我的查询如下:

代码语言:javascript
运行
复制
SELECT 
    name, continent 
FROM 
    world as x
WHERE
    x.population/3 > ALL (SELECT population 
                          FROM world as y 
                          WHERE x.continent = y.continent)

但它不像它应该做的那样起作用。可能的问题是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-27 11:19:22

就我个人而言,我发现anyallsome关键字的使用有点难理解。当查询显式地使用min()max()时,我发现解释这样的查询更容易:

代码语言:javascript
运行
复制
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值时更加直观。

注意,我为每个表都包含了表别名,并使用它们来限定列名。

票数 3
EN

Stack Overflow用户

发布于 2015-02-27 13:08:12

您可以使用WHERE NOT EXISTS

代码语言:javascript
运行
复制
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的人口。与使用带有子查询的聚合相比,它的优点是它将返回只有一个国家的大陆的值。参见这里的演示 (存在的地方)与 这一个 (MAX)

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 10:22:39

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28763696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档