oracle数据库表约束、视图、索引—该记录为本人以前微博的文章
一、Oracle 数据库常用操作续关于创建表时创建约束 ? ? 二、Orcale数据库操作续视图索引触发器1、创建视图create view empview asselect * from emp where comm is null;创建视图时提示没有权限进行操作故进入isqlplus使用sys dba账户进行登录对scott用户进行授权:grant ada to scott,将scott授权为dba;grant create view to scott;也是可以的;2、修改视图update empview set comm=comm+200 where ename=‘tengjiang‘;基本的操作和修改表是一样的;注:对视图中的数据进行修改等同于对源表中的数据进行修改;3、删除视图delete empview where empno=1001;4、修改视图结构操作同修改表结构,见上面内容,在此就不在赘述了;5、联合查询(1)、多表查询 参见笛卡尔积select conut(e.ename) from emp e,dept dwhere e.deptno=d.deptno amd d.dname=‘tengjiang‘;(2)、子查询将查询结果做为一个子表,再在子表中进行查询select count(ename) from emp where deptno=(select deptno from dept where dname=‘SALES‘);(3)、多表查询和子表查询的差别:a、查询次数:多表查询比子表查询查询次数多:多表查询:m*n次子表查询:m+n次(4)、创建视图在查询a、创建视图:create view emp_dept asselect e.*,d.deptno dno,d.dname,d.loc from emp e,dept d?where e.deptno=d.deptno;创建了一个emp_dept 的视图:将emp表和dept表外链接起来;b、再在视图中查询select count(ename) from emp_dept where dname=‘SALES‘;将部门名称为‘SALES‘的人数统计出来;6、创建索引;----索引(index),是建立在某一列数据上的目录,可以提高查询的效率----经常作为查询条件的列,创建索引可以大幅度的提高查询效率----索引分为两部分:rowid 和键值----rowid是每行数据存储的物理地址,键值就是具体数据的取值----索引主要有两种:B-树索引和位图索引---(1)、B-树索引:基于二叉树结构的。B-树索引结构有3个基本组成部分:根结构、分支节点和叶子节点。---其中根节点位于索引结构的最顶端,而叶子节点位于索引结构的最低端,中间为分支节点。----B-树索引是oracle中默认的索引类型,是一个树状结构的目录----create index 索引名称 on 表名(列名);create index index_ename on emp(ename);----确认索引的创建可以到这里查看select * from user_indexes;----索引创建好之后,当使用相关列查询数据时,索引会自动帮助查询语句提高效率---当表中的数据发生变化时,索引会自动更新,不需要手动更新维护---当数据大量的变化后,索引会产生一些碎片文件,占用空间并且影响效率---可以定期对索引进行重建,清除碎片文件(2)、位图索引----B-树索引适合某列中有大量不同的数据----当某一列中有大量重复的数据时,应该用位图索引----位图索引不适合数据变化过于频繁的列----create bitmap index 索引名称 on 表名(列名)create bitmap index index_deptno on emp(deptno);7、触发器----触发器 trigger,与某些特定操作绑定的操作,不会主动实施,----但当条件满足时,会在绑定的操作触发时同步操作。/*create (or replace) trigger 触发器名称before/afterinsert or update or delete(of 列) on 表(for each row)(when (条件范围))begin触发操作(insert or update or delete);end;??before和after定义触发的时间是在操作之前还是操作之后insert or update or delete定义触发的操作(of 列) on 表:定义对哪张表的哪一列操作时触发for each row:定义是否每行数据都触发一次when:中间作为条件的列,必须使用old或者new来限定,表示修改前的列或者修改后的列*/-----先创建一张表用来存储相应的记录信息create table record_dept30(ename varchar2(20),old_job varchar2(20),new_job varchar2(20),rec date);select * from record_dept30create trigger tri1afterupdateof job on empfor each rowwhen (old.deptno=30)begininsert into record_dept30values(:old.ename,:old.job,:new.job,sysdate);end;----在begin部分如果要调用表中的数据,使用:old和:new 来限定8、阻止操作----不允许对manager的工资进行修改/*触发时间:before、after触发操作:update、delete、insert触发对象:emp表中sal列触发的范围:职位是manager*//*阻止操作使用raise_application_error(作为id,错误提示) 方法,强制提交一个错误错误id是自定义的,推荐使用-20000~29999之间的数字,错误提示自定义文本*/create or repaley trigger tri2before?update?of sal on empfor each row?when (old.job=‘MANAGER‘)beginraise_application_error(-20001,‘ddssfadfadsfas‘); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |