zoukankan      html  css  js  c++  java
  • 序列-索引-视图

    1.Sequence序列:

        生成想要的主键列 (在Oracle中没有主键自增的概念,一般使用序列来完成功能。)
    创建序列:
        一般不需要设置sequence的属性,使用默认方式就可以了
        create sequence 序列名;
        如果需要设置属性,那么就加上下面的语句.
        [INCREMENT BY n]  每次拿出值加多少
        [START WITH n]    初始值从几开始
        [{MAXVALUE n | NOMAXVALUE}]  最大值
        [{MINVALUE n | NOMINVALUE}]  最小值
        [{CYCLE | NOCYCLE}]  到了最大值后是否循环(如果循环会从1开始)
        [{CACHE n | NOCACHE}] 每次在缓存里面放多少个值.
        例如:创建序列并设置属性
          create sequence seq_test 
          increment by 2
          start with 45
          maxvalue 60
          cycle
          nocache;
        drop sequence seq_test;
    删除序列:
        drop sequence 序列名;
    获取序列的下个值
        select 序列名.nextval from dual;
    获取序列的当前值(一开始不能用,要先用nextval)
        select 序列名.currval from dual;
    实例:
       create table t_user(
            id number,
            name varchar2(50) constraint user_name_nn not null,
            email varchar2(50),
            gender char(1),
            age number,
            birthday date,
            constraint user_id_pk primary key(id),
            constraint user_email_un unique(email),
            constraint user_gender_ck check(gender in('f','m'))
        );
        create sequence t_user_seq;
        insert into t_user(id,name,salary) values(t_user_seq.nextval,'tom',600);

    2.index索引:

        索引的概念:
            1. 类似书的目录结构
            2. Oracle 的"索引"是一种对象,是与表关联的可选对象,能提高SQL查询语句的速度
            3. 索引直接指向包含所查询值的行的位置,减少磁盘I/O
            4. 索引和表是相互独立的物理结构
            5. Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引
        索引的原理:
            例如:一个表中有name字段,假设要查找name='tom'的这条数据若没有索引,查找这个记录时,需要搜索表中所有的记录,因为不能保证只有一个tom,那么就必须将表中数据全部搜索一遍。
            若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值在什么位置按照一定的规则进行排列,然后构建索引条目,存储到索引段中,查询name为tom时,可以直接查找该数据所在的对应地方。
            创建了索引并不一定就会使用,因为oracle在自动统计表的信息后,会决定是否使用索引,表中数据很少时,使用全表扫描速度已经很快了,那么就没有必要使用索引了。
        

     索引的创建:
            1.自动创建
                当在表中指定了primary Key或者unique约束时会自动创建唯一值索引。
            2.用户创建。
            用户可以创建非唯一值索引以提高在访问数据时的效率。
            语法:
                create index 索引名
                on 表名(列名);
            例如:
                 create index emp_index
                 on s_emp(last_name);
            
     删除索引:
                drop index 索引名;
            例如:
                drop index emp_index;
            创建成功后可以通过如下语句查看:
                select index_name from user_indexes;

        给某列创建索引的原则:
            1.列经常作为where子句的限定条件或者作为连接条件
            2.列包含的数据量很大,并且很多非空的值。
            3.两个或者更多列频繁的组合在一起作为where的限定条件或者连接条件
            4.列总是作为搜索条件
            5.索引查出的数据量占2%~4%
            6.索引不是越多越好,不是索引越多越能加速查找。
            7.要索引的表不经常进行修改操作
        注意:
            1.在表中的某一个合适的列加入上了索引,那么也只有在数据量很大的时候,才能有所体现出这个查询的效率.
            2.索引一旦建立成功,那么之后这个索引就由系统来管理,我们自己是控制不了的.

        索引的种类:
            Single column 单列索引
            Concatenated  多列索引
            Unique        唯一索引
            NonUnique     非唯一索引
        
        索引结构分为:
            B-tree(默认是这种结构)
                适合大量的增、删、改;
                不能用包含OR操作符的查询;
                适合高基数的列(唯一值多)
                典型的树状结构;
                默认创建的索引就是这种结构。
                create index emp_index on s_emp(last_name);
                drop index emp_index;

            位图
                做UPDATE代价非常高(oracle要根据表的每次修改来更新索引)
                非常适合OR操作符的查询;
                数据基数比较少的时候较适合建位图索引。
                create bitmap index bitmap_index on s_emp(last_name);
                drop index bitmap_index;
                注意:查询是否具备了bitmap索引的功能
                select * from v$option Where PARAMETER='Bit-mapped indexes'
                如果value值为false表示,Oracle该版本不具有bitmap索引功能或未装

            反序
                反向索引是B-tree索引的一个分支,主要是在创建索引时,针对索引列的索引键值进行字节反转。
                例如,键值1001、1002、1003,反转后1001、2001、3001,进而将值分散到不用的节点中。
                create index emp_index_reverse on s_emp(last_name) reverse;
                drop index emp_index_reverse;

            函数索引
                经常对某个字段做查询的时候,并且是带函数操作的,那么此时函数索引就可以发挥作用,提高检索速度。
                create index func_index  on s_emp(upper(last_name));
                drop index func_index;
     
    2.view视图:
        视图的概念:提取一张或多张表的数据,生成一个映射,操作视图可以达到操作原表的效果,方便数据的操作
     
        作用
            1.隐藏表中的重要数据
            2.代替一些比较长的SQL语句
     
     分类:简单视图和复杂视图
     
     区别:通过简单视图可以修改原表的数据

    1.简单视图:视图代表的SQL语句中没有组函数,只有一张表数据
     
    创建      
        create or replace view 视图名字
        as
        sql语句
    删除      
      drop view 视图名字
    实例
    create or replace view v_test
    as 
    select *
    from t_user
    where id>10;
    
    select * from v_test;
    
    create or replace view v_test
    as 
    select *
    from t_user
    where id>10
    with read only;//只读视图
    
    create or replace view v_test
    as 
    select *
    from t_user
    where id>10
    with check option;//通过视图进行的操作,必须在视图的可见范围内,
    //即视图中有的数据可以修改,但是视图中没有,原表中有的数据不可以修改 
     
    2.复杂视图:视图代表的SQL语句中有组函数,有多张表数据
    复杂视图
        create or replace v_test
        as
        select avg(salary) from
        t_user;
    注意:简单视图中对原表数据修改,视图中的数据随即变化
  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/Magic-Li/p/12774920.html
Copyright © 2011-2022 走看看