本文实例讲述了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编码操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]