我正在运行一些查询而没有获得预期的结果。
SELECT Name, Population FROM City
WHERE Population = (SELECT Min(Population) FROM City);
这给我带来了Adamstown 42.
然后我尝试了这个(不太确定)
SELECT Name, Min(Population) FROM City;
它带来了喀布尔42。
我理解第一个查询OK,但是我没有得到第二个查询应该带来的内容,或者它是否有用。
答案 0 :(得分:3)
我刚刚下载了数据集以便查看。
第一个查询正确地计算出最小总体为42,然后返回所有具有总体42的行(单行符合此条件)。
第二个问题是确定最小人口数为42,然后需要在“名称”中返回一些值。柱。不幸的是,我们没有按名称(或任何东西)分组;组中的行(表中的所有行)都有自己的名称。而不是吐出错误,mySQL似乎正在返回第一行的名称;喀布尔。
但显然,这第二个查询有点无意义。第一个查询更可取。
中实际描述了此行为MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。 ...服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。
答案 1 :(得分:1)
您发布的查询之间存在细微差别。
第一个:
SELECT Name, Population FROM City
WHERE Population = (SELECT Min(Population) FROM City);
您正在尝试获取Population = Min(population)
;然后将其评估为Population = 42
第二个:
SELECT Name, Min(Population) FROM City;
您只是想提取Name
,而minimum population
并不意味着特定记录保留最低人口。
答案 2 :(得分:1)
来自MySQL文档:http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html
MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。
要获得人口最少的城市,您可以使用第一个查询。