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

时间:2009-08-14 11:50:07

标签: sql mysql database

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

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

11 个答案:

答案 0 :(得分:229)

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

答案 1 :(得分:75)

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

GROUP BY将按指定列聚合记录,这些列允许您对非分组列(例如SUM,COUNT,AVG等)执行聚合功能。

答案 2 :(得分:66)

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 |
+----+----------+-----+-----------+----------+

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

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

这会产生以下结果:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

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 |
+----+----------+-----+-----------+----------+

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

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

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

    +----+----------+-----+-----------+----------+   
    | 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 |
    +----+----------+-----+-----------+----------+

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

所以请仔细阅读这个定义,以了解GROUP BY的正确用法:

  

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

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

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

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

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+

答案 3 :(得分:23)

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

如果您执行SELECT * FROM Customers ORDER BY Name,则会获得按客户名称排序的结果列表。

如果您执行SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive,您将获得有效和无效客户的计数。该组根据您指定的字段汇总结果。

答案 4 :(得分:14)

它们具有完全不同的含义,并且根本不相关。

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

(按名称订购,价格DESC)

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

答案 5 :(得分:8)

简单,ORDER BY命令数据和GROUP BY组,或合并数据。

ORDER BY按照上述字段对结果集进行排序,默认情况下按升序排序。

假设您正在以ORDER BY (student_roll_number)方式触发查询,它会以学生掷骰数字的升序显示结果。在这里,student_roll_number条目可能会多次出现。

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

答案 6 :(得分:4)

GROUP BY用于对选择中的行进行分组,通常是在聚合行时(例如,计算一组行的总计,平均值等,对某些字段使用相同的值)。

ORDER BY用于对select语句产生的行进行排序。

答案 7 :(得分:4)

那里有一些很好的例子。就像从webcheatsheet中添加我自己的,它提供了很好的清晰示例,并让你执行自己的SQL。

SQL Order By

SQL Group By

答案 8 :(得分:1)

ORDER BY以升序或降序显示字段。虽然GROUP BY只在一个输出中显示相同的字段名,但ID等。

答案 9 :(得分:1)

  1. GROUP BY将按指定列聚合记录,允许您对非分组列(例如SUM,COUNT,AVG等)执行聚合功能。 ORDER BY改变了退回商品的顺序。
  2. 如果你这样做 SELECT IsActive,COUNT(*)FROM Customers GROUP BY IsActive 你得到了活跃和不活跃客户的数量。该组根据您指定的字段聚合结果。如果你这样做 SELECT * FROM Customers ORDER BY Name 然后,您将获得按客户名称排序的结果列表。
  3. 如果您是GROUP,结果不一定要排序;虽然在许多情况下它们可能以直观的顺序出现,但GROUP条款并不能保证这一点。如果您希望对组进行排序,请始终在GROUP BY之后使用显式ORDER BY。
  4. WHERE子句无法过滤分组数据。订单数据可以通过WHERE子句进行过滤。

答案 10 :(得分:0)

应该注意GROUP BY并不总是必要的(至少在PostgreSQL中,可能在其他SQL变体中),您可以将ORDER BY与列表一起使用仍然可以使用ASCDESC 列...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;