圣诞晚会

时间:2018-07-11 04:45:29来源:杰瑞文章网点击:作文字数:300字
5.多表查询 多表查询目的:从多张表获取数据前提:进行连接的多张表中有共同的列等连接通过两个表具有相同意义的列,建立连接条件.查询结果只显示两个列中的值是等值条件的行数据表中同名列被选择时必须添加表名前缀进行修饰 否则无法确定这一列是属于哪个表不等连接A表中的某列数据和B表中一列或多列的关系是非等值关系,大于,小于,不等于,等条件都属于不等连接的范畴自连接数据都来自一张表,所以在from字句中需要对表添加别名,添加表别名后才能合法化的引用表中的列名.本质就是将一张表虚拟成了两张表外连接即是选择出满足等连接条件及其以外的行(+)修饰符号用法:放置在选出结果只包含等连接的列后,则另一列的结果就是等值行+非等值行全连接全链接是把做符合和不符合关联条件的两个表的信息都显示出来等链接SQL> select *from emp,dept where emp.deptno=dept.deptno;EMPNO ENAME      JOB   MGR HIREDATE       SAL COMM   DEPTNO    DEPTNO DNAME   LOC---------- ---------- --------- ----- --------- ---------- ---------- ---------- ---------- -------------- ----------7782 CLARK      MANAGER 7839 09-JUN-81      2450       10 10 ACCOUNTING   NEW YORK7839 KING      PRESIDENT      17-NOV-81      5000       10 10 ACCOUNTING   NEW YORK7934 MILLER    CLERK 7782 23-JAN-82      1300       10 10 ACCOUNTING   NEW YORK7566 JONES      MANAGER 7839 02-APR-81      2975       20 20 RESEARCH   DALLAS7902 FORD      ANALYST 7566 03-DEC-81      3000       20 20 RESEARCH   DALLAS7876 ADAMS      CLERK 7788 23-MAY-87      1100       20 20 RESEARCH   DALLAS7369 SMITH      CLERK 7902 17-DEC-80        800       20 20 RESEARCH   DALLAS7788 SCOTT      ANALYST 7566 19-APR-87      3000       20 20 RESEARCH   DALLAS7521 WARD      SALESMAN 7698 22-FEB-81      1250   500       30 30 SALES   CHICAGO7844 TURNER    SALESMAN 7698 08-SEP-81      1500     0       30 30 SALES   CHICAGO7499 ALLEN      SALESMAN 7698 20-FEB-81      1600   300       30 30 SALES   CHICAGO7900 JAMES      CLERK 7698 03-DEC-81        950       30 30 SALES   CHICAGO7698 BLAKE      MANAGER 7839 01-MAY-81      2850       30 30 SALES   CHICAGO7654 MARTIN    SALESMAN 7698 28-SEP-81      1250 1400       30 30 SALES   CHICAGO标准sql写法:SQL> select empno,ename,loc from emp inner join dept on emp.deptno=dept.deptno;idle>这才是我们要的结果.笛卡尔积几乎我们不会需要.多表查询时基本都带有where子句来描述多个表的关系 避免笛卡尔集当两个表中有相同的列名时,为了区分 要在列前加上表名作前缀.在联合的两个表内取数据:描述scott在哪个部门idle> select empno,ename,dname,sal from emp,dept where emp.deptno=dept.deptno and ename='SCOTT';EMPNO ENAME      DNAME     SAL---------- ---------- -------------- ----------7788 SCOTT      RESEARCH   3000为了书写方便,我们可以给表起别名表的别名格式:表名 别名给表取别名是很有必要的,因为有的表名很长 不便于引用时书写.SQL> select *from emp a,dept b where a.deptno=b.deptno and a.ename='SCOTT';EMPNO ENAME      JOB   MGR HIREDATE       SAL COMM   DEPTNO    DEPTNO DNAME   LOC---------- ---------- --------- ----- --------- ---------- ---------- ---------- ---------- -------------- ----------7788 SCOTT      ANALYST 7566 19-APR-87      3000       20 20 RESEARCH   DALLAS不等连接就是排除完全相等条件以外的 >,<,!=, <=, >=, between and主要在于不同表之间显示特定范围的信息(也可以理解成包含关系)求出每个员工的工资等级SQL> SELECT *FROM SALGRADE;GRADE LOSAL   HISAL---------- ---------- ----------1   700     12002 1201     14003 1401     20004 2001     30005 3001     9999SQL> select empno,ename,sal,grade from emp a,salgrade b where a.sal between b.losal and b.hisal;EMPNO ENAME     SAL      GRADE---------- ---------- ---------- ----------7369 SMITH     800   17900 JAMES     950   17876 ADAMS     1100   17521 WARD     1250   27654 MARTIN     1250   27934 MILLER     1300   27844 TURNER     1500   37499 ALLEN     1600   37782 CLARK     2450   47698 BLAKE     2850   47566 JONES     2975   47788 SCOTT     3000   47902 FORD     3000   47839 KING     5000   514 rows selected.自连接同一张表内的连接查询 即把一个表映射成两个表主要用于表的自参照关系 比如emp中的上下级或层次关系因为自连接是同一张表之间的链接查询 所以必须定义表别名SQL> select a.empno,a.ename,b.empno,b.ename from emp a,emp b where a.mgr=b.empno;EMPNO ENAME   EMPNO ENAME---------- ---------- ---------- ----------7902 FORD     7566 JONES7788 SCOTT     7566 JONES7844 TURNER     7698 BLAKE7499 ALLEN     7698 BLAKE7521 WARD     7698 BLAKE7900 JAMES     7698 BLAKE7654 MARTIN     7698 BLAKE7934 MILLER     7782 CLARK7876 ADAMS     7788 SCOTT7698 BLAKE     7839 KING7566 JONES     7839 KING7782 CLARK     7839 KING7369 SMITH     7902 FORD13 rows selected.外链接不仅返回满足连接的记录 还会返回不满足连接的记录外链接的运算符(+)该符号可以放在等的左边或右边,但一定要放在缺少信息(完全满足条件的行)的一边.若加在多信息的一边 和没加一样,可以理解为谁需要空行来填补,就在谁的后面加(+)例如:emp中不包含40号部门的员工 而dept中有40号部门SQL> select empno,ename,b.deptno,dname from emp a,dept b where a.deptno(+)=b.deptno;EMPNO ENAME   DEPTNO DNAME---------- ---------- ---------- --------------7782 CLARK       10 ACCOUNTING7839 KING       10 ACCOUNTING7934 MILLER       10 ACCOUNTING7566 JONES       20 RESEARCH7902 FORD       20 RESEARCH7876 ADAMS       20 RESEARCH7369 SMITH       20 RESEARCH7788 SCOTT       20 RESEARCH7521 WARD       30 SALES7844 TURNER       30 SALES7499 ALLEN       30 SALES7900 JAMES       30 SALES7698 BLAKE       30 SALES7654 MARTIN       30 SALES40 OPERATIONS15 rows selected.标准sql写法 left join on查询出所有部门名和10号部门内的员工因为员工信息显示较少 所以(+)符号放在emp.deptno上SQL> select b.deptno,b.dname,a.empno,a.ename from emp a,dept b where a.deptno(+)=b.deptno and a.deptno(+)=10;DEPTNO DNAME       EMPNO ENAME---------- -------------- ---------- ----------10 ACCOUNTING 7782 CLARK10 ACCOUNTING 7934 MILLER10 ACCOUNTING 7839 KING20 RESEARCH30 SALES40 OPERATIONS6 rows selected.SQL>SQL> 如果不在所有的条件上面写(+)就会产生这样的结果SQL> select b.deptno,b.dname,a.empno,a.ename from emp a,dept b where a.deptno(+)=b.deptno and a.deptno=10;DEPTNO DNAME       EMPNO ENAME---------- -------------- ---------- ----------10 ACCOUNTING 7782 CLARK10 ACCOUNTING 7839 KING10 ACCOUNTING 7934 MILLER外连接的注意事项1.where中有多个条件时 必须每个条件都需要使用(+)符号2.(+)只使用于列 不能是表达式3.(+)不能与in or一起操作实际测试中,in是可以的,给or加上括号,提高运算优先级,也是可以的。全连接符合连接条件的,就连接成一行,不符合的,也全部显示出来full join onSQL> select a.deptno,a.dname,b.empno,b.ename from dept a full join emp b on a.deptno=b.deptno and a.deptno=10;DEPTNO DNAME       EMPNO ENAME---------- -------------- ---------- ----------7369 SMITH7499 ALLEN7521 WARD7566 JONES7654 MARTIN7698 BLAKE10 ACCOUNTING 7782 CLARK7788 SCOTT10 ACCOUNTING 7839 KING7844 TURNER7876 ADAMS7900 JAMES7902 FORD10 ACCOUNTING 7934 MILLER30 SALES40 OPERATIONS20 RESEARCH17 rows selected.1.标准的sql写法natual join两个表要有共有列,并且数据类型一致如果两个表的共有列不只一个 natural join会按所有共有列连接SQL> select empno,ename,deptno from emp e natural join dept d;join using 是 inner join using的缩写USING 子句注意事项:1.natural join 和 using子句互斥 不能同时使用2.所引用的列不能使用表名前缀3.被引用的列一定是两个表的共有列4.多列相同时只能选择一列SQL> select empno,ename,deptno from emp e join dept d using (deptno);join on 是inner join on的简写形式SQL> select empno,ename,dname,loc from emp e join dept d on e.deptno=d.deptno;left join on 是left outer join on的简写形式左外连接满足连接条件的数据,以及不满足连接条件的左边表的其他数据SQL> select d.deptno,d.dname,d.loc,e.empno,ename from dept d left join emp e on d.deptno=e.deptno and d.deptno=10;DEPTNO DNAME   LOC     EMPNO ENAME---------- -------------- ------------- ---------- ----------10 ACCOUNTING   NEW YORK       7782 CLARK10 ACCOUNTING   NEW YORK       7839 KING10 ACCOUNTING   NEW YORK       7934 MILLER40 OPERATIONS   BOSTON30 SALES   CHICAGO20 RESEARCH   DALLASright join on 是right outer join的简写形式右外链接满足连接条件的数据,以及不满足连接条件的右边表的其他数据full join on 是full outer join on的简写形式全外连接满足连接条件的数据,以及不满足连接条件的两边的表的其他数据连接条件和过滤条件的区别连接条件出现在on子句中的条件,用于限制能够进行表连接的记录被连接的表只展示符合连接条件的数据例如:这里的emp表是被连接的表SQL> select d.deptno,d.dname,d.loc,e.empno,ename from dept d left join emp e on d.deptno=e.deptno and d.deptno=10;DEPTNO DNAME   LOC     EMPNO ENAME---------- -------------- ------------- ---------- ----------10 ACCOUNTING   NEW YORK       7782 CLARK10 ACCOUNTING   NEW YORK       7839 KING10 ACCOUNTING   NEW YORK       7934 MILLER40 OPERATIONS   BOSTON30 SALES   CHICAGO20 RESEARCH   DALLAS6 rows selected.过滤条件是用在where子句中的,用于对连接后的结果进行过滤2.集合操作 集合操作用于多条select语句合并结果union 并集 去重union all 并集 不去重intersect 交集minus 差集unionA集合和B集合的合并,但去掉两集合重复的部分 会排序输出列名按照第一条sql的输出方式展示,所有对应的列必须具有相同的数据类型,否则报错集合的字段名使用第一个结果集的字段名称SCOTT@ora11g> select deptno,ename from emp where deptno in (20,30)2          union3          select deptno,ename from emp where deptno in (20,10)4  ;DEPTNO ENAME---------- ----------10 CLARK10 KING10 MILLER20 ADAMS20 FORD20 JONES20 SCOTT20 SMITH30 ALLEN30 BLAKE30 JAMES30 MARTIN30 TURNER30 WARD14 rows selected.SCOTT@ora11g>union allA集合和B集合的合并,不去重,不排序SCOTT@ora10g> select deptno,ename from emp where deptno in (20,30)2       union all3       select deptno,ename from emp where deptno in (20,10)4*SCOTT@ora10g> /DEPTNO ENAME---------- ----------20 SMITH30 ALLEN30 WARD20 JONES30 MARTIN30 BLAKE20 SCOTT30 TURNER20 ADAMS30 JAMES20 FORD20 SMITH20 JONES10 CLARK20 SCOTT10 KING20 ADAMS20 FORD10 MILLER19 rows selected.SCOTT@ora11g>intersect两个集合的交集部分,排序并去重SCOTT@ora11g> select deptno,ename from emp where deptno in (20,30)2       intersect3       select deptno,ename from emp where deptno in (20,10)4*SCOTT@ora10g> /DEPTNO ENAME---------- ----------20 ADAMS20 FORD20 JONES20 SCOTT20 SMITHSCOTT@ora11g>minus取两个集合的差集,A集合中存在,B集合中不存在的数据(取A集合中B集合不存在的数据) 去重SCOTT@ora10g>  select deptno,ename from emp where deptno in (20,30)2       minus3       select deptno,ename from emp where deptno in (20,10)4*SCOTT@ora10g>DEPTNO ENAME---------- ----------30 ALLEN30 BLAKE30 JAMES30 MARTIN30 TURNER30 WARD6 rows selected.3.子查询 子查询子查询指嵌入在其他SQL中的select语句,也称嵌套查询.按照子查询返回结果,可将子查询分为:单行单列  col = (sub_q)单行多列  (col1,col2..)=(sub_q)多行单列  col in (sub_q)多行多列  (col1,col2...) in (sub_q)数值 一对一  = > <数据 一对多  > any  > all按照子查询where条件来分标量子查询关联子查询特点:1.优先执行子查询,主查询再使用子查询的结果2.子查询返回的列数和类型要匹配3.子查询要用括号括起来4.子查询返回多行要用多行关系运算符单列单行子查询子查询返回一行记录查询和scott在同一部门的员工SCOTT@ora11g> select deptno,ename,sal from emp where deptno=(select deptno from emp where ename='SCOTT');DEPTNO ENAME     SAL---------- ---------- ----------20 SMITH     80020 JONES     297520 SCOTT     300020 ADAMS     110020 FORD     3000SCOTT@ora11g>也可以把子查询结果当成一列SCOTT@ora10g> select deptno,ename,(select deptno from emp where ename='SCOTT') AA from emp where deptno=10;DEPTNO ENAME       AA---------- ---------- ----------10 CLARK       2010 KING       2010 MILLER       20多行子查询多行子查询指返回多行数据的子查询语句当在where中使用时,必须使用多行比较符(in all any)ALL和any操作符不能独立使用 要与单行比较符(= > < >= <= <>)结合使用in  匹配于子查询结果的任一个值即可ALL  必须要符合子查询结果的所有值ANY  只要符合子查询结果的任意一个值即可in 操作SCOTT@ora10g> select empno from emp where deptno=10;EMPNO----------778278397934SCOTT@ora10g> select empno,ename,sal from emp where empno in (select empno from emp where deptno=10);EMPNO ENAME     SAL---------- ---------- ----------7782 CLARK     24507839 KING     50007934 MILLER     1300any 操作小于最大的即可SCOTT@ora10g> select deptno,ename,sal from emp where deptno < any (select distinct deptno from emp where deptno = 20 or deptno = 30);DEPTNO ENAME     SAL---------- ---------- ----------10 CLARK     245010 KING     500010 MILLER     130020 JONES     297520 FORD     300020 ADAMS     110020 SMITH     80020 SCOTT     30008 rows selected.SCOTT@ora10g>ALL 操作小于最小的即可SCOTT@ora10g> select deptno,ename,sal from emp where deptno < all (select distinct deptno from emp where deptno = 20 or deptno = 30);DEPTNO ENAME     SAL---------- ---------- ----------10 CLARK     245010 KING     500010 MILLER     1300多列子查询指子查询返回多个列的数据当多个列只有一行数据时 可以使用单行比较符当多个列有多行数据时,还是需要 IN多列单行就是多条件比较查询和SMITH相同部门 相同岗位的人SCOTT@ora11g> select deptno,ename,job,sal from emp where (deptno,job) = (select deptno,job from emp where ename='SMITH');DEPTNO ENAME      JOB       SAL---------- ---------- --------- ----------20 SMITH      CLERK       80020 ADAMS      CLERK       1100SCOTT@ora10g>多列多行IN找出领导和工资与SCOTT和WARD一致的人SCOTT@ora11g> select ename,mgr,sal from emp where ename in ('SCOTT','WARD');ENAME   MGR     SAL---------- ---------- ----------WARD 7698     1250SCOTT 7566     3000SCOTT@ora11g> select deptno,ename,mgr,sal from emp where (mgr,sal) in (select mgr,sal from emp where ename in ('SCOTT','WARD')) and ename not in ('SCOTT','WARD');DEPTNO ENAME     MGR SAL---------- ---------- ---------- ----------30 MARTIN     7698      125020 FORD     7566      3000查找每个部门的最高工资的员工姓名SCOTT@ora10g> select deptno,max(sal) from emp group by deptno;DEPTNO  MAX(SAL)---------- ----------30 285020 300010 5000SCOTT@ora10g> select deptno,ename,sal from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);DEPTNO ENAME     SAL---------- ---------- ----------30 BLAKE     285020 SCOTT     300010 KING     500020 FORD     3000关联子查询将主查询的内容传递给子查询 子查询再把查询结构反馈给主查询子查询执行的次数取决于主查询传递值的次数找出每个部门工资最高的人不使用关联子查询 使用in分组方式实现查找每个部门的最高工资的员工姓名SCOTT@ora10g> select deptno,max(sal) from emp group by deptno;DEPTNO  MAX(SAL)---------- ----------30 285020 300010 5000SCOTT@ora10g> select deptno,ename,sal from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);DEPTNO ENAME     SAL---------- ---------- ----------30 BLAKE     285020 SCOTT     300010 KING     500020 FORD     3000一一比较模式SQL> select deptno,ename,sal from emp where sal = (select max(sal) from emp where deptno=10) and deptno=10;DEPTNO ENAME     SAL---------- ---------- ----------10 KING     5000SQL> select deptno,ename,sal from emp where sal = (select max(sal) from emp where deptno=20) and deptno=20;DEPTNO ENAME     SAL---------- ---------- ----------20 SCOTT     300020 FORD     3000SQL> select deptno,ename,sal from emp where sal = (select max(sal) from emp where deptno=30) and deptno=30;DEPTNO ENAME     SAL---------- ---------- ----------30 BLAKE     2850SQL>使用关联子查询模式SQL> select deptno,ename,sal from emp e where sal = (select max(sal) from emp where deptno=e.deptno);DEPTNO ENAME     SAL---------- ---------- ----------30 BLAKE     285020 SCOTT     300010 KING     500020 FORD     3000SQL>关联子查询出现在select字段中SQL> select empno,ename,deptno,(select loc from dept where deptno=e.deptno) loc from emp e;EMPNO ENAME          DEPTNO LOC---------- ---------- ---------- -------------7369 SMITH              20 DALLAS7499 ALLEN              30 CHICAGO7521 WARD              30 CHICAGO7566 JONES              20 DALLAS7654 MARTIN            30 CHICAGO7698 BLAKE              30 CHICAGO7782 CLARK              10 NEW YORK7788 SCOTT              20 DALLAS7839 KING              10 NEW YORK7844 TURNER            30 CHICAGO7876 ADAMS              20 DALLAS7900 JAMES              30 CHICAGO7902 FORD              20 DALLAS7934 MILLER            10 NEW YORK已选择14行。exists查询使用EXISTS语句可以测试集合是否为空,EXISTS语句通常与子查询结合在一起使用。只要子查询中至少返回一个值,则EXISTS语句的值就为True。查到就不再继续查找出领导 此员工的empno在mgr列存在即是领导SCOTT@ora10g> select empno,ename,mgr from emp e where exists (select 1 from emp where mgr=e.empno);EMPNO ENAME     MGR---------- ---------- ----------7902 FORD     75667698 BLAKE     78397839 KING7566 JONES     78397788 SCOTT     75667782 CLARK     78396 rows selected.in也能做到 只是in的效率不高 in会一直比下去 而exists比成功就不在比了.SCOTT@ora10g> select empno,ename,mgr from emp where empno in (select mgr from emp);EMPNO ENAME     MGR---------- ---------- ----------7902 FORD     75667698 BLAKE     78397839 KING7566 JONES     78397788 SCOTT     75667782 CLARK     78396 rows selected.SCOTT@ora10g>取反用in改写时并不一定得到和not exists一致的结果即是查找普通员工 不是领导的人SQL> select empno,ename from emp e where not exists (select 1 from emp where mgr=e.empno);EMPNO ENAME---------- ----------7844 TURNER7521 WARD7654 MARTIN7499 ALLEN7934 MILLER7369 SMITH7876 ADAMS7900 JAMES8 rows selected.SQL>SQL> select empno,ename from emp e where empno in (select mgr from emp);EMPNO ENAME---------- ----------7902 FORD7698 BLAKE7839 KING7566 JONES7788 SCOTT7782 CLARK6 rows selected.SQL> select empno,ename from emp e where empno not in (select mgr from emp);no rows selectedSQL> 原因是什么?with 语句当查询中多次用到某一部分时,可以用with语句创建一个公共临时表。因为子查询在内存临时表中,避免了重复解析,所以执行效率会提高不少。临时表在一次查询结束自动清除。语法: 一个select里的一个子查询  有效范围在这个SQL执行周期内第一次执行(解析 执行 得到结果)第二次执行(解析 执行 得到结果)第一次执行(解析 执行 得到结果) ==> 缓存到临时表第二次执行 (直接取结果)withalias_name1 as    (subquery1),alias_name2 as    (subQuery2),……,alias_nameN as    (subQueryN)select col1,col2…… col3from alias_name1,alias_name2……,alias_nameN例子:SQL> withq1 as (select 3+5 s from dual),q2 as (select 3*5 m from dual),q3 as (select s,m,s+m,s*m from q1,q2)select * from q3;S     M     S+M S*M---------- ---------- ---------- ----------8   15       23 120SQL>查询每个部门大于平均工资的员工,也可以这样来实现SQL> with2  a as (select deptno,avg(sal) x from emp group by deptno)3  select * from emp,a where emp.deptno=a.deptno and emp.sal>a.x;EMPNO ENAME      JOB       MGR HIREDATE     SAL      COMM    DEPTNO   DEPTNO   X---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- ----------7499 ALLEN      SALESMAN       7698 20-FEB-81   1600        300   30       30 1566.666677566 JONES      MANAGER       7839 02-APR-81   2975   20       20      21757698 BLAKE      MANAGER       7839 01-MAY-81   2850   30       30 1566.666677788 SCOTT      ANALYST       7566 19-APR-87   3000   20       20      21757839 KING      PRESIDENT   17-NOV-81   5000   10       10 2916.666677902 FORD      ANALYST       7566 03-DEC-81   3000   20       20      2175with子句中的视图叫做询问块,询问块的复杂查询在with子句中只运行一次,运行成功后会将询问块的结果集保存到temp表空间,以后再次调用询问块时会在后台转换为对结果集的直接访问4.DDL DDL 语句 数据定义语言CREATE 创建ALTER 修改DROP 删除TRUNCATE 截断COMMNET 注释RENAME 更名修改表名rename old_name to new_nameSQL> rename t5 to t6;表已重命名。增加列alter table table_name add(column datatype [default expr] [,column datatype...])SQL> alter table t6 add(id number default 1000);修改列的定义(修改后的数据类型不能与列中当前的数据冲突,否则列必须为空,default值的修改只对后续insert数据有效,之前的数据不受影响)alter table table_name modify(column datatype [default expr] [,column datatype...)删除列,不管有无数据均可以删除,但是最后一列是不可以被删除的。alter table drop (column)SQL> alter table t2 drop (id);表已更改。使用SET UNUSED 选项标记一列或多列为unused使用DROP UNUSED COLUMNS 选项删除unused列。这个功能可以在系统高峰期因删除字段而带来影响,因为删除字段会记录undo,因此可以先把列标记为unused等系统不繁忙的时候再drop掉。语法:ALTER TABLE  SET  UNUSED()();ALTER TABLE  SET  UNUSED COLUMN();ALTER TABLE  DROP  UNUSED COLUMNS;修改列名(列名称不可以与关键字冲突,不如类型名称,命令名称等)alter table table_name rename column old_column_name to new_column_nameSQL> alter table t2 rename column sal to salary;表已更改。增加注释comment on table table_name is 'text'comment on column table_name.columb is 'text'user_tab_comments  表的注释信息,在这里面可以查到user_col_comments  列的注释信息,在这里可以查到截断表保留表结构清空表的数据tuncate table table_name属于ddl语句,同样都有删除数据的功能,但是有以下不同truncate 可以回收存储空间,delete不会delete可以回退,truncate不可以工作中,慎重使用truncate删除表drop table table_name [purge]10G中增加了回收站功能,表没有被完全删 只是放到回收站里去了SQL> drop table t2;表已删除。从回收站中恢复表SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$M1uFYjFloJrgUAB/AQALVQ==$0 TABLE     2016-05-21:21:52:41或者select *from recyclebin;SQL> flashback table t4 to before drop;Flashback complete.例如:SQL> flashback table t4 to before drop;Flashback complete.SQL> select *from tab;TNAME       TABTYPE CLUSTERID------------------------------ ------- ----------BONUS       TABLEDEPT       TABLEEMP       TABLESALGRADE       TABLET4       TABLESQL> drop table t4;Table dropped.SQL>SQL>SQL> show recycleORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$M1uFYjFmoJrgUAB/AQALVQ==$0 TABLE     2016-05-21:21:57:42还原已删除的表并改名SQL> flashback table t4 to before drop rename to t7;Flashback complete.SQL> select *from tab;TNAME       TABTYPE CLUSTERID------------------------------ ------- ----------BONUS       TABLEDEPT       TABLEEMP       TABLESALGRADE       TABLET7       TABLE如果回收站里的表名有重复,默认恢复最近一次删除的那张表SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$OASw9TBNurHgUAB/AQBbYw==$0 TABLE     2016-07-20:05:26:13T4 BIN$N++H8pxalGbgUAB/AQAvxA==$0 TABLE     2016-07-19:04:08:26T4 BIN$N+52pkGdHVLgUAB/AQAgTQ==$0 TABLE     2016-07-19:02:52:00SQL> flashback table t4 to before drop;Flashback complete.SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$N++H8pxalGbgUAB/AQAvxA==$0 TABLE     2016-07-19:04:08:26T4 BIN$N+52pkGdHVLgUAB/AQAgTQ==$0 TABLE     2016-07-19:02:52:00如果回收站里的表名有重复,指定要恢复的表,需要使用回收站里的表名SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$OASw9TBOurHgUAB/AQBbYw==$0 TABLE     2016-07-20:05:29:27T4 BIN$N+52pkGdHVLgUAB/AQAgTQ==$0 TABLE     2016-07-19:02:52:00指定回收站里的名字需要加双引号SQL> flashback table "BIN$N+52pkGdHVLgUAB/AQAgTQ==$0" to before drop;Flashback complete.SQL> show recyclebin;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T4 BIN$OASw9TBOurHgUAB/AQBbYw==$0 TABLE     2016-07-20:05:29:27清空回收站SQL> show recycle;ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE  DROP TIME---------------- ------------------------------ ------------ -------------------T7 BIN$M1uFYjFnoJrgUAB/AQALVQ==$0 TABLE     2016-05-21:21:59:28SQL> purge recyclebin;Recyclebin purged.SCOTT@ora10g> show recycle; 查看回收站.SCOTT@ora10g> purge recyclebin; 清空回收站.SCOTT@ora10g> purge table t2 ; 清空回收站中t2的表.SQL>  purge dba_recyclebin; 清空所有用户回收站里的内容.SQL> alter session set recyclebin=off; 关闭当前会话的回收站;SQL> alter system set recyclebin=off; 关闭系统的回收站;每个用户分配一个回收站。
作文投稿

圣诞晚会一文由杰瑞文章网免费提供,本站为公益性作文网站,此作文为网上收集或网友提供,版权归原作者所有,如果侵犯了您的权益,请及时与我们联系,我们会立即删除!

杰瑞文章网友情提示:请不要直接抄作文用来交作业。你可以学习、借鉴、期待你写出更好的作文。

说说你对这篇作文的看法吧