sql中GROUP BY和ORDER BY之间的区别是什么

veh*_*zzz 114 mysql sql database

你什么时候使用哪种?非常鼓励这些例子!

我指的是MySql,但无法想象这个概念在另一个DBMS上是不同的

Rid*_*Dev 242

ORDER BY改变了返回项目的顺序.

GROUP BY将按指定的列聚合记录,这允许您在非分组列(例如SUM,COUNT,AVG等)上执行聚合函数.

TABLE:
ID NAME
1  Peter
2  John
3  Greg
4  Peter

SELECT *
FROM TABLE
ORDER BY NAME

= 
3 Greg
2 John
1 Peter
4 Peter

SELECT Count(ID), NAME
FROM TABLE
GROUP BY NAME

= 
1 Greg
1 John 
2 Peter

SELECT NAME
FROM TABLE
GROUP BY NAME
HAVING Count(ID) > 1

=
Peter
Run Code Online (Sandbox Code Playgroud)

  • 如果表有`age`列,Peters有不同的年龄,查询是SELECT NAME,AGE FROM TABLE GROUP BY NAME怎么办? (2认同)
  • 您不能返回不在分组依据中或没有方法的列。因此,您要么需要将年龄添加到分组依据中,要么执行诸如 Max(Age) 之类的操作。 (2认同)

CMe*_*rat 77

ORDER BY改变了返回项目的顺序.

GROUP BY将按指定的列聚合记录,这允许您在非分组列(例如SUM,COUNT,AVG等)上执行聚合函数.

  • 没有附带的例子,这个陈述几乎没有任何意义. (122认同)
  • 我认为链接页面上的第二个例子足以理解其中的差异http://www.tutorialspoint.com/sql/sql-group-by.htm (2认同)

Jer*_*yal 73

ORDER BY:按升序或降序对数据进行排序.

考虑一下CUSTOMERS表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

以下是一个示例,它将按NAME的升序对结果进行排序:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;
Run Code Online (Sandbox Code Playgroud)

这将产生以下结果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

GROUP BY:将相同的数据分组.

现在,CUSTOMERS表具有以下重复名称的记录:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

如果要将相同的名称分组为单个名称,则GROUP BY查询将如下所示:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;
Run Code Online (Sandbox Code Playgroud)

这将产生以下结果:(对于相同的名称,它将选择最后一个,最后按升序对列进行排序)

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

正如你所推断的那样没有像sum,avg等SQL函数一样没用.

所以通过这个定义来理解GROUP BY的正确使用:

GROUP BY子句通过在SELECT列表中使用适当的Aggregate函数(如COUNT(),SUM),将相同的行汇总到单个/不同的组中,并通过每个组的摘要返回单个行,从而处理查询返回的行. (),MIN(),MAX(),AVG()等.

现在,如果您想知道每个客户(名称)的工资总额,那么GROUP BY查询将如下:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;
Run Code Online (Sandbox Code Playgroud)

这将产生以下结果:(相同名称的工资总和,并在删除相同名称后对NAME列进行排序)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+
Run Code Online (Sandbox Code Playgroud)


Max*_*ing 25

区别正是名称所暗示的:一个分组执行分组操作,一个分类排序.

如果这样做,SELECT * FROM Customers ORDER BY Name您将获得按客户名称排序的结果列表.

如果您这样做,SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive您将获得活跃和非活跃客户的数量.该组根据您指定的字段聚合结果.

  • 而且:如果你是GROUP,结果不一定要排序; 虽然在许多情况下它们可能以直观的顺序出现,但GROUP条款并不能保证这一点.如果您希望对组进行排序,请始终在GROUP BY之后使用明确的ORDER BY. (3认同)

Pat*_*and 15

它们具有完全不同的含义,并没有真正的相关性.

ORDER BY允许您根据不同的标准对结果集进行排序,例如首先按名称从az排序,然后按价格从最高到最低排序.

(按名称订购,价格DESC)

GROUP BY允许您获取结果集,将其分组为逻辑组,然后对这些组运行聚合查询.例如,您可以选择所有员工,按工作地点对他们进行分组,并计算每个工作场所所有员工的平均工资.


Swa*_*kar 8

简单,ORDER BY订购数据和GROUP BY组,或组合数据.

ORDER BY 按照提到的字段对结果集进行排序,默认情况下按升序排序.

假设您正在触发查询ORDER BY (student_roll_number),它将以学生掷骰数字的升序显示结果.在这里,student_roll_number输入可能不止一次.

GROUP BY这种情况下,我们将它与聚合函数一起使用,并根据聚合函数对数据进行分组,然后得到结果.在这里,如果我们的查询SUM (marks)同时GROUP BY (student_first_name)显示属于每个组的学生的标记总和(其中组的所有成员将具有相同的名字).