作文导读:圣诞红展出了一身热情的红衣裳,悄悄的告诉我们:欢乐的圣诞节又微笑的招着手向我们走来了。 这真是一个令人盼望的节日阿!到处洋溢着欢乐的气息,不只小 朋友 高兴,连大人都欢迎它的到来。 走进书店,琳瑯满目的卡片,灿烂夺目的七彩装饰品,摆满了温暖的
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; 关闭系统的回收站;每个用户分配一个回收站。