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的模型中执行原始SQL查询的方法
Jul 21 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
Python+Django搭建自己的blog网站
Mar 13 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
Django实现文件上传下载功能
Oct 06 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php相当简单的分页类
2008/10/02 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
jQuery示例收集
2010/11/05 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
python中使用序列的方法
2015/08/03 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
python实现输入数字的连续加减方法
2018/06/22 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
python模拟实现斗地主发牌
2020/01/07 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
python 追踪except信息方式
2020/04/25 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
个人政风行风自查自纠报告
2014/10/21 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python