学习笔记-视图、序列和索引

视图
什么是视图?
视图表的一种形式,是一种逻辑表。视图基于表或者其他视图。视图中并没有真正的数据,只是提供了另一个
视角去查看或改变表中的数据。视图的本质是一个select语句。

为什么要用视图?
    1,视图可以起到隐藏数据的功能。在基于表中字段创建视图时,可以选择性的显示表中的字段。
    2,视图可以将复杂的多表链接查询的结果存放到一个简单的表结构中。

视图的分类
    可以分为简单视图和复杂视图。
    简单视图:涉及的表数目:1个,不包含函数,不包含数据分组,进行DML操作。
    复杂视图:涉及的表数目:1个或多个,包含函数,包含数据分组,不可以进行DML操作。

视图的存储和执行
    视图可以通过查询数据字典视图user_views得到视图的名字和视图的定义。
    构成视图的select语句的文本被存储在Long字段中。

select * from user_views;
    当用户从视图中查询数据时,Oracle数据库先从user_views中获得视图的定义,然后将对视图的查询转换为对
    基表的查询操作。

简单视图
    创建形式
        create [on replace] | [force | noforce] view view_name [(aliaslist)] as subquery
        [with check option [contraint c_name]]
        [with read only];

        on replace: 当视图已经存在的时,就将其替换,重新创建。
        force: 视图的创建,不管基表是否存在。
        noforce: 视图的创建,基表必须存在。不然创建不成功。默认的
        aliaslist: 表示视图的字段。
        subquery: 表示子查询。
        with check option: 表示只有在可访问的行,才能被插入或更新。
        with read only: 表示这个视图只能读取,不能执行DML操作。


        create on replace view myview ('id', 'name') as 
        select employee_id, last_name from employees;

    查询视图
        select * from myview [where];

复杂视图
    复杂视图涉及的表多于1个,所以不能进行DML操作。

    创建形式
        create on replace view myview (name, avg_salary, min_salary, max_salary) as 
        select d.department, avg(e.salary), min(e.salary), max(e.salary) from 
        employees e, departments d where e.employee_id = d.department_id group by d.department_name;

视图的DML操作
    只是针对简单视图的。

    删除视图
        delete from myview where id = 20;

    更新视图
        update myview set name = 'xxx' where id = 20;

    插入视图
        insert into myview values (2, 'xxx');
        注意:在插入时,可能会出现错误。为啥呢?因为,在依据基表个别字段创建视图时,
        在视图插入的只是这几个字段的值,其他字段的值没法输入,就为空。
        如果剩下的字段中not null,那么就会出错。如果剩下的字段中没有not null,就不会报错。

    DML操作规则
        在没有组函数,没有group by子句,没有distinct关键字的基础上。
        如果视图中有伪列rownum关键字,那么就不能进行删除操作。
        如果视图中有伪列rownum,有表达式定义的字段,就不能进行更新操作。
        如果视图中有伪列rownum,有表达式定义的字段,基表中有not null字段,就不能进行插入操作。

    with check option子句
        通过视图可执行的行进行插入和更新的操作,不能产生视图不能选择的行。
        不太懂?写个例子吧!

        先创建一个视图:视图的字段从select中获取,假设不存在not null 约束。
        create view myview as select * from employees where department_id = 20 with check option contraint myview_con;
        更新视图:
        update myview set department_id = 30 where last_name = 'xxx';
        这样就会报错,因为创建视图的时候,deparment_id 的限制为20,但是在更新时,将其换为30,就会出错。这就是产生了视图不能选择的行。

序列
什么是序列?有什么用?
序列式数据库的对象,可以让数据库产生一系列的唯一的数字。主要用于创建一个主键的值。

创建序列
    create sequence sequence_name
        [increnment by n]   
        [start with n]
        [{maxvalue n | nomaxvalue}]
        [{minvalue n | nominvalue}]
        [{cycle | nocycle}]
        [{cache n | nocahce}];

    increnment by n: 序号之间的间隔,n 是一个整数,默认是1
    start with n: 序号从n开始。
    maxvalue n: 规定最大值。当达到最大值时,根据cycle的情况,再进行循环或是提示。
    nomaxvalue: 规定没有最大值。默认,升序的最大值是1027,降序的最小值是-1;
    cycle: 达到最大值或最小值时,进行循环。
    nocycle: 达到最大值或最小值时,不进行循环。
    cache n: 缓冲值的个数。默认是20个。可以用于提高性能。

使用序列
    nextval,currval
    使用 序列名.nextval 会将一个新的序列值产生并放到current中。

    注意:序列的产生可能会有间隙。毕竟序列的产生不依赖于事务。
    当一个事务在提交前使用nextval,然后在回滚事务,但是序列是不会进行回滚的。
    所以再次产生序列,就会出现间隔。
    还有就是系统崩溃时会产生序列。

修改和删除序列
    alter sequence sequence_name
        [increnment by n]   
        [start with n]
        [{maxvalue n | nomaxvalue}]
        [{minvalue n | nominvalue}]
        [{cycle | nocycle}]
        [{cache n | nocahce}];
    修改序列后,只有以后的序列会受到影响,之前的不会受到影响。
    并且修改序列的部分不能使原来的序列产生错误,比如:修改的最大值小于当前的序列值。

    删除序列
    drop sequence sequence_name;

索引
什么是索引?有什么用?
索引是数据库的对象,通过指针的形式提高查询的速度。也就相当于一本书的目录。

索引的创建可以显示的创建,也可以隐式的创建。
索引由Oracle数据库维护,当一个表进行DML操作时,Oracle会自动进行维护索引。
索引虽然可以提高查询速度,但是相应的也会带来系统的开销。所以对于一个表而言,是否创建索引,
创建多少个索引,在哪些字段创建索引,是数据库管理员根据该表的常用操作而做决定的。
比如一个表数据量大,但是经常被用于查询,就建议建立索引。小表的话,经常被插入,删除,就不建立创建多个索引。
在数据表中,伪列rowid是一个16进制的串,访问指定的行的最快的方法就是引用它的rowid。

创建索引
    create [unique] index index_name on table(col1, col2,.....);
    unique 表示建立的是唯一索引还是非唯一索引。

    create index myindex on employees(lower(last_name));
    在查询时速度会变快。
    select * from employees where lower(last_name) = 'xxx';

删除索引
    drop index index_name;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值