SQL结合了SELECT语句

时间:2015-03-08 17:06:16

标签: sql subquery

这实际上来自我用来刷新我的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查询)。

感谢任何建议/解释。

16 个答案:

答案 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,几乎从不使用ALLSOMEANY

对我来说,编写此查询的明显方法是使用窗口函数:

SELECT name, continent, population 
FROM (SELECT w.*, MAX(population) OVER (PARTITION BY continent) as maxpop
      FROM world w
     ) w
WHERE maxpop < 250000000;

如果您不喜欢该解决方案,请使用明确的joinaggregation

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