• Oracle Class4. 数据库对象(同义词,序列,视图,索引,簇) 全新时代


    ------------------------2013-5-9------------------------
    索引的建立情况:经常用于查询,排序和分组的列(即经常在where,order或group by子句中出现的列)

    主键索引和复合索引。

    desc student;
    create index i_stu_name on student(STU_NAME);

    --删除索引,当表结构被删除时,与其所有的索引都会随之删除。
    drop index i_stu_name;

    --查询索引的语句,表名必须大写,否则查询不到值。
    select table_name, index_name,status from all_indexes where table_name = 'STUDENT';

    select index_name,column_name,column_position from all_ind_columns where table_name='STUDENT';

    索引的特点:
    1.不同值较多上建立索引,不同值少的列上不要建。如性别列只有男与女两个值,因此就没有必要建立索引。(bitmap)
    2.索引上面加表达式,索引不能正常使用。 (函数索引)
    3.where子句中如果使用in,or,like,!=,均会导致索引不能正常使用。
    4.使用复合索引进行查询时必须使用前置列。

    写where条件时,有索引的判断在前,其他字段的判断在后。如果where条件中用到复合索引,按照索引列在复合索引中出现的顺序来依次写where条件。
    使用多表连接时,在from子句中,将记录数少的表放在后面,可提高执行效率。

    首先从大表中查询需要的记录,此时记录数已经被大量缩小,然后再和其他两个表连接,速度会得到很大改善!

    查询数量较大时,使用表连接代替in,exists,not in,not exists等。

    然后不断的积累经验,并且注意不能一概而论。

    全局索引,本地索引,全局分区索引。

    --创建临时表
    --create global temporary table myemp as select * from student;

    select * from myemp;
    desc myemp;

    --删除临时表
    drop table myemp;

    --增加一个列
    --alter table student add(deptno varchar2(6));
    --修改一个列
    --alter table student modify(deptno varchar2(10));
    --删除表中的一个列,oracle8.0.5版本以上方可。
    alter table student drop column deptno;

    desc student;

    -->3.2.4使用CHECK做限制条件

    ------------------------2013-5-10------------------------

    --创建员工宿舍表
    create table lodging(
      lodging char(18) primary key,
      name varchar2(10)
    );

    --创建工人表
    create table worker(
      empno number(4) primary key,
      name varchar2(10),
      age number(2) check(age between 18 and 60),   --check检查约束
      lodging char(18) references lodging(lodging)  --外键关联
    );

    --员工基本信息表
    create table emp3(
      empno number(4) constraint abc primary key,
      ename varchar2(10),
      job varchar2(10),
      sex char(2) check(sex='男' or sex='女'),
      mgr number(4),
      hiredate date,
      sal number(7,2),
      comm number(7,2),
      deptno number(2),
      check (sal+comm > 0 and sal+comm < 5000)
    );


    --使用unrecoverable创建表,nolodging lodging
    create table table_copy as select * from emp3 unrecoverable;
    --使用nolodging关键字创建
    create table table_copy2 as select * from emp3 nolodging;
    --使用lodging关键字创建
    create table table_copy3 as select * from emp3 lodging;

    --查询表空间
    select tablespace_name,table_name,initial_extent from user_tables;

    create table table3(
      xm varchar2(12),
      sal number(4,2)
    );

    //修改表结构
    alter table table3 modify sal number(6,2);

    insert into table3 values('gao',1111.11);
    insert into table3 values('gao',1111.11);
    insert into table3 values('zhu',5555.55);


    insert into table3 values('zhu',55551.55);
    ORA-01438: 值大于此列指定的允许精确度

    ##定点数的精度(p)和刻度(s)遵循以下规则##
    1.当一个数的整数部分的长度 > p-s时,Oracle会报错。
    alter table table3 add sal2 number(6,2);     -->1111.11
    2.当一个数的小数部分的长度 > s时,Oracle就会舍入。  
    insert into table3 values('zhu',5555.5589);         -->5555.56
    3.当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
    alter table table3 add sal2 number(2,-2);

    insert into table3 values('zhu',1111.11,5609.12);   -->5600
    insert into table3 values('zhu',1111.11,5678.78);   -->5700
    insert into table3 values('zhu',1111.11,609.12);    -->600
    insert into table3 values('zhu',1111.11,63.12);     -->100
    insert into table3 values('zhu',1111.11,43.12);     -->0

    4.当s > p时,p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入。
    --更加明白的说法--
    --当p小于s时候,表示数字是绝对值小于1的数字,且从小数点右边开始的前s-p 位必须是0,保留s位小数。
    insert into table3 values('zhu',1111.11,43.12,0.00126);  -->0.0013

    insert into table3 values('zhu',1111.11,43.12,0.00996);  -->报错,这样会进位,绝对值大于1。
    #http://ilinux.iteye.com/blog/289550#

    --对表中的列表示为不使用
    --alter table table3 set unused(sal3);


    --创建主键
    create table dept1(
      deptno number(2),
      dname varchar2(10),
      loc varchar2(20),
      constraint pk_dept primary key(deptno)
    );

    --增加表的主键
    --alter table table3 add ( pk_key primary key (sal) );

    --ORA-00907: 缺少右括号 ??
    alter table table3 add(pk_key primary key (xm));  --可能跟表有关系

    alter table dept1 add primary key(deptno);        --系统默认的名称
    alter table dept1 add constraint pk_dept primary key(deptno); --constraint必须要写--
    #http://miracle.blog.51cto.com/255044/55315#

    --主键不可用
    create table dept2(
      deptno number(2) primary key,
      dname varchar2(10)
    )
    disable primary key;


    --启用取消的主键,才可以建立外键关系,否则报错。
    alter table dept2 enable primary key;

    --ORA-02270: 此列列表的唯一或主键不匹配
    create table table4(
      id varchar2(8),
      deptno number(2) references dept2(deptno)   --外键
    );

    唯一索引和复合主键
    e_name varchar2(8) constraint un_dname unique,
    name varchar2(10) constraint pt_1 primary key,
    表结构最后一行写
    constraint pri_3 primary key(deptno)
    --外键
    deptno constraint pri_4 references dept5(deptno);


    --创建复合主键
    --alter table dept1 add constraint pk_dept primary key(deptno,dname);

    alter table dept1 add primary key(deptno,dname);

    --创建复合主键 禁用状态。
    alter table dept1 add primary key(deptno,dname) disable;

    --禁用主键,如果有一外键依赖于该主键,则系统会报错。
    alter table dept1 disable constraint SYS_C002136;  (语法适用于外键)
    --恢复主键
    alter table dept1 enable constraint SYS_C002136;
    --删除主键
    alter table dept1 drop constraint SYS_C002136;    (语法适用于外键)
    --删除主键,将外键一起删除。
    alter table dept1 drop constraint pk_2 cascade;

    create table dept5(
      deptno varchar(8),
      name varchar(8),
      loc varchar(4),
      constraint pri_3 primary key(deptno)  --建立主键
    );

    create table emp5(
      emptno number(4),
      ename varchar2(10),
      job varchar2(10),
      mgr number(4),
      deptno constraint pri_4 references dept5(deptno)  --外键
    );

    create table emp6(
      emptno number(4),
      ename varchar2(10),
      job varchar2(10),
      mgr number(4),
      deptno, constraint pri_5 foreign key(deptno) references dept5(deptno)  --外键,逗号不能少。
    );

    create table emp7(
      emptno number(4),
      ename varchar2(10),
      job varchar2(10),
      mgr number(4),
      deptno varchar(8) , constraint pri_6 foreign references dept5(deptno) on delete cascade  --外键,使用delete cascade管理引用完整性
    );

    #索引组织表# 基于主键进行搜索
    create table命令与organization index子句一起用于创建索引组织表。
    --表及索引.txt--

    --抽象数据类型的使用
    create type add_type as object(
      street varchar2(10),  --街道名
      city varchar2(10),    --城市名
      state char(2),        --州代码
      zip   number          --邮编
    );
    create table customer(
      name varchar2(10),
      address add_type
    );
    insert into customer values('1',add_type('mystatree','some city','st',10001));

    大数据类型使用,clob,blob,bfile。  -->ORACLE埃里森1.txt

    3.9.1.表和索引数据字典
     .DBA_TABLES,ALL_TABLES,USER_TABLES  存放表的基本信息
     .DBA_INDEXS,ALL_INDEXS,USER_INDEXS  存放索引的基本信息
     .DBA_IND_COLUMN                     存放有索引的列的信息
     .ALL_CONSTRAINTS                    存放表的限制信息
     .ALL_COLS_COLUMNS                   存放表的列的限制信息

    查询当前用户的基本信息,包括表名,索引名及表空间,存储参数。
    select tablespace_name,table_name,initial_extent,next_extent from all_tables where owner = user;

    --查询当前用户的限制信息
    select owner,constraint_name,table_name from user_constraints;

    select search_condition from user_constraints;
    SEARCH_CONDITION
    --------------------------------------------------------------------------------
    sex='男' or sex='女'
    sal+comm > 0 and sal+comm < 5000
    "ID" IS NOT NULL
    "NAME" IS NOT NULL
    age between 18 and 60


    #创建视图#
    create or replace view viewTitles
    as
    select title_id,nvl(price,0) price from titles;  --SQL语句--

    无法直接指定一个分区数据表的多个分区中的数据时,通过union关键字将多个数据表分区联结。
    create or replace view viewStus
    as
    select * from student partition(east)
    union
    select * from student partition(west);
    --通过视图来实现,可以简化SQL命令。
    select * from viewStus;

    查看用户创建的视图信息(user_views)
    select * from user_views;

    删除试图
    delete view viewStus;

    --查看用户序列
    desc user_sequences;
    --查询簇信息
    desc user_clusters;

    ##簇##

    簇表
    簇索引
    簇表其实就是一组表,是一组共享相同数据块的多个表组成。将经常一起使用的表组合在一起成为簇可以提高处理效率。
    在一个簇中的表就叫做簇表。建立顺序是:簇 ->簇表 ->数据 ->簇索引。

    唯一索引
    组合索引
    反向键索引:在创建索引时使用reverse关键字。
    位图索引:为低基数列创建,bitmap index语句用于创建位图索引。
       优点:减少响应时间,降低空间占用。
       --无须频繁的修改造成死锁--


    当索引被创建后,由Oracle自动维护。

    create table student8(
      stu_no number(2),
      stu_name varchar2(8)
    );

    --在指定的字段上创建唯一索引
    create unique index idx_stu_no
    on student8(stu_no);


    insert into student8 values(1,'ANiu');
    --ORA-00001: 违反唯一约束条件 (NEWLIFEYHJ.IDX_STU_NO)
    insert into student8 values(1,'AZhu');

    select * from student8;

    数据库对象
    同义词:数据库对象的替换名称,隐藏了对象的名称和所有者。
    序列:生成唯一,连续的整数。
    -- 获取序列的下一个值
    -- 序列的第一个值必须通过NextValue来获得
    select seqTest1.NextVal from dual;
    -- 获取序列的当前值
    select seqTest1.CurrVal from dual;
    视图:经过定制的表示方式,用于显示来自一个或多个表的数据。
    索引:加快了SQL语句的执行速度。多个列上的创建的索引称为“组合索引”。
          在索引组织表中,数据访问基于主键值。
    簇:一组表,这些表拥有公共列,并且一起使用。

    create
    alter
    drop


    ------------------------2013-5-14------------------------
    普通表与索引表的对比
    普通表   索引编排表
    rowid唯一的标识行 主键唯一的标识行
    隐式的rowid列  没有隐式的rowid列
    基于rowid的访问  基于主键的访问
    顺序扫描返回所有行 完全索引扫描返回所有行,并按主键顺序排列
    普通表可以存储在簇中 索引组织表不能存储在簇中
    支持分发,复制和分区 不支持分发,复制和分区

    区别:rowid与主键,顺序扫描和索引扫描,簇,分发,复制和分区。

    基于函数的索引
    基于一个或多个列上的函数或表达式创建的索引
    表达式中不能包含聚集函数(sum,count,avg,min,max)
    不能在lob,ref或嵌套表列上创建

    键压缩索引:compress子句用于创建这种索引。
    分区索引
    分区索引的类型
    本地索引
    全局索引

  • 相关阅读:
    拓端tecdat|Python实现谱聚类Spectral Clustering算法和改变簇数结果可视化比较
    深入浅出eBPF|你要了解的7个核心问题
    异步任务处理系统,如何解决业务长耗时、高并发难题?
    什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同
    Java 应用压测性能问题定位经验分享
    EasyNLP带你玩转CLIP图文检索
    现代斗山X瓴羊:“一横四纵“解决方案聚焦中台场景级部署
    DataFunTalk:阿里建设一站式实时数仓的经验分享
    阿里可观测性数据引擎的技术实践
    全面升级!揭秘阿里云智能Logo设计的AI黑科技
  • 原文地址:https://www.cnblogs.com/simpledev/p/3092913.html
Copyright © 2020-2023  润新知