希望更好地理解此查询的工作原理?

时间:2014-12-17 16:10:33

标签: mysql sql mariadb

我对"总和和#34的#7感到有点困惑。 SQLZoo

部分

问题是:

  

为每个大陆显示大陆和国家的数量   人口至少有1000万。

这个答案有效,但我不确定如何:

SELECT DISTINCT(continent), COUNT(name)
FROM world
WHERE name IN 
    ( SELECT name 
      FROM world 
      WHERE population > 10000000 ) 
GROUP BY continent

然而,直觉上没有意义。我没有看到有这个子查询是否有意义:

          SELECT name 
          FROM world 
          WHERE population > 10000000 

主要是因为我们正在返回所有 10,000,000+人口的国家..。但是,我们希望将每个大陆与其10,000,000多个国家/地区的小组联系起来。

SQL是否自动知道将continent与其自己的countries连接?

3 个答案:

答案 0 :(得分:2)

没有。该查询假定name列是唯一的。

顺便说一下,这是一个糟糕的查询。例如,它表明distinct是一个函数。编写此查询的更好方法是使用条件聚合:

SELECT continent, sum(case when population >= 10000000 then 1 else 0 end)
FROM world
GROUP BY continent;

注意:

我意识到第一个查询会过滤掉Antartica,所以这是一个更好的查询:

SELECT continent, COUNT(*)
FROM world
WHERE population >= 10000000 
GROUP BY continent;

我不知道为什么SQLZoo会对非常简单的事情进行如此复杂的查询。

答案 1 :(得分:1)

DISTINCT不是一个函数,它适用于整行/结果集! (在大陆周围添加冗余括号没有区别。)

此处也不需要DISTINCT,因为您已经在进行GROUP BY。

答案 2 :(得分:1)

子查询选择具有所需人口的所有国家/地区name。它正在使用它来过滤实际查询,从continent中选择world,但只有nameIN从子查询返回的列表。