为什么使用MAX的相关子查询返回多行?

时间:2013-12-07 14:05:09

标签: mysql

执行以下mysql命令时,会出现相关的子查询 返回多行。

问题1.为什么MAX能够返回多行?
问题2.如何使用'='运算符来匹配多行?

SELECT Continent, Name, Population 
FROM Country c 
WHERE Population = (SELECT MAX(Population) 
                    FROM Country c2 
                     WHERE c.Continent=c2.Continent AND Population > 0);


+---------------+--------------------+------------+
| continent     | name               | population |
+---------------+--------------------+------------+
| Oceania       | Australia          |   18886000 |
| South America | Brazil             |  170115000 |
| Asia          | China              | 1277558000 |
| Africa        | Nigeria            |  111506000 |
| Europe        | Russian Federation |  146934000 |
| North America | United States      |  278357000 |
+---------------+--------------------+------------+
6 rows in set (0.22 sec)

2 个答案:

答案 0 :(得分:1)

from your comment above,此查询是您要查找的查询。这会处理重复项。

SELECT Continent, Name, Population 
FROM Country c 
WHERE Population = (SELECT MAX(Population) FROM Country)

另一个查询不处理重复的

SELECT Continent, Name, Population 
FROM Country c 
ORDER BY Population DESC
LIMIT 1

答案 1 :(得分:1)

发生的是这一部分:

WHERE c.Continent=c2.Continent AND Population > 0);

使外部查询返回国家/地区表中的每个大陆,以及人口最多的国家/地区(通过INNER查询中的MAX(人口))。

=在这种情况下起作用,因为子查询只返回每个大洲的一行,但最终你仍然会得到每个大陆的结果,而不是总人口最多的国家。

与做同样的事情:

SELECT Continent, Name, Population 
FROM Country c 
WHERE c.Continent = 'Oceania' 
   AND Population = (SELECT MAX(Population) 
                     FROM Country c2 
                     WHERE c2.Continent = 'Oceania' AND Population > 0);

但是,由于您没有将Continents限制为特定的大陆,因此对于表中的每个大陆都会执行相同的操作。

如果您只想返回人口最多的国家/地区,您可以这样做:

SELECT Continent, Name, Population 
FROM Country c 
ORDER BY population DESC
LIMIT 1;