Oracle认证 百分网手机站

Oracle复习知识点(3)

时间:2018-04-25 10:40:42 Oracle认证 我要投稿

Oracle复习知识点汇总

  select deptno,avg(sal) from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=20); 先算出每个部门的平均工资,再和20部门的平均工资进行比较

  select ename,job from emp where deptno in (select deptno from emp group by deptno having avg(sal)>2000)

  select ename form emp where empno not in (select mgr from emp) 查询哪些人不是领导,返回结果有null值,且使用not in 运算符,则无结果*/

  *************关联子查询************

  select ename,sal,deprno from emp outer where sal>(select avg(sal) from emp where deptno=outer.deptno) 查询哪些员工薪水比本部门的平均薪水高,子查询不再是独立的Sql语句,需要以来主查询传来的参数*/

  select ename,job,deptno from emp outer where exists (select 'a'from emp where mgr=outer.empno); exists关键字判断子查询有没有数据返回,有则为ture,没有则为false。它不关心子查询的结果,所以select后写什么都行*/

  ************多表查询***************

  select e.deptno,e,ename,d.dname from emp e join dept d on e.deptno=d.deptno; 两个表连接,表1 join 表2 on 条件,结论:没有部门的员工和没有员工的部门都不会出现

  ***内连接的表现形式***

  1、等值连接

  select e.ename,e.job,e.sal,d.dname from emp e join dept d on e.deptno =d.deptno and e.job='MANAGER'; 先用条件e.job = ‘MANAGER’对emp表进行过滤,结果集再和dept表进行内连接。

  2、非等值连接

  select e.ename, e.sal, s.grade,s.losal, s.hisal from emp e join salgrade s on e.sal between s.losal and s.hisal; 查询emp表中员工的工资属于哪个级别

  3、自连接

  select worker.ename,manager.ename from emp worker join emp manager on worker.mgr=manager.empno; 涉及同一张表的数据

  内连接总结:一张表里的记录一定在另一张表中存在匹配的记录,否则不能出现在结果集中

  外连接的特征:

  如果驱动表在匹配表中找不到匹配记录,则匹配一行空行。

  外连接结果集=内连接结果集+驱动表在匹配表中匹配不上的记录和空值。

  外连接的本质是驱动表中的数据一个都不能少。

  left outer join以左边的表为驱动表。

  right outer join以右边的表为驱动表。

  select e.empno , e.ename , d.dname from emp e left outer join dept d on e.deptno = d.deptno ; 结果集中包括有部门的员工和没有部门的.员工 */

  select e.empno , e.ename , d.dname from dept d left outer join emp e on e.deptno = d.deptno; 结果集中包括有员工的部门和没有员工的部门*/

  结论:t1 left outer join t2等价于: t2 right outer join t1

  t1 right outer join t2等价于:t2 left outer join t1

  全外连接的结果集 = 内连接的结果集 +

  驱动表中在匹配表中找不到匹配记录的数据和null值 +

  匹配表中在驱动表中找不到匹配记录的数据和null值

  ***************集合***************

  A = {1,2,3,4,5,6}

  B = {2,4,6,8}

  A union B = {1,2,3,4,5,6,8}

  A union all B = {1,2,2,3,4,4,5,6,6,8}

  A intersect B = {2,4,6}

  A minus B = {1,3,5}

  ********数据操作语言(DML)*********

  ****1、insert语句****

  一次增加多条记录,使用子查询代替values 。在emp表中查询部门10的员工编号,员工姓名,那么id、name与empno和ename相对应。

  insert into student_ning(id, name) select empno, ename from emp where deptno = 10;

  ****2、复制表****

  create table 表名 as 查询语句; 注释:复制全表

  create table salgrade_yyy as select * from salgrade where 1<>1; 只复制结构,不复制数据*

  create table emp_yyy as select empno,ename,sal*12 year_sal from emp where deptno = 10;复制一部分数据

  create table emp_bak as select * from emp where 1=0; 创建一个空表

  ****3、update语句****

  update emp_ning set sal = 1000 where empno = 7369; update语法结构: update 表名 set 列名 = 新的列值, 列名 = 新的列值. ….where 条件;

  ****4、delete语句****

  语法结构: delete [from] 表名 where 条件;

  drop table 会删除表结构和数据;truncate 删除表数据,保留表结构。drop 和truncate 都不可以回退。delete 仅删除数据,可以回退。

  ***5、事务语句****

  包括:

  commit事务提交:将所有的数据改动提交

  rollback:事务回滚、回退到事务之初,数据的状态和事务开始之前完全一致。

  savepoint:设置保存点 , 可以回滚( rollback )到指定的保存点。

  结论

  1) 提交、回滚前事务内部的数据改变只有在自己的会话中能够看到。

  2) 提交、回滚前事务会对操作的数据加锁,不允许其它事务操作。

  3) 如果提交( commit )后,数据的改变被确认,则

  4) 所有的会话都能看到被改变的结果;

  5) 数据上的锁被释放;

  6) 保存数据的临时空间被释放

  7) 如果回滚( rollback ) , 则

  8) 数据的改变被取消;