Python调用Oracle数据库实现分组查询与过滤的方法
本文详解如何在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程序设计相关内容能对读者有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









