python针对Oracle常见查询操作实例分析


Posted in Python onApril 30, 2020

本文实例讲述了python针对Oracle常见查询操作。分享给大家供大家参考,具体如下:

1.子查询(难):

当进行查询的时候,发现需要的数据信息不明确,需要先通过另一个查询得到,

此查询称为子查询;

执行顺序:先执行子查询得到结果以后返回给主查询

组成部分:

1).主查询部分

2).子查询部分

【注意事项】:

子查询一定需要被定义/包裹在小括号内部,可以认为是显示的提升了代码执行的优先级

需求1:

查询薪资比Abel的高的有谁?

分析:

①.先查询出Abel的薪资是多少?

②.将过滤条件定义为>①,然后进行查询得到最终需要的结果

代码实现:

select last_name,salary

from employees

where salary > (

select salary from employees

where last_name = 'Abel'

);

需求2:

查询job_id与141号员工相同,salary比143号员工多的员工的姓名,job_id和salary?

代码实现:

select last_name,job_id,salary

from employees

where job_id = (

select job_id

from employees

where employee_id = 141

)

and salary > (

select salary

from employees

where employee_id = 143

);

课堂练习:

1).返回公司工资最少的员工的employee_id,job_id和salary

select employee_id,job_id,salary

from employees

where salary = (

select min(salary)

from employees

);

2).查询平均工资高于公司平均工资的部门有哪些

select department_id,avg(salary)

from employees

group by department_id

having avg(salary) > (

select avg(salary)

from employees

)

order by department_id desc;

3).查询最低工资大于20号部门最低工资的部门id和最低工资

select department_id,min(salary)

from employees

where department_id is not null

group by department_id

having min(salary) > (

select min(salary)

from employees

having department_id = 20

);

4).返回其它职位中比job_id为'IT_PROG'中最低工资低的员工的员工号,姓名,job_id以及salary

select employee_id,last_name,job_id,salary

from employees

where salary < (

select min(salary)

from employees

where job_id = 'IT_PROG'

);

2.多表查询/多表联查

概念:

使用场景,如果一条select语句中需要查询的列遍布多张数据表,

那么我们就必须使用多表查询了!!

分类:

等值连接和非等值连接

对于等值连接分方向:

1).内连接:返回多张表中共同满足的数据,取交集

2).外连接(左、右、满):返回内连接数据的同时还会继续返回某张表中不匹配的一些记录数

3).自连接:从始至终都是一张表,模拟一张表派生为两张(它们的结构式一模一样的),自己连自己

等值连接中的内连接:

需求:

查询所有员工的员工号、员工姓名以及部门的名字?

select employee_id,last_name,department_name

from employees,departments;

【注意】

以上查询得到了2889条记录,很多都是没有用的数据(脏数据),

出现的原因是:没有添加有效的连接条件导致的,

而这种现象我们称为笛卡尔集现象;

我们日后的学习和开发环境中是绝对要避免的!!

如何保证我们之后的多表查询绝对不会出现笛卡尔集现象?

1).不能不写连接条件

2).连接条件必须是有效的

思考:如何修改上述的代码?

代码实现如下:

select employee_id,last_name,department_name

from employees,departments

where employees.department_id = departments.department_id;

需求:使用内连接来实现

查询员工的员工号、姓名、部门号、部门名字?

select employee_id,last_name,department_id,department_name

from employees,departments

where employees.department_id = departments.department_id;

以上代码出错了,出错原因:

因为对于department_id这个列在employees和departments两张表中都存在,

所以需要显示的告诉编译器,我从哪张表中获取数据内容的!

修改代码如下:

select employee_id,last_name,departments.department_id,department_name

from employees,departments

where employees.department_id = departments.department_id;

select employee_id,last_name,employees.department_id,department_name

from employees,departments

where employees.department_id = departments.department_id;

思考:没有重复的列可以使用名字.的形式来定义吗?---> 可以的

select employee.employee_id,employee.last_name,employees.department_id,departments.department_name

from employees,departments

where employees.department_id = departments.department_id;

上述代码运行以及结果方面不存在问题,但是在代码量上比较冗余!!我们可以使用如下的方式解决...

给名字起别名的方式:

修改代码如下:

select e.employee_id,e.last_name,e.department_id,d.department_name

from employees e,departments d

where e.department_id = d.department_id;

总结:对于多表查询,如果涉及n张表,至少需要有n-1个连接条件;

非等值连接:

需求:

查询员工的姓名、薪资以及薪资的等级

select last_name,salary,grade_level

from employees,job_grades

where salary between lowest_sal and highest_sal;

以上代码有问题,可以看到各个人的薪资等级,但是由于没有追加连接连接,还是出现了笛卡尔集现象;

我们需要慎用!一般之后非等值连接用的比较少,而且必须配合等值连接一起用;

附: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通过文件头判断文件类型
Oct 30 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
使用tensorflow实现线性回归
Sep 08 Python
Python列表与元组的异同详解
Jul 02 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
Python代码需要缩进吗
Jul 01 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
python实现Oracle查询分组的方法示例
Apr 30 #Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 #Python
如何安装并在pycharm使用selenium的方法
Apr 30 #Python
Python基于进程池实现多进程过程解析
Apr 30 #Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 #Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 #Python
Pytorch高阶OP操作where,gather原理
Apr 30 #Python
You might like
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Django Form常用功能及代码示例
2020/10/13 Python
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
毕业生医学检验求职信
2013/10/16 职场文书
总监职责范文
2013/11/09 职场文书
授权委托书(完整版)
2014/09/10 职场文书
2014年药店工作总结
2014/11/20 职场文书
单位未婚证明范本
2014/11/25 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书