第三章数据库对象本章任务使用Oracle创建各种数据库对象理解和使用序列理解和创建视图理解和创建索引本章目标数据库对象简介Oracle数据库对象又称模式对象数据库对象是逻辑结构的集合,最基本的数据库对象是表其他数据库对象包括数据库对象序列视图索引序列序列是用于生成唯一、连续序号的对象序列可以是升序的,也可以是降序的使用CREATESEQUENCE语句创建序列SQLCREATESEQUENCEtoys_seqSTARTWITH10INCREMENTBY10MAXVALUE2000MINVALUE10NOCYCLECACHE10;指定内存中预先分配的序号数访问序列通过序列的伪列来访问序列的值NEXTVAL返回序列的下一个值CURRVAL返回序列的当前值SQLINSERTINTOtoys(toyid,toyname,toyprice)VALUES(toys_seq.NEXTVAL,‘TWENTY’,25);SQLINSERTINTOtoys(toyid,toyname,toyprice)VALUES(toys_seq.NEXTVAL,’MAGICPENCIL’,75);指定序列的下一个值SQLSELECTtoys_seq.CURRVALFROMdual;检索序列的当前值更改和删除序列SQLALTERSEQUENCEtoys_seqMAXVALUE5000CYCLE;使用ALTERSEQUENCE语句修改序列,不能更改序列的STARTWITH参数使用DROPSEQUENCE语句删除序列SQLDROPSEQUENCEtoys_seq;视图视图以经过定制的方式显示来自一个或多个表的数据视图可以视为“虚拟表”或“存储的查询”创建视图所依据的表称为“基表”视图的优点有:提供了另外一种级别的表安全性隐藏的数据的复杂性简化的用户的SQL命令隔离基表结构的改变通过重命名列,从另一个角度提供数据创建视图3-1studnostudnamestudmarkssubnostudcaste1Rob452Open2James334SC3Jesica405OpenStud_detailsStud_viewstudnostudnamesubno1Rob22James43Jesica5CREATEVIEWstud_viewASSELECTstudno,studname,subnoFROMStud_details;创建视图3-2创建视图的语法:CREATE[ORREPLACE][FORCE]VIEWview_name[(alias[,alias]...)]ASselect_statement[WITHCHECKOPTION][WITHREADONLY];创建视图3-3使用WITHCHECKOPTION选项创建视图CREATEORREPLACEVIEWpause_viewASSELECT*FROMorder_masterWHEREostatus='p'WITHCHECKOPTIONCONSTRAINTchk_pv;使用ORDERBY子句创建视图CREATEORREPLACEVIEWord_venASSELECT*FROMvendor_masterORDERBYvenname;创建带有错误的视图CREATEFORCEVIEWvenASSELECT*FROMvenmaster;联接视图2-1StudnoStudnameSubmrksSubno1Rob4522James3343Jesica404SubnoSubname2English4Maths5ScienceStud_detailsSub_detailsCREATEVIEWStud_sub_viewASSELECTStudno,Studname,Submrks,SubnameFROMStud_details,Sub_DetailsWHEREStud_details.Subno=Sub_details.Subno;Stud_sub_view联接视图StudnoStudnameSubmrksSubname1Rob45English2James33Maths3Jesica40Maths联接视图2-2创建外联接视图CREATEVIEWven_ord_outj_viewASSELECTvm.vencode,venname,orderno,odate,ostatusFROMvendor_mastervm,order_masteromWHEREvm.vencode=om.vencode(+);SELECTvm.vencode,venname,orderno,odate,ostatusFROMvendor_mastervmLEFTOUTERJOINorder_masteromONvm.vencode=om.vencode;视图上的DML语句在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE视图上的DML语句有如下限制:只能修改一个底层的基表如果修改违反了基表的约束条件,则无法更新视图如果视图包含连接操作符、DISTINCT关键字、集合操作符、聚合函数或GROUPBY子句,则将无法更新视图如果视图包含伪列或表达式,则将无法更新视图索引3-1索引是与表相关的一个可选结构用以提高SQL语句执行的性能减少磁盘I/O使用CREATEINDEX语句创建索引在逻辑上和物理上都独立于表的数据Oracle自动维护索引索引3-2索引有各种类型,除了标准索引外,还有一些特殊类型的索引:索引的类型基于函数的索引反向键索引位图索引唯一索引组合索引索引3-3SQLCREATEINDEXitem_indexONitemfile(itemcode)[TABLESPACEtablespace_name];创建标准索引重建索引SQLALTERINDEXitem_indexREBUILD;删除索引SQLDROPINDEXitem_index;唯一索引唯一索引确保在定义索引的列中没有重复值Oracle自动在表的主键列上创建唯一索引使用CREATEUNIQUEINDEX语句创建唯一索引SQLCREATEUNIQUEINDEXitem_indexONitemfile(itemcode);组合索引组合索引是在表的多个列上创建的索引索引中列的顺序是任意的如果SQL语句的WHERE子句中引用了组合索引的所有列或大多数列,则可以提高检索速度SQLCREATEINDEXcomp_indexONitemfile(p_category,itemrate);反向键索引反向键索引反转索引列键值的每个字节通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上创建索引时使用REVERSE关键字SQLCREATEINDEXrev_indexONitemfile(itemcode)REVERSE;SQLALTERINDEXrev_indexREBUIDNOREVERSE;位图索引位图索引适合创建在低基数列上位图索引不直接存储ROWID,而是存储字节位到ROWID的映射减少响应时间节省空间占用SQLCREATEBITMAPINDEXbit_indexONorder_master(orderno);基于函数的索引基于一个或多个列上的函数或表达式创建的索引表达式中不能出现聚合函数不能在LOB类型的列上创建创建时必须具有QUERYREWRITE权限SQLCREATEINDEXlowercase_idxONtoys(LOWER(toyname));SQLSELECTtoyidFROMtoysWHERELOWER(toyname)='doll';获取索引的信息与索引有关的数据字典视图有:只能修改一个底层的基表USER_INDEXES-用户创建的索引的信息USER_IND_PARTITIONS-用户创建的分区索引的信息USER_IND_COLUMNS-与索引相关的表列的信息SQLSELECTINDEX_NAME,TABLE_NAME,COLUMN_NAMEFROMUSER_IND_COLUMNSORDERBYINDEX_NAME,COLUMN_POSITION;总结序列用于生成唯一、连续的序号视图是基于一个或多个表的虚拟表索引是与表相关的一个可选结构,用于提高SQL语句执行的性能索引类型有标准索引、唯一索引、反向键索引、位图索引和基于函数的索引