Oracle --视图,索引

一.what(什么是视图?)
1.视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,
   
  而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。

2.根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合,
它存储了要执行检索的查询语句的定义,以便在引用该视图时使用。
 
二.why(为什么要用视图?视图的优点)
1.简化数据操作:视图可以简化用户处理数据的方式。

2.着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。

3.视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。

4.提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。

5.自定义数据:视图允许用户以不同方式查看数据。

6.导出和导入数据:可使用视图将数据导出到其他应用程序。

三 :HOW (怎么样来建立视图,用视图)

-- 注意:创建视图需要create view的权限

视图的创建基本语法:
    CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]

AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]] 
[WITH READ ONLY] 
其中:
OR REPLACE    :若所创建的试图已经存在,ORACLE自动重建该视图;
FORCE              :不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE         :只有基表都存在ORACLE才会创建该视图:
alias                   :为视图产生的列定义的别名;
subquery           :一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION :
                            插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY :
                           该视图上不能进行任何DML操作。

--例:
create or replace view dept_sum_vw
              (name,minsal,maxsal,avgsal) -- 定义列的别名
       as select d.dname,min(e.sal),max(e.sal),avg(e.sal)
       from    emp e,dept d
       where e.deptno=d.deptno
       group by d.dname;
-- 视图的查询(类似于表的查询)
select * from dept_sum_vw where name='ACCOUNTING';
-- 视图的DML操作
--update的情况,必须是以下情况
--1. view的字段只涉及一个表。
--2. 如果涉及多个表的话,被(涉及到的)view列所映射table列(或列的组合)必须是有主健或者unique约束的
-- 准备测试数据
create table t_emp as select * from emp;
create table t_dept as select * from dept;
alter table t_emp add constraint pk_empno primary key(empno); -- 添加主键
alter table t_dept add constraint pk_deptno primary key(deptno);
--创建视图
create or replace view ed_vw
as
select e.empno,e.ename,e.sal,d.dname,d.deptno from t_emp e inner join 
t_dept d on e.deptno = d.deptno  --with read only;

--update操作(注意: 当视图定义中包含
--               分组函数,GROUP BY子句,DISTINCT关键字,ROWNUM 伪列
--               的情况下不能执行update操作
--)
update  ed_vw set ename='SMITH_TEST' where empno=7369;

--delete操作(注意:当视图定义中包含分组组函数,GROUP BY子句, DISTINCT关键字, ROWNUM 伪列, 列的定义为表达式
--                          DUAL伪表的情况下不能执行delete操作
--)
delete from ed_vw where empno = 7369;

--insert操作(注意:当视图定义中包含
--                    分组函数,GROUP BY子句, DISTINCT关键字,
--                    ROWNUM 伪列, 列的定义为表达式 不能执行insert操作                  
)
insert into ed_vw(empno,ename,sal) values(2345, 'test', 99.9);


--视图的删除
  DROP VIEW VIEW_NAME语句删除视图。
            删除视图的定义不影响基表中的数据。
            只有视图所有者和具备DROP VIEW权限的用户可以删除视图。
            视图被删除后,基于被删除视图的其他视图或应用将无效。

drop view ed_vw --(删除指定的视图);
一.what(什么是索引?)
1、 类似书的目录结构
2、 Oracle 的“索引”对象,与表关联的可选对象(可建也可以不建)
3、 索引直接指向包含所查询值的行的位置,减少磁盘I/O
4、 与所索引的表是相互独立的物理结构
5、 Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引

二.why(为什么要用索引?)
    提高SQL查询语句的速度

三: HOW(怎么用)
索引的类型
1:唯一索引
2:组合索引
3: 反向索引
4:位图索引
5:基于函数或者条件的索引


-- 创建索引

create index 索引名 ON 表名 (列名)

tablespace 表空间名;

 --创建一张产品表(tb_product),为该表的product_id列创建索引,以便在使用到该列时提高查询效率。
create table tb_product
(
  product_id              number, --编号
  product_name            varchar2(100),--名称 
  product_type            varchar2(20), -- 类型
  product_price           number(10,4) -- 价格
);

insert into tb_product values(1,'Java编程思想','学习资料',99.9);
insert into tb_product values(2,'C++编程思想','学习资料',98.9);
insert into tb_product values(3,'C编程思想','学习资料',97.9);
insert into tb_product values(4,'Javascript入门到精通','学习资料',96.9);
insert into tb_product values(5,'Java设计模式','学习资料',95.9);
insert into tb_product values(6,'C#基础到实战','学习资料',94.9);
insert into tb_product values(7,'设计模式','学习资料',93.9);

--唯一索引

 何时创建:当某列的值都不相同

 当建立primary Key(主键)或者unique constraint(唯一约束)时,唯一索引将被自动建立

 语法:create unique index 索引名 on 表名 (列名) TABLESPACE 表空间名;


  create unique index product_id_u1 on tb_product(product_id);


--组合索引
何时创建:当两个或多个列经常一起出现在where条件中时,则在这些列上同时创建组合索引

组合索引中列的顺序是任意的,也无需相邻。但是建议将最频繁访问的列放在列表的最前面

语法:CREATE INDEX 索引名 ON 表名 (列名1,列名2) 

     TABLESPACE 表空间名; 

create unique index name_type_index on tb_product(product_name,product_type);
explain plan from select *  from  tb_product where product_name='Java编程思想' 
and product_type='学习资料'; 

--反向键索引
目的:比如索引值是一个自动增长的列:
多个用户对集中在少数块上的索引行进行修改,容易引起资源的争用,比如对数据块的等待。此时建立反向索 引。
语法:CREATE INDEX 索引名 ON 表名 (列名) reverse

     TABLESPACE 表空间名; 

create unique index product_id_rev on tb_product(product_id) reverse;

--位图索引
何时创建:列中有非常多的重复的值时候。例如某列保存了 “性别”信息。
Where 条件中包含了很多OR操作符。较少的update操作,因为要相应的跟新所有的bitmap

结构:位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。
优点:位图以一种压缩格式存放,因此占用的磁盘空间比标准索引要小得多

语法:CREATE BITMAP INDEX index ON table (column[, column]...);

CREATE BITMAP  INDEX pt_index ON tb_product (product_type);

--基于函数索引
何时创建:在WHERE条件语句中包含函数或者表达式时

函数包括:算数表达式、PL/SQL函数、程序包函数、SQL函数、用户自定义函数。

语法:CREATE INDEX index ON table (FUNCTION(column));

CREATE INDEX fn_index ON tb_product (UPPER(product_name));


猜你喜欢

转载自blog.csdn.net/mao502010435/article/details/80017898