你什么时候使用哪一个? 例子是非常鼓励的!
我指的是 MySql,但无法想象在另一个 DBMS 上的概念会有所不同
ORDERBY 更改返回项的顺序。
GROUPBY 将按指定的列聚合记录,这允许您对非分组列(例如 SUM、 COUNT、 AVG 等)执行聚合函数。
GROUP BY 用于在选择中对行进行分组,通常在聚合行时使用(例如,计算某些字段具有相同值的一组行的总数、平均值等)。
ORDERBY 用于对 select 语句产生的行进行排序。
区别正如其名称所暗示的那样: 一个组通过执行分组操作,一个顺序通过排序。
如果您执行 SELECT * FROM Customers ORDER BY Name,那么您将获得按客户名称排序的结果列表。
SELECT * FROM Customers ORDER BY Name
如果你做 SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive你会得到一个活跃和非活跃客户的计数。通过根据指定的字段聚合结果来创建组。
SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive
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
GROUP BY
ORDER BY按照提到的字段对结果集进行排序,默认情况下是以升序排列的。
假设您启动一个查询作为 ORDER BY (student_roll_number),它将显示您的结果在学生的学籍号的升序顺序。在这里,student_roll_number条目可能出现不止一次。
ORDER BY (student_roll_number)
student_roll_number
在 GROUP BY的例子中,我们将它与聚合函数一起使用,它根据聚合函数对数据进行分组,然后得到结果。在这里,如果我们的查询有 SUM (marks)和 GROUP BY (student_first_name),它将显示属于每个组的学生的分数总和(其中一个组的所有成员将有相同的名)。
SUM (marks)
GROUP BY (student_first_name)
ORDER BY以升序或降序显示一个字段。而 GROUP BY只在一个输出中显示相同的字段名、 id 等。
应该注意的是,GROUP BY并不总是必要的(至少在 PostgreSQL,并可能在其他 SQL 变体) ,你可以使用 ORDER BY与列表 还有你仍然可以使用 ASC或 DESC 每年列..。
ASC
DESC
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 | +---------+-------------+
GROUP BY子句为我们提供每个记录的分组数据,但是按子句顺序为我们提供 ASC或 DESC的订购数据。
1)为了理解 GROUP BY子句,假设你有一个表,里面有很多记录,你想用一些标准对每条记录进行分组,其中每条记录的值只是相同的值,例如(AVG,SUM,COUNT,MIN,MAX等)在这种情况下你会怎么做?之前由你写这样的询问;
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 关键字在用于聚合函数时的影响。