Python调用Oracle数据库实现分组查询与过滤的方法

Leo
Leo
发布时间:2026-10-13 | 3人浏览过
原创

本文详解如何在Python中通过cx_Oracle连接Oracle数据库,利用SQL的Group By子句实现按部门或工种分组计算平均工资,并使用Having子句对聚合结果进行过滤。文章对比了Where与Having的区别,提供了完整的Python连接代码及SQL查询示例,帮助开发者掌握数据库分组查询的最佳实践。

Python连接Oracle数据库与分组查询概述

本文详细介绍在Python中实现Oracle数据库分组查询的具体方法,旨在为相关开发者提供实用的参考代码与操作指南。

Group By分组查询详解

1. 理解分组查询概念:

核心关键字为Group By子句。

关键规则:当Select语句中同时包含聚合函数和非聚合列时,所有非聚合列必须出现在Group By子句中,否则查询将报错。

具体应用场景:

需求示例:统计公司内各个部门的平均工资数据。


select department_id,avg(salary)

from employees

group by department_id;

需求进阶:

需求示例:统计公司内各个部门中,不同工种的平均工资情况。


select department_id,job_id,avg(salary)

from employees

group by department_id,job_id;

Having子句过滤聚合结果

2. 掌握Having子句用法:

主要作用:用于对包含聚合函数的查询结果进行条件过滤。

语法位置:

Having子句可以放置在Group By之前或之后,语法上较为灵活,但通常建议放在Group By之后以符合逻辑顺序。

具体应用场景:

需求示例:查询部门编号为40、60、80的部门中,平均工资高于6000的部门详细信息。

以下代码尝试实现上述需求,但执行时会报错:

报错原因分析:在SQL语法中,Where子句不能直接用于过滤聚合函数的结果。

正确的做法是使用Having子句来实现对聚合数据的过滤操作。


select department_id,avg(salary)

from employees

where avg(salary) > 6000 and department_id in(40,60,80)

group by department_id;

修正后的代码如下:


select department_id,avg(salary)

from employees

where department_id in(40,60,80)

having avg(salary) > 6000

group by department_id

order by department_id desc;

Python连接Oracle数据库代码示例

附录:Python连接并查询Oracle数据库的基础示例代码:


import cx_Oracle
conn = cx_Oracle.connect('scott/tiger@localhost:1521/orcl')
cursor = conn.cursor()
cursor.execute("SELECT ENAME FROM EMP")
row = cursor.fetchone()
print row[0],

cursor.close()
conn.close()


更多关于Python操作数据库的技巧,读者可参考本站专题:《Python常见数据库操作技巧汇总》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文提供的Python程序设计相关内容能对读者有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表