sql中的GROUP BY和ORDER BY有什么区别


119

您一般何时使用哪个?实例非常值得鼓励!

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

Answers:



249

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

2
如果表具有age列,并且Peters具有不同的年龄并且查询为SELECT NAME,AGE FROM TABLE GROUP BY NAME,该怎么办?
Varun 2015年

1
您不能返回不在您的组中或具有方法的列。因此,您要么需要增加年龄来分组,要么要做类似Max(Age)的事情。
RiddlerDev 2015年

78

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列表中使用适当的Aggregate函数(如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 |
+---------+-------------+

25

区别恰恰是名称所隐含的含义:group by执行分组操作,order by排序。

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

如果您这样做的SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive话,您会得到活跃和不活跃的客户数。分组依据您指定的字段汇总结果。


3
此外:如果您使用GROUP,则结果不一定要排序;尽管在许多情况下它们可能以直观的顺序出现,但是GROUP子句不能保证。如果要对组进行排序,请始终在GROUP BY之后使用显式的ORDER BY。
戴夫·科斯塔

16

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

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

(按名称排序,价格降序)

GROUP BY使您可以将结果集进行分组,将其分组为逻辑组,然后在这些组上运行聚合查询。例如,您可以选择所有雇员,将其按工作地点分类,然后计算每个工作地点的所有雇员的平均工资。


8

简单,ORDER BY对数据和GROUP BY组进行排序,或组合数据。

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

假设您将查询激发为ORDER BY (student_roll_number),它将显示结果以学生卷数的升序排列。在这里,student_roll_number输入可能会发生多次。

GROUP BY情况下,我们使用这个具有聚合函数,它组数据按聚合函数,我们得到的结果。在这里,如果查询SUM (marks)同时GROUP BY (student_first_name)显示,则将显示属于每个组的学生的分数总和(组中所有成员的名字都相同)。


4

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

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



1

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


4
该答案未提供接受的答案或给出的任何其他答案尚未声明的其他信息。
newfurniturey 2012年

1
  1. GROUP BY将按指定的列聚合记录,这使您可以对未分组的列(例如SUM,COUNT,AVG等)执行聚合功能。ORDER BY更改返回项目的顺序。
  2. 如果您选择SELECT IsActive,则从Users GROUP BY IsActive中选择COUNT(*),则将获得活动客户和非活动客户的计数。分组依据您指定的字段汇总结果。如果您执行SELECT * FROM Customers ORDER BY Name,那么您将获得按客户名称排序的结果列表。
  3. 如果您使用GROUP,则结果不一定要排序;尽管在许多情况下它们可能以直观的顺序出现,但是GROUP子句不能保证。如果要对组进行排序,请始终在GROUP BY之后使用显式的ORDER BY。
  4. 无法通过WHERE子句过滤分组的数据。订单数据可以通过WHERE子句进行过滤。

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.