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 相关文章推荐
Django实现的自定义访问日志模块示例
Jun 23 Python
python爬取淘宝商品详情页数据
Feb 23 Python
python主线程捕获子线程的方法
Jun 17 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
Python通过Pillow实现图片对比
Apr 29 Python
keras绘制acc和loss曲线图实例
Jun 15 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
php 页面执行时间计算代码
2008/12/04 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
python实现批量图片格式转换
2020/06/16 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
Python简易版图书管理系统
2019/08/12 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
策划创业计划书
2014/02/06 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
重阳节慰问信
2015/02/15 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS