我对"总和和#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
连接?
答案 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
,但只有name
是IN
从子查询返回的列表。