数据库中的GROUP BY与ORDER BY、WHERE与HAVING

本文深入探讨了SQL查询中的ORDER BY用于排序,GROUP BY实现分类汇总,以及HAVING筛选聚合后的数据。通过具体示例,讲解了如何使用这些语句提升数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据库的选择操作SELECT中经常会用到聚合条件,最常见也是最常用的是WHERE语句(本文不会着重介绍WHERE语句)。

现假设在某数据库中有一个名为PRODUCT的表,表结构及内部数据如下

CREATE TABLE PRODUCT(
    Pno CHAR(20) PRIMARY KEY,
    Pname CHAR(10),
    Pamount INT
);
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 001 | a     |       1 |
| 002 | a     |       2 |
| 003 | b     |       1 |
| 004 | b     |       2 |
| 005 | b     |       6 |
+-----+-------+---------+

1.ORDER BY

这一语句主要是显示排序用,如果选择了多条类似的记录,那么在查询语句中便可用到此语句,使用如下

SELECT * FROM PRODUCT ORDER BY Pno ASC;

上面的语句根据Pno的值来对产品记录进行升序排列(仅当次查询有效),即根据ORDER BY后跟的列名进行升序排列。

mysql> SELECT * FROM PRODUCT ORDER BY Pno ASC;
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 001 | a     |       1 |
| 002 | a     |       2 |
| 003 | b     |       1 |
| 004 | b     |       2 |
| 005 | b     |       6 |
+-----+-------+---------+
5 rows in set (0.00 sec)

如果需要降序排列,只需把最后的ASC更换为DESC即可。

mysql> SELECT * FROM PRODUCT ORDER BY Pno DESC;
+-----+-------+---------+
| Pno | Pname | Pamount |
+-----+-------+---------+
| 005 | b     |       6 |
| 004 | b     |       2 |
| 003 | b     |       1 |
| 002 | a     |       2 |
| 001 | a     |       1 |
+-----+-------+---------+
5 rows in set (0.00 sec)

§ 当排序列含空值时,排序列为空值的原组最后显示。

 

2.GROUP BY

这一语句主要是作分类汇总,如需要相同名称记录的合计库存量,在查询语句中可用到GROUP BY如下

SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;

结果如下

mysql> SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname;
+-------+--------------+
| Pname | SUM(Pamount) |
+-------+--------------+
| a     |            3 |
| b     |            9 |
+-------+--------------+
2 rows in set (0.00 sec)

 

3.HAVING

HAVING可以作为WHERE的拓展,因为在WHERE中不可用到聚合函数,而在HAVING中可以使用聚合函数。

如需了解总量大于5的相同名称记录的合计库存量,则可用到HAVING使用如下

SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname HAVING SUM(Pamount)>5;

结果如下

mysql> SELECT Pname,SUM(Pamount) FROM PRODUCT GROUP BY Pname HAVING SUM(Pamount)>5;
+-------+--------------+
| Pname | SUM(Pamount) |
+-------+--------------+
| b     |            9 |
+-------+--------------+
1 row in set (0.00 sec)

HAVING与WHERE作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚合运算之前选取输入行(因此,它控制进入聚合运算的记录), 而 HAVING 在分组和聚合之后选取分组的行。因此,WHERE 子句不能包含聚合函数;因为试图用聚合函数判断那些行输入做聚合运算是没有意义的。 相反,HAVING 子句总是包含聚合函数。

以上纯属个人对于选择操作中的ORDER BY、GROUP BY以及HAVING的看法及见解,如有误,感谢各位的指证

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值