SQL GROUP BY vs. ORDER BY
本文介绍了GROUP BY和ORDER BY子句的完整概述。它们主要用于组织由SQL查询获得的数据。当学习SQL时,这些子句之间的差异是最常出现困难的地方之一。它们之间的主要区别在于当我们想要使用聚合函数对多组行进行操作时,应使用GROUP BY子句。当我们想要按排序顺序获取查询结果时,应使用ORDER BY子句。在进行比较之前,我们首先了解这些SQL子句。
ORDER BY子句
在SQL查询中,ORDER BY子句用于按升序或降序对查询返回的数据进行排序。如果我们省略排序顺序,它将默认按升序对汇总结果进行排序。ORDER BY子句和GROUP BY子句一样,可以与SELECT语句一起使用。 ASC 表示升序,而 DESC 表示降序。
以下是在SQL语句中使用ORDER BY子句的语法:
SELECT expressions
FROM tables
[WHERE conditions]
ORDER BY expression [ ASC | DESC ];
让我们通过以下示例来了解ORDER BY子句是如何工作的。假设我们有一个包含以下数据的表 开发者
我们可以看到这些结果没有以有序的方式显示。假设我们想要根据”state”列的升序或降序方式来组织结果。在这种情况下,我们需要使用ORDER BY命令来获取所需的结果。我们可以通过执行以下命令来做到这一点:
mysql> SELECT D_name, D_state, D_salary
FROM developers
ORDER BY D_state ASC;
这里是输出的地方,我们将获得期望的结果:
GROUP BY 子句
在 SQL 查询中,GROUP BY 子句用于组织具有相同属性值的数据。通常,我们将其与SELECT 语句一起使用。要记住,我们必须在WHERE 子句之后放置 GROUP BY 子句。此外,它应该位于 ORDER BY 子句之前。
我们经常可以与聚合函数如 SUM、AVG、MIN、MAX 和 COUNT 一起使用该子句从数据库生成汇总报表。重要的是要记住,该子句中的属性必须出现在 SELECT 子句中,而不是在聚合函数下方。如果我们这样做,查询将是不正确的。因此,GROUP BY 子句总是与 SELECT 子句一起使用。GROUP BY 子句的查询是分组查询,并为每个分组对象返回一行。
以下是在 SQL 语句中使用 GROUP BY 子句的语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;
让我们通过一个例子来了解GROUP BY子句的工作原理。在这里,我们将用同一个表演示。
假设我们想要知道 特定状态下开发者的平均工资 并且按照状态列的顺序降序组织结果。在这种情况下,我们需要同时使用GROUP BY和ORDER BY命令来获得所需的结果。我们可以通过执行以下命令来实现:
mysql> SELECT D_state, avg(D_salary) AS salary
FROM developers
GROUP BY D_state
ORDER BY D_state DESC;
这个查询最初形成了一个已经对州进行了分组的中间结果。接下来,对每个州的分组执行 AVG 函数,然后按降序排序结果,最后我们将得到下面所示的期望结果:
GROUP BY和ORDER BY之间的主要区别
以下是Group By和Order By子句之间的主要区别:
- Group By子句用于根据特定列中的相同值对数据进行分组。另一方面,Order By子句对结果进行排序并按升序或降序显示。
- 使用Group By时必须使用聚合函数。而使用Order By时不必使用聚合函数。
- 在聚合函数下,属性不能位于GROUP BY语句下方,而可以位于ORDER BY语句下方。
- Group By子句控制元组的呈现,即根据行的属性值相似性进行分组。相反,Order By子句控制列的呈现,即根据列的属性值按升序或降序进行排序。
- GROUP BY始终位于WHERE子句之后但在ORDER BY语句之前。另一方面,ORDER BY始终在GROUP BY语句之后使用。
GROUP BY vs. ORDER BY比较表格
以下比较表格以简洁的方式解释了它们的主要区别:
序号 | GROUP BY | ORDER BY |
---|---|---|
1. | 用于对具有相同值的行进行分组。 | 对结果集进行升序或降序排序。 |
2. | 允许在CREATE VIEW语句中使用。 | 不允许在CREATE VIEW语句中使用。 |
3. | 控制行的呈现方式。 | 控制列的呈现方式。 |
4. | 在GROUP BY语句下,属性不能在聚合函数下。 | 在ORDER BY语句下,属性可以在聚合函数下。 |
5. | 在SELECT语句中的ORDER BY子句之前始终使用。 | 在SELECT语句中的GROUP BY子句之后始终使用。 |
6. | 必须在GROUP BY中使用聚合函数。 | ORDER BY中不必使用聚合函数。 |
7. | 这里根据行的属性值的相似性进行分组。 | 这里根据列的属性值,无论是升序还是降序,对结果集进行排序。 |
结论
本文比较了GROUP BY和ORDER BY子句。这两个子句都是非常有用的SQL数据库功能。当我们想要形成一组行时,我们使用GROUP BY子句。如果我们想要根据特定列组织数据的升序或降序,我们使用ORDER BY子句。它们之间没有任何关系,因为两者用于两个不同的目的。然而,我们可以将它们组合起来以提供一些特殊用途,或者根据情况单独使用它们。我们只能在SELECT语句中使用这些子句。