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

在数据库的选择操作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的看法及见解,如有误,感谢各位的指证

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 PostgreSQL GROUP BY 语句和 SELECT 语句可以一起使用来对相同的数据进行分组。GROUP BY 通常放在 WHERE 子句之后和 ORDER BY 子句之前。 下面是 GROUP BY 与 ORDER BY 一起使用的基本语法: SELECT column-list FROM table_name WHERE [ conditions ] GROUP BY column1, column2....columnN ORDER BY column1, column2....columnN 这个语法允许你按照指定的列对结果进行分组,然后按照指定的列对分组结果进行排序。 需要注意的是,如果一个查询使用了分组函数,那么任何不在分组函数的列或表达式都必须GROUP BY 子句出现,否则会出错。例如,如果在一个查询使用了 SUM 函数来计算某列的总和,那么该列必须GROUP BY 子句列出。否则,会出现错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PgSQL——学习笔记八: ORDER BY 子句:排序 & GROUP BY 语句:分组](https://blog.csdn.net/qq_41361442/article/details/124809777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [group by,havingorder by的用法详解](https://download.csdn.net/download/weixin_38543460/13699445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值