Oracle学习系列3
Oracle学习系列3 ************************************************************************************ 多表查询: 1,SQL1999语法对多表查询的支持 2,分组统计及统计函数的使用 3,子查询,并结合多表查询,分组统计做复杂查询 4,数据库的更新操作 5,事务处理和数据库死锁 ************************************************************************************ 多表查询: 语法: select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , tab3 别名3 ,... {where 条件s } { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; 同时查询emp表和dept表: select * from emp, dept ; //产生笛卡尔积 加入where语句: select * from emp e,dept d where e.deptno = d.deptno; 要求查询出雇员的编号,姓名,部门编号,部门名称,部门位置: select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno; 要求查询出每个雇员的姓名,工作,雇员的直接上级领导的姓名: select e.ename, e.job, m.ename, d.dname from emp e, emp m ,dept d where e.mgr = m.empno and e.deptno=d.deptno ; 要求查询出每个雇员的姓名,工资,部门名称,工资在公司的等级,及其领导的姓名及工资所在公司的等级: select e.ename, e.sal, d.dname, s.grade, m.ename, m.sal, ms.grade from emp e, dept d, salgrade s, emp m, salgrade ms where e.deptno=d.deptno and (e.sal between s.losal and s.hisal) and e.mgr=m.empno and ( m.sal between ms.losal and ms.hisal); 进一步:按照下面样式显示工资等级: 1:第五等工资 2:第四等工资 3:第三等工资 4:第二等工资 5:第一等工资 此时肯定使用decode()函数: select e.ename, e.sal, d.dname, DECODE(s.grade, 1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',1,'第一等工资'), m.ename,m.sal,DECODE(ms.grade, 1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',1,'第一等工资'), from emp e, dept d, salgrade s, emp m, salgrade ms where e.deptno=d.deptno and (e.sal between s.losal and s.hisal) and e.mgr=m.empno and ( m.sal between ms.losal and ms.hisal); ************************************************************************************ 左、右连接<重点> (+)= -->右连接, =(+) -->左连接, 默认 select e.empno, e.ename, d.deptno, d.dname, d.loc from emp e, dept d where e.deptno(+)=d.deptno; //表示以dept表为准 。右连接 ************************************************************************************ SQL:1999语法对SQL的支持<了解> 交叉连接(cross join): <产生笛卡尔积> select * from emp corss join dept ; 自然连接(natural join):<自动进行关联字段的匹配> select * from emp natural join dept ; USING子句:<直接指定关联的操作列> select * from emp e join dept d USING(deptno) where deptno=30; ON子句:<用户自定义连接条件> select * from emp e join dept d ON(e.deptno=d.deptno) where e.deptno=30 ; 左连接(left join),右连接(right join): select e.ename, d.deptno, d.dname, d.loc from emp e right outer join dept d on(e.deptno=d.deptno) ; ************************************************************************************ 组函数和分组统计:<重点> count(): //求出全部记录数 max(): // 求出一组中最大值 min(): //最小值 avg(): //平均值 sum(): //求和 count()函数: select count(emp) from emp ; //查询多少行记录 max(),min()函数:求出所有员工的最低工资 select max(sal) ,min(sal) , sum(sal) from emp ; 分组统计<group by>: 语法: select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , tab3 别名3 ,... {where 条件s } {group by 分组条件} { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; 求出每个部门的雇员数量,可定按照部门编号划分: select deptno, count(empno) from emp group by deptno ; 求出每个部门的平均工资: select deptno, avg(sal) from emp group by deptno ; --------------------------------------------------------------------------------- select deptno, count(empno) from emp ;// error:不是单组分组函数 /** 若程序使用了分组函数,条件如下; 1.程序中存在group by ,并且指定了分组条件,这样可以将分组条件一起查询出来 2.若不用分组的话,则只能单独使用分组函数 3.在使用分组函数时,不能出现分组函数和分组条件(group by )之外的字段 | */ | | ^ select deptno ,empno, count(empno) //error:empno不是group by 的表达式 from emp group by deptno ; 按部门分组,并显示部门的名称,及每个部门的员工数: select d.dname, count(e.empno) from dept d, emp e where d.deptno = e.deptno group by d.dname ; 要求显示出平均工资大于2000的部门编号和平均工资: error: select deptno , avg(sal) from emp where avg(sal) >2000 //此处不允许使用分组函数 group by deptno ; /** 分组函数只能在分组中使用,不允许出现在where语句中,若现在假设要指定分组条件,则只能通过第二种指令:having,此时SQL语法格式: select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , tab3 别名3 ,... {where 条件s } {group by 分组条件 { having 分组条件 } } { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; */ correct: select deptno, avg(sal) from emp group by deptno having avg(sal)>2000 ; 显示非销售人员工作名称以及从事统一工作雇员的月工资的总和,并且满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列: /** 分组简单的原则: 1,只要一列上存在重复的内容才有可能考虑到分组 2,分组函数可以嵌套使用,但是嵌套使用时不能再出现group by 后的字段: ex:求出平均工资最高的部门: error: select deptno, max(avg(sal)) //不是单组分组函数 from emp group by deptno; correct: select max(avg(sal)) from emp group by deptno ; -------------------------------------------------------------------------------- 分析:1,显示全部非销售人员:job<> 'salesman' select * from emp where job <>'salesman' ; 2,按工作分组,同时求出工资的总和: select job,sum(sal) from emp where job<> 'salesman' group by job ; 3,对分组条件进行限制,工资总和大于500: select job,sum(sal) from emp where job<> 'salesman' group by job having sum(sal)>5000 ; 4,按升序排序: select job,sum(sal) su from emp where job<> 'salesman' group by job having sum(sal)>5000 order by su ; */ ************************************************************************************ 子查询: 在一个查询内部还可以包括另一个查询: 分类: 单列子查询:返回的结果是一列的一个内容 (出现几率最高) 单行子查询:返回多个列,有可能为一条完整的记录 多行子查询:返回多个记录 格式: select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , ( select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , tab3 别名3 ,... {where 条件s } {group by 分组条件 { having 分组条件 } } { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; )别名x tab3 别名3 ,... {where 条件s ( select { distinct } * | col1 别名1 col2 别名2 ... from tab1 别名1 , tab2 别名2 , tab3 别名3 ,... {where 条件s } {group by 分组条件 { having 分组条件 } } { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; ) } {group by 分组条件 { having 分组条件 } } { order by col1 ASC | DESC , col2 ASC | DESC, ...} ; 要求查询出比7654工资高的全部雇员的信息: 分析: 1,7654雇员的工资是多少: select sal from emp where empno=7654 ; 2,只要是其他工资大于7654编号雇员的工资,则符合条件: select * from emp where sal > ( select sal from emp where empno=7654; //子查询语句处 ) ; 要求查询出工资比7654高,同时与7788从事相同工作的全部雇员信息: 查询出7654雇员的工资: select sal from emp where empno=7654 ; 与7788从事相同的工作: select job from emp where empno = 7788; 综合查找: select * from emp where sal >( select sal from emp where empno=7654 )and job =( select job from emp where empno =7788 ) ; 要求查询出工资最低雇员姓名,工作,工资: 最低工资: select min(sal) from emp ; 查询所有: select * from emp where sal =( select min(sal) from emp ) ; 要求查询:部门名称,部门员工数,部门的平均工资,部门的最低收入的雇员的姓名: 1,求出每个部门的员工数量,平均工资 select deptno,count(empno) ,avg(sal) from emp group by deptno ; 2,查出部门的名称: select d.dname, ed.c, ed.a from dept d, ( select deptno,count(empno) ,avg(sal) from emp group by deptno ) ed where d.deptno=ed.deptno ; 3,求出最低收入的雇员姓名: select d.dname, ed.c, ed.a ,e.ename from dept d, ( select deptno,count(empno) ,avg(sal),min(sal) min from emp group by deptno ) ed ,emp e where d.deptno=ed.deptno and e.sal =ed.min ; //若一个部门中存在两个最低工资的雇员,则该脚本会出现错误 ------------------------------------------------------ 子查询中的三种操作符: IN, ANY, ALL 求出每个部门的最低工资的雇员信息: select * from emp where sal IN ( //指定查询范围 select min(sal) from emp group by deptno ) ; =ANY : 与IN功能一样 select * from emp where sal =ANY ( //指定查询范围 select min(sal) from emp group by deptno ) ; >ANY:比里面最小的值要大 select * from emp where sal >ANY ( //指定查询范围 select min(sal) from emp group by deptno ) ; <ANY :比里面最大的值要小 select * from emp where sal <ANY ( //指定查询范围 select min(sal) from emp group by deptno ) ; ========================== >ALL:比最大的值要大 select * from emp where sal >ALL ( //指定查询范围 select min(sal) from emp group by deptno ) ; <ALL:比最大的值要小 select * from emp where sal <ALL ( //指定查询范围 select min(sal) from emp group by deptno ) ; /** 对于子查询中,还可以进行多列子查询,一个子查询中同时返回多个查询的列 select * from emp where (sal, NVL(comm,-1)) IN( select sa,NVL(comm, -1) from emp where deptno=20 ) ; */
Oracle学习系列3的更多相关文章
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- Oracle学习系列7
Oracle学习系列7 ************************************************************************************ 关联表 ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- Oracle学习系列5
Oracle学习系列5 ************************************************************************************ ,掌握 ...
- Oracle学习系列4
Oracle学习系列4 ************************************************************************************ 数据库 ...
- Oracle学习系列1
两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 300 ; set pag ...
- oracle学习系列之四 (视图)
视图视图是数据库中特有的对象.视图用于存储查询,但不会存储数据(物化视图除外).这是视图和数据表的重要区别.可以利用视图进行查询,插入,更新和删除数据.Oracle有如下四种视图(关系视图,内嵌视图, ...
- oracle学习系列之三 (约束)
主键约束:外键约束:唯一性约束:检查约束:默认值约束 -——————五大约束 一. 主键约束: --创建表的主键约束 create table student (student_id number ...
- Oracle 学习系列之二(会话与事务级临时表和dual表 )
一. 会话临时表 --创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20) ...
随机推荐
- 【转发】RedHat Enterprise Linux 6.4 使用 Centos 6 的yum源问题
作为一名新手,学习Linux已经一个月了,其间遇到了不少问题,而今天笔者遇到的问题是 #yum install pam-devel #This system is not registered to ...
- SharePoint 2013 企业搜索架构示例
博客地址:http://blog.csdn.net/FoxDave 本文参考自微软官方的Chart,我们来看一下企业中对于不同规模SharePoint搜索的场的架构是什么样的. 对于搜索场的规模, ...
- iOS开发之通知使用总结
通知中心(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发 ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
- __toString()与__call()
__toString()适用于直接输出类,用此方法,可以避免出错:__call()适用于使用类当中没有定义的函数(方法) <!DOCTYPE html> <html> < ...
- ERP系统上传文档信息下载(十八)
下载的公用方法: /// <summary> /// 下载文档 /// </summary> /// <param name="TableName"& ...
- 钉子和小球_DP
Description 有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端 ...
- Oracle常用SQL语句
--2.查看表结构 desc wx_monitor_excption; --3.从表中查询数据 select * from wx_monitor_excption; --7.双引号保持原来的格式 se ...
- 浏览器关闭使session失效的问题多种解决方式
直接关闭浏览器(或者强制关闭浏览器进程.死机等),服务器无法处理用户退出网站的请求,此举将会导致session失效,下面整理了一些解决方法,感兴趣的朋友可以参考下哈 如果用户不点击网站的“退出”链 ...
- 为什么要urlencode
为什么要urlencode 1.为了正常获取值 字符 特殊字符的含义 URL编码 & 分隔不同的变量值对 %26 = 用来连接键和值 %3D ? 表示查询字符串的开始 %3F # 用来标志 ...