【问题标题】:Sams Teach Yourself SQL in 10 minutes - Question about GROUP BYSams 10 分钟自学 SQL - 关于 GROUP BY 的问题
【发布时间】:2011-06-11 02:14:41
【问题描述】:

我阅读了“Sams Teach Yourself SQL in 10 minutes, Third Edition”一书和第 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

【问题讨论】:

    标签: sql select group-by


    【解决方案1】:

    您很可能在SELECT 子句中使用MySQL 其中allows ungrouped and unaggregated expressions

    这当然是违反标准的。

    这是为了简化 GROUP BYPRIMARY 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 的给定值(已分组)都保证是相同的。

    【讨论】:

    • 非常感谢。是的,我正在使用 MySQL。
    【解决方案2】:

    这是正确的,在某些形式的 SQL(例如 MySQL)中应该不会产生错误。您可以选择在多个列上使用 GROUP BY 语句,但这不是必需的。

    【讨论】:

      【解决方案3】:

      GROUP BY 将列出指定列的第一个结果 - 因此在您的情况下,它将返回第一个国家/大陆对。

      PostgreSQL 和 MySQL 允许这样做,使用一个字段作为 group by。

      本教程可能假设您应该在所有字段上使用 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 
      

      【讨论】:

        猜你喜欢
        • 2010-09-29
        • 2023-03-08
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        相关资源
        最近更新 更多