Sams在10分钟内自学SQL - 关于GROUP BY的问题

时间:2011-01-18 13:00:37

标签: sql select group-by

我读了“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

3 个答案:

答案 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