sql和GROUP BY和ORDER BY有什么不同?
你什么时候使用一般? 例如,非常鼓励!
我指的是如此MySql,但不能想象在另一个DBMS上的概念是不同的
ORDER BY更改项目返回的顺序。
GROUP BY将根据指定的列汇总logging,使您可以在非分组列(例如SUM,COUNT,AVG等)上执行聚合函数。
ORDER BY更改项目返回的顺序。
GROUP BY将根据指定的列汇总logging,使您可以在非分组列(例如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
ORDER BY:按升序或降序对数据进行sorting。
考虑一下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的升序对结果进行sorting:
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表具有以下重复名称的logging:
+----+----------+-----+-----------+----------+ | 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;
这将产生以下结果:(对于相同的名称,它会select最后一个,最后按升序对列进行sorting)
+----+----------+-----+-----------+----------+ | 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子句对查询返回的行进行处理,方法是将相同的行汇总到单个/ distinct组中,并使用SELECT列表中适当的Aggregate函数(如COUNT(),SUM (),MIN(),MAX(),AVG()等
现在,如果您想知道每个客户(名称)的工资总额,那么GROUP BY查询将如下所示:
SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS GROUP BY NAME;
这将产生以下结果:(相同名称的薪水总和,删除相同的名称后sortingNAME列)
+---------+-------------+ | NAME | SUM(SALARY) | +---------+-------------+ | Hardik | 8500.00 | | kaushik | 8500.00 | | Komal | 4500.00 | | Muffy | 10000.00 | | Ramesh | 3500.00 | +---------+-------------+
区别正是名字所暗示的:一个组通过执行分组操作,并按顺序sorting。
如果您执行SELECT * FROM Customers ORDER BY Name
那么您将得到按客户名称sorting的结果列表。
如果您执行SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive
则会计入活动和非活动客户的数量。 该组通过根据您指定的字段汇总结果。
他们有完全不同的含义,根本就没有关系。
ORDER BY允许您根据不同的标准对结果集进行sorting,例如先按来自az的名称进行sorting,然后按照从最高到最低的价格进行sorting。
(ORDER BY名称,价格DESC)
GROUP BY允许您获取结果集,将其分组为逻辑组,然后在这些组上运行聚合查询。 例如,您可以select所有员工,按工作地点分组,并计算每个工作场所所有员工的平均工资。
很简单, ORDER BY
命令数据和GROUP BY
组,或组合数据。
ORDER BY
按照提到的字段对结果集进行sorting,缺省情况下按升序排列。
假设你用ORDER BY (student_roll_number)
激发了一个查询,它会显示你的结果是学生的卷号的升序。 这里, student_roll_number
项可能会多次出现。
在GROUP BY
情况下,我们使用这个集合函数,并根据集合函数对数据进行分组,并得到结果。 在这里,如果我们的查询与GROUP BY (student_first_name)
SUM (marks)
一起有SUM (marks)
,它将显示属于每个组的学生的标记总和(组中的所有成员将具有相同的名字)。
GROUP BY用于对select中的行进行分组,通常在聚合行时(例如,对于某些字段的相同值的一组行,计算总计,平均值等)。
ORDER BY用于对select语句产生的行进行sorting。
那里有一些很好的例子 就像从webcheatsheet添加我自己的,它提供了很好的清晰的例子,以及让你执行自己的SQL。
SQLsorting依据
SQL组By
ORDER BY
以升序或降序显示字段。 虽然GROUP BY
只在一个输出中显示相同的字段名称,ID等。
- GROUP BY将根据指定的列聚合logging,这允许您在非分组列(例如SUM,COUNT,AVG等)上执行聚合函数。 ORDER BY更改项目返回的顺序。
- 如果您执行SELECT IsActive,COUNT(*)FROM Customers GROUP BY IsActive,则会计入活动和非活动客户的数量。 该组通过根据您指定的字段汇总结果。 如果您执行SELECT * FROM Customers ORDER BY Name,那么您将得到按客户名称sorting的结果列表。
- 如果你是GROUP,结果不一定是sorting的; 尽pipe在很多情况下它们可能会以一种直观的顺序出现,但GROUP条款并不能保证这一点。 如果您希望您的组sorting,请务必在GROUP BY之后使用明确的ORDER BY。
- 分组数据不能被WHERE子句过滤。 订单数据可以通过WHERE子句过滤。
应该指出, GROUP BY
并不总是必要的(至less在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;