我读了“Sams在10分钟内自学SQL,第三版”一书,在第10课“分组数据”的“创建组”一节中,我无法理解以下内容:
“除了聚合计算语句之外,SELECT语句中的每一列都必须出现在GROUP BY子句中。”
为什么呢?我试过这个,我认为这不是真的。 例如,考虑一个“世界”表格,其中包含“大陆”,“国家”,“人口”等列。
SELECT continent, country
FROM World
GROUP BY continent;
根据这本书,这应该会导致错误,对吧?但事实并非如此。我可以根据非洲大陆(因此我们在7大洲的结果)和每个大洲旁边的国家/地区名称对数据进行分组。
喜欢这个
continent country
North America Canada
South America Brazil
Europe France
Africa Cameroon
Asia Japan
Australia New Zealand
Antarctica TuxLand
答案 0 :(得分:4)
您最有可能在MySQL
条款中使用SELECT
allows ungrouped and unaggregated expressions。
这当然违反了标准。
这是为了简化GROUP BY
上的联接PRIMARY KEY
:
SELECT a.*, SUM(b.value)
FROM a
JOIN b
ON b.a_id = a.id
GROUP BY
a.id
通常,您可以将a
中的所有列添加到GROUP BY
子句中,也可以使用子查询。
MySQL
允许您不要这样做,因为a
的所有值都保证与PRIMARY KEY
的给定值(分组在一起)相同。
答案 1 :(得分:0)
这是正确的,并且在某些形式的SQL(如MySQL)中不会产生任何错误。您可以选择在多个列上使用GROUP BY语句,但这不是必需的。
答案 2 :(得分:0)
GROUP BY将列出指定列的第一个结果 - 因此在您的情况下,它将返回第一个国家/大陆对。
PostgreSQL和MySQL允许这样做,使用一个字段为。
本教程可能假定您应该在所有字段上使用GROUP BY,因此根据您选择的内容,您不会丢失任何数据 - 它将显示上述示例中的每个国家/地区,但仅显示一次。
这是一个示例表:
Continent | Country | Random_Field
---------------------------------------------
North America Canada Cake
North America Canada Dog
South America Brazil Cat
Europe France Frog
Africa Cameroon House
Asia Japan Gadget
Asia India Dance
Australia New Zealand Frodo
Antarctica TuxLand Linux
在你的第一个声明中:
SELECT continent, country
FROM World
GROUP BY continent;
输出结果为:
Continent | Country
--------------------------
North America Canada
South America Brazil
Europe France
Africa Cameroon
Asia Japan
Australia New Zealand
Antarctica TuxLand
请注意,尽管存在差异,但其中一个亚洲行已经丢失。
在两者上使用GROUP BY:
SELECT continent, country
FROM World
GROUP BY continent, country;
会屈服:
Continent | Country
-----------------------------
North America Canada
South America Brazil
Europe France
Africa Cameroon
Asia Japan
Asia India
Australia New Zealand
Antarctica TuxLand