SQL Group By 和 Order By的区别
In SQL中,我们有两个常见的子句可帮助我们对数据进行排序:Group By和Order By。
Group By子句通过根据查询时指定的列对数据进行分组来对数据进行排序,并与聚合函数一起使用。Order By子句允许我们按字母顺序或数字顺序以升序或降序的方式组织数据集。
Group By子句
Group By子句定义了您可能在某些计算中希望将其作为整体评估的组。该子句允许我们将相同的数据分组为一个子集,而不是列出每个单独的记录。
Group By子句的查询是一个分组查询,它为每个对象返回一行;它通常与聚合函数(如MIN(),MAX(),SUM(),AVG()和COUNT())一起使用。
Group By子句与SELECT语句一起使用,并放置在WHERE子句之后或HAVING子句之前。如果使用Order By子句,Group By子句应位于Order By子句之前。
语法
以下是 Group By 子句的语法 –
SELECT column_name, aggregate_function() FROM table_name
WHERE condition GROUP BY column_name;
在上述语法中,aggregate_function()和WHERE子句是可选的。 WHERE子句可用于传递条件,而aggregate_function()是诸如count、calculate average、sum等聚合函数之一。
示例
在下面的SQL查询中,我们使用Group by子句根据customers表中的age值对行进行分组。
假设我们已经创建了一个名为Customers的表,其中包含客户的个人详细信息,包括姓名、年龄、地址和薪水等。
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在,使用以下INSERT语句将值插入到该表中:-
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );
表将被创建为 –
+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+
以下是按年龄统计并按年龄分组的查询 –
SELECT AGE, COUNT(AGE) AS NumberOfAge from customers GROUP BY AGE;
输出
当我们运行上面的查询时,我们得到两列年龄和年龄数量。年龄数量表示具有相同值的年龄有多少个。
+------+-------------+
| age | NumberOfAge |
+------+-------------+
| 32 | 1 |
| 23 | 2 |
| 25 | 1 |
| 27 | 1 |
| 22 | 1 |
| 24 | 1 |
+------+-------------+
排序语句
按特定顺序列出查询结果是一种常见需求,这就是为什么SQL提供了“Order By”子句。Order By子句用于对SQL查询结果进行升序或降序排序。
“Order by”子句位于SELECT语句的最末尾,在”WHERE”子句之后,用于定义确定排序顺序的列。排序顺序可以是升序或降序。
“DESC”关键字允许我们按降序显示。而”ASC”关键字允许我们按升序显示。如果不提供关键字,默认情况下列的数据将按升序排列。
语法
使用ORDER BY子句对列值进行升序/降序排序的语法如下:
SELECT column_name FROM table_name ORDER BY ASC/DSC;
示例
下面的SQL查询检索ID和NAME,并使用Order by子句按照顾客表中NAME以升序排序。
SELECT ID, NAME FROM customers ORDER BY NAME;
输出
当我们运行上述查询时,我们得到一个有两列的小表:ID和NAME。表按照名称排序。
+------+----------+
| ID | NAME |
+------+----------+
| 7 | Aman |
| 3 | Chaitali |
| 4 | Hardik |
| 2 | kaushik |
| 5 | Komal |
| 6 | Muffy |
| 1 | Ramesh |
+------+----------+
示例
在下面的示例中,我们正在检索NAME,计算AVG SALARY,并使用GROUP BY子句按NAME分组表格。
SELECT NAME, AVG(SALARY) FROM customers GROUP BY NAME;
输出
当我们运行上面的查询时,我们会得到姓名和平均工资。平均工资与实际工资相同,因为没有两个或多个记录具有相同的姓名。因此,平均工资与实际工资相同,并且表按姓名分组,如下表所示。
+----------+-------------+
| NAME | AVG(SALARY) |
+----------+-------------+
| Ramesh | 2000.0000 |
| kaushik | 2000.0000 |
| Chaitali | 6500.0000 |
| Hardik | 8500.0000 |
| Komal | 4500.0000 |
| Muffy | 10000.0000 |
| Aman | NULL |
+----------+-------------+
示例
在以下示例中,我们正在检索NAME,AGE和SALARY,并使用ORDER BY子句按AGE进行升序排列。
SELECT NAME, AGE, SALARY FROM customers ORDER BY AGE;
输出
运行上面的查询时,我们获得了姓名、年龄和薪水,并且所有列按照年龄进行排序,以升序显示如下表所示。
+----------+------+--------+
| NAME | AGE | SALARY |
+----------+------+--------+
| Komal | 22 | 4500 |
| kaushik | 23 | 2000 |
| Aman | 23 | NULL |
| Muffy | 24 | 10000 |
| Chaitali | 25 | 6500 |
| Hardik | 27 | 8500 |
| Ramesh | 32 | 2000 |
+----------+------+--------+
分组(Group by) vs 排序(Order by)
以下表格总结了分组语句(Group By)和排序语句(Order by)之间的区别:
编号 | 分组方式 | 排序方式 |
---|---|---|
1 | 将具有相同值的行进行分组。 | 按升序或降序对列进行排序。 |
2 | 可以在创建视图语句中使用。 | 不允许在创建视图语句中使用。 |
3 | 属性不能被分配给Group By语句中的聚合函数。 | 属性可以被分配给Order By语句中的聚合函数。 |
4 | 始终在select语句中的Order by子句之前使用。 | 始终在select语句中的Group by子句之后使用。 |
5 | 这里根据行的属性值之间的相似性进行分组。 | 这里根据列的属性值将结果集按升序或降序排序。 |
6 | 控制行的显示方式。 | 控制列的显示方式。 |
7 | 可以在Group by中使用聚合函数。 | 这里在Order by中不强制使用聚合函数。 |