GROUPBY 和 ORDERBY 在 sql 中的区别是什么

你什么时候使用哪一个? 例子是非常鼓励的!

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

279364 次浏览

ORDERBY 更改返回项的顺序。

GROUPBY 将按指定的列聚合记录,这允许您对非分组列(例如 SUM、 COUNT、 AVG 等)执行聚合函数。

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

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

区别正如其名称所暗示的那样: 一个组通过执行分组操作,一个顺序通过排序。

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

如果你做 SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive你会得到一个活跃和非活跃客户的计数。通过根据指定的字段聚合结果来创建组。

ORDERBY 更改返回项的顺序。

GROUPBY 将按指定的列聚合记录,这允许您对非分组列(例如 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 允许您根据不同的条件对结果集进行排序,例如首先按名称从 a-z 进行排序,然后按价格从高到低进行排序。

(订单名称,价格 DESC)

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

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

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

假设您启动一个查询作为 ORDER BY (student_roll_number),它将显示您的结果在学生的学籍号的升序顺序。在这里,student_roll_number条目可能出现不止一次。

GROUP BY的例子中,我们将它与聚合函数一起使用,它根据聚合函数对数据进行分组,然后得到结果。在这里,如果我们的查询有 SUM (marks)GROUP BY (student_first_name),它将显示属于每个组的学生的分数总和(其中一个组的所有成员将有相同的名)。

ORDER BY以升序或降序显示一个字段。而 GROUP BY只在一个输出中显示相同的字段名、 id 等。

应该注意的是,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;

ORDER BY: 按升序或降序对数据进行排序。

考虑一下 顾客表:

+----+----------+-----+-----------+----------+
| 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: 将相同的数据分组。

现在,顾客表有以下重复名称的记录:

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

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

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 函数,它将毫无用处。

所以通过这个定义来理解 GROUPBY 的正确用法:

GROUPBY 子句通过汇总来处理查询返回的行 将相同的行分成单个/不同的组,并返回单个行 通过使用适当的聚合,将每个组的摘要与 函数,如 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 |
+---------+-------------+
  1. GROUP BY 将根据指定的列聚合记录,该列允许您对非分组列(例如 SUM、 COUNT、 AVG 等)执行聚合函数。ORDERBY 更改返回项的顺序。
  2. 如果你愿意的话 通过 IsActive 从客户组中选择 IsActive,COUNT (*) 你会得到一个活跃和非活跃客户的计数。通过根据指定的字段聚合结果来创建组。如果你愿意的话 按名称从客户中选择 * 然后您将得到按照客户名称排序的结果列表。
  3. 如果使用 GROUP,则结果不一定排序; 尽管在许多情况下,它们可能以直观的顺序出现,但 GROUP 子句不能保证这一点。如果希望对组进行排序,请始终在 GROUPBY 之后显式使用 ORDERBY。
  4. 分组数据不能由 WHERE 子句筛选。订单数据可以由 WHERE 子句筛选。

GROUP BY子句为我们提供每个记录的分组数据,但是按子句顺序为我们提供 ASCDESC的订购数据。

1)为了理解 GROUP BY子句,假设你有一个表,里面有很多记录,你想用一些标准对每条记录进行分组,其中每条记录的值只是相同的值,例如(AVG,SUM,COUNT,MIN,MAX等)在这种情况下你会怎么做?之前由你写这样的询问;

select avg(sal), job
from emp
where job='MANAGER';


select avg(sal), job
from emp
where job='DIRECTOR';


select avg(sal), job
from emp
where job='USER';

在上面的查询中,它们根据工作标准返回 avg (sal)每个人,但是 sql 有一种更好的方法,可以根据具有相同值的每条记录的某些标准为我们提供分组。因此,如果不像上面那样编写更复杂的查询,您只能编写一个查询,并通过以下方法查看每个记录组的结果

select avg(sal), job
from emp
group by job;

这将按条件返回某个组的 avg (sal)记录的每个相同值。 注意 GROUPBY 关键字在用于聚合函数时的影响。