代码之家  ›  专栏  ›  技术社区  ›  Panzercrisis

当我阅读其他关于这个的文章时,我仍然看不到group by和order by之间的SQL差异。这是怎么一回事?

  •  2
  • Panzercrisis  · 技术社区  · 14 年前

    我已经在这个问题上开始了自己的线程,这样就可以减少在别人的线程上发布它的开销。我在SQL中很难理解group by和order by之间的区别。我知道已经有了一些线索,但它们没有给我一个有用的答案。下面是同一个答案的大致内容,我刚刚在其他线程中看到了多次重复:

    ORDER BY根据行在某一列中的值对行进行排序,而GROUP BY则根据行在某一列中的值对行进行分组,以帮助聚合函数。

    对我来说,这似乎是用两个不同的词来描述同样的事情。我基本上需要完全解释一下。问题是order by的“group things”与group by的“group things”方式相同,可能唯一的例外是group by可能没有保证存在某种特殊顺序。此外,我只是不知道GroupBy对于OrderBy的聚合函数有什么帮助。

    请以与大多数人不同的方式解释差异。谢谢!

    4 回复  |  直到 11 年前
        1
  •  1
  •   BobTurbo    14 年前

    而不是:

    a   2
    a   4
    a   2
    a   1
    a   2
    

    group by将显示一个“a”,然后显示另一列的某种聚合(可能是平均值)。

    ORDERBY将保留所有的a a a a a a,并且只根据其中一列对行进行排序(因此可能首先是1)。

    因此,在本例中,group by最终将生成一行,而order by将具有与原始行相同的行数。

        2
  •  4
  •   cletus    14 年前

    最好用一个例子来说明这一点。考虑个人桌:

    ID  Gender  Name
     1    M     Fred
     2    M     Bob
     3    F     Jane
     4    M     Alex
     5    F     Mary
    

    运行:

    SELECT * FROM person ORDER BY gender
    

    你得到:

    ID  Gender  Name
     3    F     Jane
     5    F     Mary
     1    M     Fred
     2    M     Bob
     4    M     Alex
    

    但运行:

    SELECT gender, COUNT(1) FROM person GROUP BY gender
    

    你得到:

    Gender  COUNT(1)
      M        3
      F        2
    

    你需要了解的另一个方面是 WHERE HAVING . 考虑:

    SELECT gender, COUNT(1) FROM person WHERE name = 'Bob' GROUP BY gender
    

    结果:

    Gender  COUNT(1)
      M        1
    

    但是:

    SELECT gender, COUNT(1) FROM person GROUP BY gender HAVING COUNT(1) > 2
    

    结果:

    Gender  COUNT(1)
      M        3
    

    基本上 ORDER BY 更改行的顺序(然后可以“管道”到聚合中),但是 筛选聚合结果。换一种说法, 在哪里? 影响输入到 GROUP BY , 影响输出。

        3
  •  1
  •   Larry K    14 年前

    ORDER BY排序结果--数据库中每个匹配(WHERE子句)行一行结果

    与数据库中的匹配行(WHERE子句)相比,Group By提供的结果行更少。

    你有一张每个老师的学生平均成绩表(0-4.0)

    订购人会给你所有的学生所有老师的分数

    按老师分组,每个老师给你一个结果。通常你会选择像平均GPA字段这样的内容,这样每个老师都会得到一个GPA数字。

        4
  •  1
  •   Guffa    14 年前

    这个 order by 子句用于按条件对结果排序,而 group by 子句用于将记录分组,其中记录的标准是通用的。

    摆桌子 Test 看起来像这样:

    Name  Number
    -----------------
    B     1
    B     2
    C     3
    C     4
    C     5
    A     6
    A     7
    A     8
    

    如果运行此查询:

    select Name, Number
    from Test
    order by Name
    

    结果是所有记录都排序:

    A     6
    A     7
    A     8
    B     1
    B     2
    C     3
    C     4
    C     5
    

    分组记录时,结果不是记录,而是组。您可以使用聚合,例如 count , min max 获取涉及该组中所有记录的特征。

    如果运行此查询:

    select Name, count(*) as Cnt, min(Number) as Min, max(Number) as Max
    from Test
    group by Name
    

    结果是包含三个组,因为有三个不同的名称:

    Name  Cnt  Min  Max
    ----------------------
    B     2    1    2
    C     3    3    5
    A     3    6    8
    

    注意,分组并不意味着结果是根据分组的条件排序的。如果你也想要,你会同时使用 小组通过 按顺序 ,结果将在分组后进行排序。