你什么时候使用哪种?非常鼓励这些例子!
我指的是MySql,但无法想象这个概念在另一个DBMS上是不同的
答案 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)
答案 8 :(得分:1)
ORDER BY
以升序或降序显示字段。虽然GROUP BY
只在一个输出中显示相同的字段名,但ID等。
答案 9 :(得分:1)
答案 10 :(得分:0)
应该注意GROUP BY
并不总是必要的(至少在PostgreSQL中,可能在其他SQL变体中),您可以将ORDER BY
与列表和一起使用仍然可以使用ASC
或DESC
每列...
SELECT name_first, name_last, dob
FROM those_guys
ORDER BY name_last ASC, name_first ASC, dob DESC;