• 1. ORACLE之  数据库模式数据字典
  • 2. ORACLE数据库基本结构及逻辑关系Oracle数据库拥有者 N模式11表视图123序列………拥有者物理文件数据文件 日志文件 控制文件表空间 逻辑结构 表 索引段 数据段数据区间 数据块 数据块…..…..物理块 物理结构
  • 3. 模式模式概念 模式与用户的关系 模式选择与切换
  • 4. 模式概念 是指一系列逻辑数据结构或对象的集合。 模式与用户的关系 模式与用户相对应,一个模式只能被一个数据库用户所拥有,并且模式的名称与这个用户的名称相同。 通常情况下,用户所创建数据库对象都保存在与自己同名的模式中。 同一模式中数据库对象的名称必须惟一,而在不同模式中的数据库对象可以同名。 默认情况下,用户引用的对象是与自己同名模式中的对象,如果要引用其他模式中的对象,需要在该对象名之前指明对象所属模式。
  • 5. 模式选择与切换 如果用户以NORMAL身份登录,则进入同名模式; 若以SYSDBA身份登录,则进入SYS模式; 如果以SYSOPER身份登录,则进入PUBLIC模式。 模式对象类型 表、视图、索引、序列、同义词、簇、数据库链接、触发器、存储函数与存储过程、PL/SQL包
  • 6. 表表的概念 表的创建 表参数设置 表的修改 表的删除 表中约束的管理
  • 7. 表的概念存放ORACLE数据库数据的基本单元,数据组织的基本方式。基表由行和列组成。 表名 字段:包含一类信息的列,同一列的数据必须具有相同的数据类型;每列是独立不可分割的数据项;列不允许同名;最多254 记录:表中的行,由不同数值的列组成 表的类型: 根据表生存周期不同,可以分为永久性表和临时表;根据表中数据组织方式不同,可以分为标准表、索引化表和分区表。
  • 8. 创建表(空表) ★基本形式:create table 表名 (列名1 类型 [约束条件], … … … … 列名n 类型[约束条件]) [TABLESPACE 表空间名 STORAGE STORAGE_CLAUSE;] 例:创建一个反映学生成绩以及个人情况的表 SQL> create table student(id number(4) not null, name char(12), physics number(5,2), chemistry number(5,2), mathematics number(5,2));
  • 9. 没讲创建表(空表) 表空间:不选,ORACLE使用默认表空间; 存储器参数: (用于数据字典方式管理的表空间 ) INITIAL:表的初始存储分配,用字节表示。 NEXT:表增大超出初始大小时,下一个区域的大小,用字节表示。 MINEXTENTS:表中现有区域的最小编号。 MAXEXTENTS:表中可以增大的区域的最大编号。可以选UNLIMITED,允许表按需求增大。 PCTINCREASE:每次增加一个新的区域,用这个参数的百分比值表示。如为5,则每个区域增加的表段将比前面一个大百分之5。 注:若不指定storage参数,则继承表空间的存储参数设置
  • 10. 创建表(空表)CREATE TABLE employee( empno NUMBER(5) PRIMARY KEY, ename VARCHAR2(15), deptno NUMBER(3) NOT NULL CONSTRAINT fk_emp REFERENCES dept ) TABLESPACE USERS PCTFREE 10 PCTUSED 40 STORAGE(INITIAL 50K NEXT 50K MAXEXTENTS 10 PCTINCREASE 25);
  • 11. 没讲创建表(空表)数据块管理参数 PCTFREE:用于指定数据块中必须保留的最小空闲空间。 PCTUSED:用于指定当数据块空闲空间达到PCTFREE参数的限制后,数据块能够被再次使用前,已占用的存储空间必须低于的比例。 INITRANS:用于指定能够并发访问同一个数据块的事务的数量。 MAXTRANS:用于指定能够并发访问同一个数据块的事务的最大数量。
  • 12. 创建表(空表)创建基表须定义:表名、列名、列类型、列宽度。 表命名规则 以字母开头,通常取 1~3 0个字符,名称是大小写无关的。 名称应简明扼要但应能让人一眼看出表和列中的内容。表名EMP_LN_F N_SAL不如EMPLOYEE或EMP易懂。 一个用户不能拥有或引用两个同名对象。 不要用D U A L作表名,不要使用以S Y S开头的表名。 避免使用引号、关键字和非字母数字字符。只有 #号、_号和$号例外。 ,$与#的用法是专门的:$号常用于命名动态性能视图, #号常用于 O r a c l e中的特权用户S Y S拥有的一些数据字典表。一般来说,下划线( _号)用于分隔两个单词或缩写。
  • 13. 数据库定义命令对象名不能使用 O r a c l e保留字,如 s e l e c t与f r o m;数据类型,如 N U M B E R或内部函数,如d e c o d e()。生成对象时, O r a c l e不会产生错误,但 S Q L语句中引用这个对象时,可能产生意外结果。 1、Oracle中要定义数据库表,下列哪个选项是无效表名? A. TEST_NUMBER B. P$$#_LOC C). 1_COPY_OF_EMP D. FLOP_TEST_#3只能以字母开头 3. Oracle中生成表时遇到下列错误: ORA-00955-name is already used by existing object。下列哪个选项无法纠正这个错误? A. 以不同用户身份生成对象 B. 删除现有同名对象 C). 改变所生成对象中的列名 D. 更名现有同名对象 列名与表明无关,不同用户可以有同名对象,B技术上可行,实际中不可行。
  • 14. 利用子查询创建表 语法 CREATE TABLE table_name (column_name [column_level_constraint] [,column_name [column_level_constraint]…] [,table_level_constraint]) [parameter_list] AS subquery;
  • 15. 利用子查询创建表注意 通过该方法创建表时,可以修改表中列的名称,但是不能修改列的数据类型和长度; 源表中的约束条件和列的缺省值都不会复制到新表中; 子查询中不能包含LOB类型和LONG类型列; 当子查询条件为真时,新表中包含查询到的数据;当查询条件为假时,则创建一个空表。
  • 16. 利用子查询创建表创建一个表,保存工资高于3000的员工的员工号、员工名和部门号。语句为: CREATE TABLE emp_select (emp_no,emp_name,dept_no) AS SELECT empno,ename,deptno FROM employee WHERE sal>3000; s e l e c t语句的列子句中包括特定列清单,则 create table子句要列出表中要包括的列,放在括号中,
  • 17. 利用子查询创建表SQL> create table emp_copy 2 as select * from emp where deptno = 10; 注意 E M P _ C O P Y表中没有定义任何列名,因为在列子句中用通配符从 E M P表取得数据,让 O r a c l e像E M P表中一样生成 E M P _ C O P Y表中的列—相同名称,相同数据类型定义。
  • 18. 利用子查询创建表结构复制 例:创建一个表temp,其结构与刚刚创建的表student完全一致 SQL> create table temp as select * from student where 1=2; 表已创建。 注:1=2表示一个不可能成立的条件,这样新创建的表就只将原表的结构进行复制,而不复制任何数据
  • 19. 没讲创建临时表 临时表中的数据在特定条件下自动释放,但其结构将一直存在。 临时表中的数据只在当前会话或当前事务中是有效的。 根据临时表中数据被释放的时间不同,临时表分为事务级别的临时表和会话级别的临时表两类。 ON COMMIT DELETE ROWS //事务级临时表 ON COMMIT PRESERVE ROWS //会话级临时表
  • 20. 没讲创建临时表事务级别的临时表是在事务提交时系统自动删除表中所有记录。 CREATE GLOBAL TEMPORARY TABLE tran_temp( ID NUMBER(2) PRIMARY KEY, name VARCHAR2(20) ) ON COMMIT DELETE ROWS;
  • 21. 没讲创建临时表会话级别的临时表是在会话终止时系统自动删除表中所有记录 。 CREATE GLOBAL TEMPORARY TABLE sess_temp( ID NUMBER(2) PRIMARY KEY, name VARCHAR2(20) ) ON COMMIT PRESERVE ROWS;
  • 22. 修改表基本语法 列的添加、删除、修改 约束添加、删除、修改 表参数修改 表结构重组 表重命名 为表和列添加注释
  • 23. 添加列 语法 ALTER TABLE table_name ADD(new_column_name datatype [DEFAULT value] [NOT NULL]); 示例 ALTER TABLE employee ADD(phone VARCHAR2(10),hiredate DATE DEFAULT SYSDATE NOT NULL); 思考:如何增加列值(update/insert),insert与add
  • 24. 修改列类型 语法 ALTER TABLE table_name MODIFY column_name new_datatype; 修改表中列类型时,必须满足下列条件: 可以增大字符类型列的长度和数值类型列的精度; 只有在列值为空或列中数据满足新的长度才能减少列值宽度 如果不改变字符串的长度,可以将VARCHAR2类型和CAHR类型转换; 只有在列值为空时,才能改变数据类型;
  • 25. 示例 ALTER TABLE employee MODIFY ename CHAR(20); ALTER TABLE employee MODIFY phone NUMBER; 修改列名 语法 ALTER TABLE table_name RENAME COLUMN oldname TO newname; 示例 ALTER TABLE employee RENAME COLUMN ename TO employee_name;
  • 26. 删除列 直接删除列语法 ALTER TABLE table_name DROP [COLUMN column_name]|[(column1_name,column2_name,…)] [CASCADE CONSTRAINTS]; 直接删除列示例 ALTER TABLE sc DROP COLUMN sno CASCADE CONSTRAINTS; ALTER TABLE employee DROP (phone,hiredate);
  • 27. 将列标记为UNUSED,然后进行删除。 ALTER TABLE table_name SET UNUSED [COLUMN column_name]|[(column1_name,column2_name,…)] [CASCADE CONSTRAINTS]; 示例 ALTER TABLE player SET UNUSED COLUMN sage; ALTER TABLE player SET UNUSED (sname,resume); ALTER TABLE player DROP UNUSED COLUMNS;
  • 28. 不讲表参数修改 可以对表的参数进行修改,包括存储参数、存储位置、数据块设置等。 ALTER TABLE employee PCTFREE 30 PCTUSED 60 STORAGE(NEXT 512K PCTINCREASE 10); 注意:表创建后不能对INITIAL、MINEXTENTS两个参数进行修改。
  • 29. 不讲表结构重组 将一个非分区的表移动到一个新的数据段中,或者移动到其他的表空间中,通过这种操作可以重建表的存储结构,称为表结构重组。 语法 ALTER TABLE tbname MOVE [TABLESPACE tbs_name] 注意 直到表被完全移动到新的数据段中之后,Oracle才会删除原来的数据段; 表结构重组后,表中每个记录的ROWID会发生变化,因此该表的所有索引失效,需要重新建立索引; 如果表中包含LOB列,则默认情况下不移动LOB列数据和LOB索引段。
  • 30. 表重命名 语法 ALTER TABLE table_old_name RENAME TO table_new_name; RENAME table_old_name TO table_new_name; 说明 Oracle自动更新相应的约束、索引和与此表相关的权限; 同时以此表为参考的视图、同义词、存储过程和函数为非法。
  • 31. 为表添加注释 语法 COMMENT ON TALBE table_name IS…; 为列添加注释 语法 COMMENT ON COLUMN table_name.column_name IS… 注释可以通过以下数据字典来查看. ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS
  • 32. 删除表使用DELETE语句删减表 使用TRUNCATE语句删减表 TRUNCATE TABLE EMP [REUSE STORAGE] 使用DROP语句删除表 DROP TABLE EMP [CASCADE CONSTRAINTS] DELETE、TRUNCATE、DROP 区别
  • 33. 删除一个表同时,Oracle将执行下列操作: 删除该表中所有记录; 从数据字典中删除该表定义; 删除与该表相关的所有索引和触发器; 回收为该表分配的存储空间; 依赖于该表的数据库对象处于INVALID状态。
  • 34. 练习1. 要把S A L E S表中的P R O D U C T _ T Y P E列的大小从V A R C H A R ( 5 )列增加到V A R C H A R 2 ( 1 0 ),用下列哪个语句? A. alter table sales add (product_type varchar2(10)); B). alter table sales modify product_type varchar2(10));修改列类型 C. alter table sales set unused column product_type varchar2(10)); D. alter table sales drop column product_type;
  • 35. 练习1. 要改变现有数据库表名,下列哪个方法是行不通的? 使用create table as select语句,然后删除原表。建个新表 B. 使用r e n a m e命令。 C.) 删除表,然后用新名称重建。技术上可行,实际不行。 D. 使用alter table rename命令。 B与D都是表重命名,两种格式。
  • 36. 表约束约束的类别 定义约束 添加和删除约束 设置约束状态 约束的延迟检查 查询约束信息
  • 37. 约束的类别 约束作用 第一,建立多个表间真实具体的关系,如父子关系, 第二,约束防止“不良”数据进入数据库中。保护数据库,防 止坏数据。 第三:在表间存在相关性时防止删除数据。 约束类型 PRIMARY KEY UNIQUE CHECK FOREIGN KEY NULL/NOT NULL
  • 38. PRIMARY KEY特点 定义主键,起惟一标识作用,其值不能为NULL,也不能重复; 一个表中只能定义一个主键约束; 建立主键约束的同时,在该列上建立一个惟一性索引,可以为它指定存储位置和存储参数; 主键约束可以是列级约束,也可以是表级约束。
  • 39. UNIQUE特点 定义为惟一性约束的某一列或多个列的组合的取值必须惟一; 如果某一列或多个列仅定义惟一性约束,而没有定义非空约束,则该约束列可以包含多个空值; Oracle自动在惟一性约束列上建立一个惟一性索引,可以为它指定存储位置和存储参数; 惟一性约束可以是列级约束,也可以是表级约束。
  • 40. 在一个基本表中只能定义一个PRIMARY KEY约束,但可定义多个UNIQUE约束; 对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许为空。 不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARY KEY约束。PRIMARY KEY与UNIQUE比较
  • 41. CHECK 特点 检查约束用来限制列值所允许的取值范围,其表达式中必须引用相应列,并且表达式的计算结果必须是一个布尔值; 约束表达式中不能包含子查询,也不能包含SYSDATE、USER等SQL函数,和ROWID、ROWNUM等伪列; 一个列可以定义多个检查约束; 检查约束可以是列级约束,也可以是表级约束。
  • 42. 概念 FOREIGN KEY约束指定某一个列或一组列作为外部键,其中,包含外部键的表称为子表,包含外部键所引用的主键或唯一键的表称父表。 系统保证子表在外部键上的取值要么是父表中某一个主键值或唯一键值,要么取空值。以此保证两个表之间的连接,确保了实体的参照完整性。FOREIGN KEY
  • 43. FOREIGN KEY特点 定义外键约束的列的取值要么是父表参照列的值,要么为空; 外键列只能参照于父表中的主键约束列或惟一性约束列; 可以在一列或多列组合上定义外键约束; 外键约束可以是列级约束,也可以是表级约束。
  • 44. NULL/NOT NULL 特点 在同一个表中可以定义多个NOT NULL约束; 只能是列级约束。
  • 45. 定义约束列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名; 表约束与列定义相互独立,不包括在列定义中。通常用于对多个列一起进行约束,与列定义用’,’分隔。定义表约束时必须指出要约束的那些列的名称。
  • 46. 定义列级约束的语法为: [CONSTRAINT constraint_name] constraint_type [conditioin]; 定义表级约束的语法为: [CONSTRAINT constraint_name] constraint_type([column1_name, column2_name,…]|[condition]); 注意 Oracle约束通过名称进行标识。在定义时可以通过CONSTRAINT关键字为约束命名。如果用户没有为约束命名,Oracle将自动为约束命名, 命名规则是 S Y S _ C n n n n n。
  • 47. CREATE TABLE student( sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY, sname VARCHAR2(10) NOT NULL, sex CHAR(2) CONSTRAINT S_CK1 check(sex in('M','F')), sage NUMBER(6,2), CONSTRAINT S_CK2 CHECK(sage between 18 and 60)); CREATE TABLE course( cno NUMBER(6) PRIMARY KEY, cname CHAR(20) UNIQUE USING INDEX TABLESPACE indx STORAGE(INITIAL 64K NEXT 64K)); 为主键约束列上的唯一性索引设置存储位置和存储参数
  • 48. 定义约束复合主键 SQL> create table names (firstname varchar2(10), lastname varchar2(10), constraint pk_names_015 primary key (firstname, lastname));
  • 49. 定义列级FOREIGN KEY约束 [CONSTRAINT constraint_name] [FOREIGN KEY] REFERENCES ref_table_name (column_name,…) 定义表级FOREIGN KEY约束 [CONSTRAINT constraint_name] FOREIGN KEY (column_name,…) REFERENCES ref_table_name (column_name,…) [ON DELETE CASCADE|SET NULL];
  • 50. ON DELETE CASCADE 删除子表中所有相关记录 ON DELETE SET NULL 将子表中相关记录的外键约束列值设置为NULL ON DELETE RESTRICTED 受限删除,即如果子表中有相关子记录存在,则不能删除主表中的父记录,默认引用方式。
  • 51. 定义外键约束 假设我们要生成 employee表,其中department_num 是同department表的共享列。这两个表的共享列隐含父子关系 SQL> create table employee (empid varchar2(5) primary key, lastname varchar2(25), firstname varchar2(25), salary number(10,4), department_num number(5) references department (department_num) on delete set null);
  • 52. 生成与维护约束外键约束使 EMP表中的DEPARTMENT_NUM列无法保存D EPT表中找不到的列。 这个外键约束是列约束,而不是表约束。 第一,没有c o n s t r a i n t子句。表约束必须有 c o n s t r a i n t子句,第二,没有分开约束定义与其余列定义的逗号。 提示:要生成父表并在父表中定义主键之后才能生成子表的外键约束。
  • 53. 没讲 添加约束 添加约束语法为: ALTER TABLE table_name ADD [CONSTRAINT constraint_name] constraint_type(column1_name,column2_name,…)[condition];
  • 54. 创建一个表 CREATE TABLE player( ID NUMBER(6), sno NUMBER(6), sname VARCHAR2(10), sage NUMBER(6,2), resume VARCHAR2(1000) ); 添加主键约束 ALTER TABLE player ADD CONSTRAINT P_PK PRIMARY KEY(ID); 添加惟一性约束 ALTER TABLE player ADD CONSTRAINT P_UK UNIQUE(sname);
  • 55. 添加检查约束 ALTER TABLE player ADD CONSTRAINT P_CK CHECK(sage BETWEEN 20 AND 30); 添加外键约束 ALTER TABLE player ADD CONSTRAINT P_FK FOREIGN KEY(sno)REFERENCES student(sno) ON DELETE CASCADE; 添加空/非空约束 注意:为表列添加空/非空约束时必须使用MODIFY子句代替ADD子句。 ALTER TABLE player MODIFY resume NOT NULL; ALTER TABLE player MODIFY resume NULL;
  • 56. 修改约束ALTER TABLE ADD MODIFY ENABLE DISABLE DROP
  • 57. 删除约束 删除指定内容的约束 ALTER TABLE player DROP UNIQUE(sname); 删除指定名称的约束 ALTER TABLE player DROP CONSTRAINT P_CK; 如果要在删除主键约束、惟一性约束同时保留惟一性索引,则必须在ALTER TABLE…DORP 语句中指定KEEP INDEX 子句。 ALTER TABLE player DROP CONSTRAINT P_UK KEEP INDEX; 如果要删除约束同时,删除引用该约束的其他约束,则需要在ALTER TABLE…DORP语句中指定CASCADE关键字。 ALTER TABLE player DROP CONSTRAINT P_PK CASCADE;
  • 58. 设置约束状态 激活(ENABLE)状态 当约束处于激活状态时,约束将对表的插入或更新操作进行检查,与约束规则冲突的操作被回退。 禁用(DISABLE)状态 当约束处于禁用状态时,约束不起作用,与约束规则冲突的插入或更新操作也能够成功执行。 利用SQL*Loader从外部数据源提取大量数据到数据库中; 进行数据库中数据的大量导入、导出操作; 针对表执行一项包含大量数据操作的批处理工作时。
  • 59. 禁用约束 在定义约束时,可以将约束设置为禁用状态,默认为激活状态。也可以在约束创建后,修改约束状态为禁用。 创建表时禁用约束 CREATE TABLE S (SNO CHAR(10) PRIMARY KEY DISALBE,…); 利用ALTER TABLE…DISABLE禁用约束 ALTER TABLE STUDENT DISABLE CONSTRAINT S_CK1; ALTER TABLE STUDENT DISABLE UNIQUE (sname);
  • 60. 禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引。若在禁用约束时,保留对应的惟一性索引,可使用ALTER TABLE…DISABLE…KEEP INDEX语句。 ALTER TABLE STUDENT DISABLE UNIQUE (sname) KEEP INDEX; ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP INDEX; 若当前约束(主键约束、惟一性约束)列被引用,则需要使用ALTER TABLE…DISABLE…CASCADE语句同时禁用引用该约束的约束。 ALTER TABLE STUDENT DISABLE PRIMARY KEY KEEP INDEX CASCADE;
  • 61. 激活约束 创建或添加约束时,默认为激活状态。 利用ALTER TABLE…ENABLE…语句激活约束 ALTER TABLE STUDENT ENABLE UNIQUE (sname); 禁用主键约束、惟一性约束时,会删除其对应的惟一性索引,而在重新激活时,Oracle为它们重建惟一性索引,可以为索引设置存储位置和存储参数(索引与表尽量分开存储)。 ALTER TABLE STUDENT ENABLE PRIMARY KEY USING INDEX TABLESPACE indx STORAGE(INITIAL 32K NEXT 16K); 通过ALTER TABLE…MODIFY…DISABLE|ENABLE语句改变约束状态 ALTER TABLE STUDENT MODIFY CONSTRAINT S_CK2 DISABLE;
  • 62. 约束的延迟检查 默认情况下,在表中的约束都是不可延迟约束,Oracle在一条DML语句执行完毕之后立即进行约束检查(除非禁用)。 创建约束时可以显式使用DEFERRABLE关键字,创建可延迟的约束。 INITIALLY IMMEDIATE 或INITIALLY DEFERRED说明可延迟约束在初始状态下是立即检查还是延迟检查 如果在定义约束时设定为不可延迟,则约束创建后不能更改其可延迟性。只有创建时设定为可延迟的约束,创建后才能更改其可延迟性。
  • 63. 创建两个表,其约束都是可延迟的。 CREATE TABLE new_dept( deptno NUMBER PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE, dname CHAR(10) UNIQUE); CREATE TABLE new_emp( empno NUMBER PRIMARY KEY, ename CHAR(10), deptno NUMBER CONSTRAINT NE_FK REFERENCES new_dept(deptno) ON DELETE CASCADE DEFERRABLE);
  • 64. 由于外键约束的作用,执行下面语句时会产时错误。 INSERT INTO new_emp VALUES(1,'ZHANG',10); * ERROR 位于第 1 行: ORA-02291: 违反完整约束条件 (SCOTT.E_FK) - 未找到父项关键字
  • 65. 将new_emp表的外键约束检查延迟。 ALTER TABLE new_emp MODIFY CONSTRAINT NE_FK INITIALLY DEFERRED; 此时,由于将new_emp表外键约束延迟到事务结束后进行检查,因此可以先向new_emp中插入数据,而后向new_dept中插入数据。 INSERT INTO new_emp VALUES(1,'ZHANG',10); INSERT INTO new_dept VALUES(10,'COMPUTER'); COMMIT;
  • 66. 操作完后,应将new_emp外键约束检查恢复原来状态。 ALTER TABLE new_emp MODIFY CONSTRAINT NE_FK INITIALLY IMMEDIATE; 注意:在修改约束的检查延迟性时,如果无法确定约束的名称或需要设置多个约束的延迟性,可以一次性将所有可延迟的约束延迟或恢复。 SET CONSTRAINT ALL DEFERRED; SET CONSTRAINT ALL IMMEDIATE;
  • 67. 查询约束信息ALL_CONSTRAINTS USER_CONSTRAINTS DBA_CONSTRAINTS ALL_CONS_COLUMNS USER_CONS_COLUMNS DAB_CONS_COLUMNS
  • 68. 没讲 从表USER_CONSTRAINTS中查看所有约束的名字、定义 SELECT constraint_name, constraint_type search_condition FROM user_constraints WHERE table_name = 'EMP'; 从视图 USER_CONS_COLUMNS中查看约束关联的列 SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = 'EMP';
  • 69. 视图视图概念及作用 创建视图 视图操作 修改视图 删除视图
  • 70. 视图概念及作用视图是从一个或多个表或视图中提取出来的数据的一种表现形式。在数据库中只有视图的定义,而没有实际对应“表”的存在,因此视图是一个“虚”表。当对视图进行操作时,系统根据视图定义临时生成数据。 通过视图的使用可以提高数据安全性、隐藏数据的复杂性、简化查询语句、分离应用程序与基础表、保存复杂查询等。
  • 71. 创建视图 语法 CREATE OR REPLACE VIEW [schema.]view_name [(column1,column2,…)] AS subquery [WITH READ ONLY]|[WITH CHECK OPTION][CONSTRIANT constraint]; 说明 Subquery为子查询,决定了视图中数据的来源; WITH READ ONLY指明该视图为只读视图,不能修改; WITH CHECK OPTION指明在使用视图时,检查数据是否符合子查询中的约束条件; CONSTRAINT constraint为使用WITH CHECK OPTION选项时指定的约束命名
  • 72. 简单视图只用一个表中的数据生成的视图称为简单视图 SQL> create view emp_view as 2 select * from emp where job = ‘ANALYST’; SQL>CREATE VIEW emp_info_view(deptno,avgsal,empcount) AS SELECT deptno,avg(sal),count(*) FROM emp GROUP BY deptno; 生成视图之后,可以像对基表一样用 d e s c r i b e命令列出视图的列。 数据库中关于视图的信息存放在 U S E R _ V I E W S视图的数据字典。
  • 73. 简单视图生成无法改变基表数据的简单视图,这时可以使用 with read only子句 SQL> create or replace view emp_view 2 as (select * from emp) with read only; SQL> update emp_view set ename = 'FOOL!‘ 2 where ename = 'KING'; ERROR at line 2: ORA-01733: virtual column not allowed here
  • 74. 视图with check option表示当对视图进行插入或修改时,数据必须满足视图定义中select命令所指定的条件 create view high as select * from emp where sal>3000; insert into high values(1111,‘ddd’,‘pp’,333,‘17-11月-82’,2000,0,10) create view highsal as select * from emp where sal>3000 with check option insert into highsal values(2222,‘ddd’,‘pp',333,'17-11月-82',2000,0,10) ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句 insert into highsal values(3333,'ddd','pp',3333,'17-11月-82',6000,0,10)
  • 75. 复杂视图(连接视图)生成连接多个表数据的视图,称为复杂视图。 SQL> create view emp_dept_view as 2 (select empno, ename, job, dname, loc from emp e, dept d 3 where e.deptno = d.deptno 4 and job in ('ANALYST','CLERK','MANAGER')); 通常,复杂视图中无法改变基表数据。
  • 76. 没讲视图操作 视图创建后,就可以对视图进行操作,包括数据查询、DML操作(数据的插入、删除、修改)等。因为视图是“虚表”,因此对视图的操作最终转换为对基本表的操作。 update high set sal=sal*(1-0.1) 对视图的查询象对标准表查询一样,但是对视图执行DML操作时需要注意,如果视图定义包括下列任何一项,则不可直接对视图进行插入、删除和修改等操作,需要通过触发器来实现。 集合操作符(UNION,UNION ALL,MINUS,INTERSECT)。 聚集函数(SUM,AVG等)。 GROUP BY,CONNECT BY,或START WITH子句。 DISTINCT操作符。 (部分)连接操作。
  • 77. 修改视图可以采用CREATE OR REPLACE VIEW 语句修改视图,实质是删除原视图并重建该视图,但是会保留该视图上授予的各种权限。 CREATE OR REPLACE VIEW emp_dept_view AS SELECT empno,ename,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno; 视图因为删除或重新定义基表而失效之后,可以用alter view 语句修改视图。例如
  • 78. 修改视图SQL> create view emp_view as select * from emp SQL>drop table emp; 如果删除基表,则O r a c l e并不从数据库中删除视图,而是把 emp _view标为无效,要从 emp_view取得数据时,会发生以下情形: SQL> select * from emp_view; ERROR at line 1: ORA-04063: view "SCOTT.emp_view" has errors 要解决这个问题,可以重建 emp表和重新编译emp_view SQL> Create table emp as select * from empbak; SQL>alter view emp_view compile
  • 79. 删除视图 可以使用DROP VIEW语句删除视图。删除视图后,该视图的定义从数据字典中删除,同时该视图上的权限被回收,但是对数据库表没有任何影响。 DROP VIEW emp_dept_view; 对比:drop view highsal删除试图定义及内容,对基表无影响。 delete from highsal 删除基表中相应的的数据,但不影响表结构,试图定义存在。 drop table emp删除表结构、数据。
  • 80. 练习1. 用下列代码回答问题: SQL> create or replace view emp_view 2 as (select empno, ename, job, deptno from emp 3 where job = 'MANAGER') with check option; SQL> select * from emp_view; EMPNO ENAME JOB DEPTNO --------- ---------- --------- --------- 7566 JONES MANAGER 20 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 O r a c l e在这个视图中不接受下列哪个数据改变? A). update emp set job = ‘ANALYST’ where job = ‘MANAGER’ and empno = 7566;with check option限定了job 是manager .不可改变。 B. update emp set ename = 'BARNEY' where job = 'MANAGER' and ename = 'JONES'; C. update emp set empno = 7999 where job = 'MANAGER' and deptno = 10; D. update emp set deptno = 30 where job = 'MANAGER' and empno = 7782;
  • 81. 练习2. 用下列代码回答问题: SQL> create or replace view emp_view as 2 (select empno, ename, job, deptno from emp 3 where job = 'MANAGER') 4 with read only;View created. 下列哪个数据改变语句使 O r a c l e接受对基表改变? A. insert into emp_view values (2134,'SMITHERS','MANAGER', 10) ; B. update emp_view set ename = 'JOHNSON' where empno = 7844 ; C. delete from emp_view where ename = 'KING'; D0. 都不对。With read only 指明该视图为只读视图,不能修改。
  • 82. 不做练习3. 视图的基表不慎删除之后已经更换,下列哪两个语句无法一步更新视图状态?选择两个答案。 A. create view B. create or replace view C. alter view D. drop view 4. 视图与基表之间的关系称为:_ _ _ _ _(对象相关性) 5. 要确定数据库中的视图状态,可以用哪个字典视图? A. USER_VIEWS B. USER_TAB_COLUMNS C. USER_OBJECTS D. USER_TABLES
  • 83. 索引概述索引概念及作用 索引是为了加速对表中元组的检索而创建的一种分散存储结构; 是对表而建立的,由除存放表的数据页面以外的索引页面组成,独立于被索引的表; 通过使用索引加速行的检索,但减慢更新的速度; 快速定位数据,减少磁盘 I/O; Oracle自动使用、维护索引
  • 84. 不讲索引分类 惟一性索引与非惟一性索引 平衡树索引与位图索引 单列索引与复合索引 函数索引 聚簇索引 全局索引与本地索引
  • 85. 索引使用原则 导入数据后再创建索引 在适当的表和字段上创建索引 经常查询的记录数目少于表中所有记录总数的5%; 经常进行连接查询表,在连接列上建立索引能够显著提高查询的速度; 对于取值范围很大的列应当创建B树索引; 对于取值范围很小的列应当创建位图索引 不能在LONG、LONG RAW、LOB数据类型的列上创建索引; Oracle会自动在PRIMARY KEY和UNIQUE约束的列上创建惟一性索引。 合理设置复合索引中的字段顺序 :将频繁使用的列放在其他列前面
  • 86. 不讲限制表中索引的数目 表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。 为索引设置合适的PCTFREE参数 选择存储索引的表空间 默认情况下,索引与表存储在同一表空间中。索引与表存储在同一表空间中,有利于数据库维护操作,具有较高的可用性;反之,若索引与表存储在不同的表空间中,则可提高系统的存取性能,减少硬盘I/O冲突,但是表与索引可用状态可能出现不一致,如一个处于联机状态,另一个处于脱机状态。
  • 87. 管理索引创建索引 修改索引 删除索引 索引的查询
  • 88. 语法 CREATE [UNIQUE]|[BITMAP] INDEX index_name ON table_name([column_name[ASC|DESC],…]| [expression]) [REVERSE] [parameter_list]; 说明 UNIQUE表示建立惟一性索引; BITMAP表示建立位图索引; ASC/DESC用于指定索引值的排列顺序,ASC表示按升序排序,DESC表示按降序排序,缺省值为ASC; REVERSE表示建立反键索引; parameter_list用于指定索引的存放位置、存储空间分配和数据块参数设置。创建索引
  • 89. 创建非惟一性索引 CREATE INDEX employee_ename ON employee(ename)TABLESPACE users STORAGE (INITIAL 20K NEXT 20k PCTINCREASE 75); 创建惟一性索引 CREATE UNIQUE INDEX deptartment_index ON department(dname); 不讲创建位图索引 CREATE BITMAP INDEX student_sex ON student(sex);创建反序索引 创建反序索引 CREATE INDEX player_sage ON player(sage) REVERSE; 创建复合 索引 CREATE UNIQUE INDEX employee_empno_ename_indx_01 ON emp (empno, ename);
  • 90. 生成函数索引如果 w h e r e子句包含参与函数或运算的列,则无法使用传统 B树索引。例如,假设 emp表有四个列: E M P I D,L A S T N A M E,F I R S T N A M E与S A L A R Y。S A L A R Y列具有B树索引。但如果发出select * from EMP where(S A L A R Y * 1 . 0 8)> 6 3 0 0 0语句,则R D B M S忽略这个索引,进行完全表扫描。函数索引适用于这种情形, CREATE INDEX ixd_emp_01 2 ON emp(SAL*1.08); CREATE INDEX idx ON employee(UPPER(ename)); 要使用函数索引,就要发出两个alter session语句,如下:SQL> alter session set query_rewrite_enabled = true; Session altered. SQL> alter session set query_rewrite_integrity=trusted;
  • 91. 定义约束时创建索引 CREATE TABLE new_employee( empno NUMBER(5) PRIMARY KEY USING INDEX TABLESPACE users PCTFREE 0, ename VARCHAR2(20) );
  • 92. 修改索引修改索引的存储参数 ALTER INDEX employee_ename STORAGE (PCTINCREASE 50); 合并索引 ALTER INDEX…COALESCE ALTER INDEX employee_ename COALESCE;
  • 93. 重建索引 ALTER INDEX… REBUILDER ALTER INDEX player_sage REBUILD; 合并索引与重建索引比较合 并 索 引重 建 索 引不能将索引移到其他表空间中可以将索引移到其他表空间中代价较低,不需要使用额外的存储空间代价较高,需要使用额外的存储空间只能在B树的同一子树中进行合并,不会改变树的高度重建整个B 树,可能会降低树的高度可以快速释放叶子节点中未使用的存储空间可以快速更改索引的存储参数。在重建过程中如果指定了ONLINE关键字,不会影响对当前索引的使用
  • 94. 监视索引 ALTER INDEX employee_ename MONITORING USAGE; 打开指定索引的监视状态后,可在 V$OBJECT_USAGE视图中查看,USED 列为YES,表示索引正在被使用。 ALTER INDEX employee_ename NOMONITORING USAGE; ( 关闭索引的监视状态) 索引重命名 ALTER INDEX employee_ename RENAME TO employee_new_ename;
  • 95. 删除索引语法 DROP INDEX index_name; 在下面几种情况下,可以考虑删除索引 该索引不再使用。 通过一段时间监视,发现几乎没有查询或只有极少数查询会使用该索引。 由于索引中包含损坏的数据块或包含过多的存储碎片等,需要删除该索引,然后重建索引。 由于移动了表数据而导致索引失效 删除表或约束时自动删除相关索引
  • 96. 索引的查询 DBA_INDEXES、ALL_INDEXES、USER_INDEXES 包含索引的基本描述信息和统计信息,包括索引的所有者、索引的名称、索引的类型、对应表的名称、索引的存储参数设置等 DBA_IND_COLUMNS、ALL_IND_COLUMNS、USER_IND_COLUMNS 包含索引列的描述信息,包括索引的名称、表的名称和索引列的名称等信息 DBA_IND_EXPRESSIONS、ALL_IND_EXPRESSIONS、USER_IND_EXPRESSIONS 包含函数索引的描述信息,通过该视图可以查看到函数索引的函数或表达式 V$OBJECT_USAGE 包含通过ALTER INDEX…MONITORING USAGE语句对索引进行监视后得到的索引使用信息。
  • 97. 索引B树索引是O r a c l e使用的传统索引机制。它以树的形式存储数据,索引的基础是根节点(root node),它是索引中数据搜索的一个项位置。根节点包含指向索引中下一层的其他节点的指针。根据你所检索的值,该指针可以指向某个方向。索引的下一层由分枝节点 ( b r a n c hn o d e )组成,它们类似于根节点,也包含指向索引中下一层节点的指针。同样,根据你所搜索的值,该指针可以指向某个方向。分枝节点指向索引的最高层:即叶节点 (leaf node)。在最高层中,索引项(index entry)包含被索引的列值以及存储这些列值的行的相应的 R O W I D。每个叶节点都同时与其左右叶节点链接,以便能够在索引中前后搜索一个项范围。
  • 98. 索引2. 位图索引结构 可以把位图索引看成复杂的查找表,其行对应于检索列中的所有惟一数据值。因此,如果索引列只包含三个不同值,则可以把位图索引看成包含三行。位图索引中每一行包含四列。第一列包含所检索列的惟一值,第二列包含表中所有行的开始 R O W I D,第三列包含表中所有行的结束 R O W I D,第四列包含位图模式,其中表中每一行有一位。因此,如果检索的表包含 1 0 0 0行,则位图索引的最后一列有1 0 0 0个对应的位。根据表中对应行的这个列是否有不同值,位图索引中每一位设置为 0(关)或1(开)。换句话说,如果该行的索引列匹配这个惟一值,则这个位设置为 1,否则这个位设置为0。图7 - 2显示了包含三个不同值的位图索引。
  • 99. 索引Male aaaaqaaayaaa aaaaqaaayzzz 1001000010…… Female aaaaqaaayaaa aaaaqaaayzzz 0110111101…… 所检索表中的每一行只在位图索引的位图模式列中增加一位,因此表增长对位图索引长度的影响不大。但是,每个不同值在位图索引中增加一行,表中的每一行又在位图索引的位图模式列中增加一位。因此使用位图索引对列增加不同值时要小心,这些索引更适合列中的不同值较少的情形。使用位图索引的典型例子是根据 G E N D E R(性别)列查询员工表,显示员工是男是女。一个人的性别通常不会改变,总共也只有两个值,因此不适合使用传统的 B树索引。但是,这时可以用位图索引提高性能。位图索引典型地用于决策系统与数据仓库应用中。
  • 100. 练习1. 你要用索引提高工资查阅性能。查询要确定员工提薪 1 2 %时的工资。可以用哪个 c r e a t e i n d e x命令? A. create index my_idx_1 on employee (salary * 1.12) ; B. create unique index my_idx_1 on employee (salary); C. create bitmap index my_idx_1 on employee (salary); D. create index my_idx_1 on employee (salary) reverse ; 2. 表中包含加里福尼亚、纽约和德克萨斯州的员工姓名与电话号码,要对 L A S T N A M E列进行检索。为了提高性能,可以用下列哪个索引?A. create unique index my_idx_1 on people_phone (lastname); B. create index my_idx_1 on people_phone (lastname); C. create bitmap index my_idx_1 on people_phone (lastname); D. create index my_idx_1 on people_phone (lastname) reverse;
  • 101. 练习3. 美国国家社会安全应用程序要对 U S _ G O V T _ S S表的S S _ N U M列建立索引。这个列可以用下列哪个语句? A. create index my_idx_1 on US_govt_SS (ss_num) ; B. create bitmap index my_idx_1 on US_govt_SS (ss_num) ; C. create unique index my_idx_1 on US_govt_SS (ss_num) ; D. create index my_idx_1 on US_govt_SS (ss_num) reverse;
  • 102. 索引化表概念索引化表(Index-Organized Table,IOT)是一种特殊的表,它按B树的索引结构来组织和存储数据,将表的数据和索引的数据存储在一起。主要适合于经常通过主键查询整个记录或部分记录的情况,表中记录的存放顺序与主键的顺序一致。 索引化表类似于B树结构,不过索引条目不是标准B树结构中索引值与ROWID这样的结构,而是主键列与非主键列形式的结构。
  • 103. 创建索引化表说明 在CREATE TABLE语句中指定ORGANIZATION INDEX关键字 必须建立一个PRIMARY KEY 约束 示例 CREATE TABLE new_student( sno NUMBER PRIMARY KEY , sname CHAR(10), sage NUMBER, sex CHAR(2)) ORGANIZATION INDEX TABLESPACE USERS ;
  • 104. 可以通过子查询创建索引化表 CREATE TABLE new_emp( empno PRIMARY KEY,ename) ORGANIZATION INDEX AS SELECT empno,ename FROM emp; 注意 利用子查询创建索引化表时,必须指定主键列和其他所有列,指定的列的个数必须与查询语句中目标列个数一致。
  • 105. 将索引化表转换为标准表 使用Oracle中的EMPORT和IMPORT工具,将索引化表中的数据全部导出,然后再重新导入到一个标准表中。 使用CREATE TABLE…AS SELECT语句,通过对索引化表的查询来创建一个标准表。
  • 106. 聚簇通过加快连接操作提高查询速度的措施之一。 Dept、emp 表经常在一起访问,可以考虑建聚簇表。过程如下: 1、建立聚簇 create cluster emp_dep(dno char(3)); 2、建立dept表并加入到emp_dep聚簇中 create table dept(dno char(3) primary key,dname varchar2(30), tel number(6)) cluster emp_dep(dno); 3、建立emp表并加入到emp_dep聚簇中 4、在聚簇键上建聚簇索引 create index emp_dep_idx on cluster emp_dep; 5、向dept表和emp表插入数据
  • 107. 不讲分区表与分区索引分区概述 创建分区表 创建分区索引 维护分区表与分区索引
  • 108. 分区概述分区概念 所谓的分区是指将一个巨型表或巨型索引分成若干独立的组成部分进行存储和管理,每一个相对小的、可以独立管理的部分,称为原来表或索引的分区。 每个分区都具有相同的逻辑属性,但物理属性可以不同。如具有相同列、数据类型、约束等,但可以具有不同的存储参数、位于不同的表空间等。 分区后,表中每个记录或索引条目根据分区条件分散存储到不同分区中 。
  • 109. 分区概述分区条件 表的大小超过2GB 要对一个表进行并行DML操作,必须分区 为了平衡硬盘的I/O操作,将一个表分散存储在不同的表空间中,必须对它进行分区 如果需要将表一部分设置为只读,另一部分为可更新的,必须对表进行分区
  • 110. 创建分区表分区方法 范围分区 列表分区 散列分区 复合分区
  • 111. 范围分区 参数 PARTITION BY RANGE(col1,…) PARTITION partion_name VALUE LESS THAN 示例 创建一个分区表,将学生信息根据其出生日期不同进行分区,将1980年1月1日前出生的学生信息保存在ORCLTBS1表空间中,1980年1月1日到1990年1月1日出生的学生信息保存在ORCLTBS2表空间中,其他学生信息保存在ORCLTBS3表空间中。
  • 112. CREATE TABLE student_range( sno NUMBER(6) PRIMARY KEY, sname VARCHAR2(10), sage int, birthday DATE) PARTITION BY RANGE(birthday) (PARTITION p1 VALUES LESS THAN (TO_DATE('1980-1-1','YYYY-MM-DD')) TABLESPACE ORCLTBS1, PARTITION p2 VALUES LESS THAN (TO_DATE('1990-1-1','YYYY-MM-DD')) TABLESPACE ORCLTBS2, PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE ORCLTBS3 STORAGE(INITIAL 10M NEXT 20M)) STORAGE(INITIAL 20M NEXT 10M MAXEXTENTS 10 );
  • 113. 列表分区 参数 PARTITION BY LIST(col1,…) PARTITION partition_name VALUE 示例 创建一个分区表,将学生信息按性别不同进行分区,男学生信息保存在表空间ORCLTBS1中,而女学生信息保存在ORCLTBS2中 。
  • 114. CREATE TABLE student_list( sno NUMBER(6) PRIMARY KEY, sname VARCHAR2(10), sex CHAR(2) CHECK(sex in ('M','F')) ) PARTITION BY LIST(sex) (PARTITION student_male VALUES('M') TABLESPACE ORCLTBS1, PARTITION student_female VALUES('F') TABLESPACE ORCLTBS2) STORAGE (INITIAL 10M NEXT 10M MAXEXTENTS 5 );
  • 115. 散列分区 参数 PARITITION BY HASH(col1,…) 使用PARTITION指定分区数量及STORE IN指定分区存储空间;或使用PARTITON指定每个分区名称以及其存储空间。 示例 创建一个分区表,根据学号将学生信息均匀分布到ORCLTBS1和ORCLTBS2两个表空间中 。创建分区表
  • 116. CREATE TABLE student_hash ( sno NUMBER(6) PRIMARY KEY, sname VARCHAR2(10) ) PARTITION BY HASH(sno) (PARTITION p1 TABLESPACE ORCLTBS1, PARTITION p2 TABLESPACE ORCLTBS2); CREATE TABLE student_hash2 ( sno NUMBER(6) PRIMARY KEY, sname VARCHAR2(10) ) PARTITION BY HASH(sno) PARTITIONS 2 STORE IN(ORCLTBS1,ORCLTBS2);
  • 117. 复合分区 参数 PARTITION BY RANGE(col1,…) SUBPARTITION BY HASH(col1,…) 每个子分区的子分区数量或子分区的描述。 示例 创建一个复合分区表,将1980年1月1日前出生的学生信息均匀保存在ORCLTBS1和ORCLTBS2表空间中,1980年1月1日到1990年1月1日出生的学生信息保存在ORCLTBS3和ORCLTBS4表空间中,其他学生信息保存在ORCLTBS5表空间中 。
  • 118. CREATE TABLE student_composition( sno NUMBER(6) PRIMARY KEY, sname VARCHAR2(10), sage NUMBER(4), birthday DATE ) PARTITION BY RANGE(birthday) SUBPARTITION BY HASH(sage) (PARTITION p1 VALUES LESS THAN(TO_DATE('1980-1-1','YYYY-MM-DD')) (SUBPARTITION p1_sub1 TABLESPACE ORCLTBS1, SUBPARTITION p1_sub2 TABLESPACE ORCLTBS2), PARTITION p2 VALUES LESS THAN(TO_DATE('1990-1-1','YYYY-MM-DD')) (SUBPARTITION p2_sub1 TABLESPACE ORCLTBS3, SUBPARTITION p2_sub2 TABLESPACE ORCLTBS4), PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE ORCLTBS5 );
  • 119. 创建分区索引分区索引类型 创建分区索引
  • 120. 分区索引类型 本地分区索引 本地分区索引是指为分区表中的各个分区单独建立索引分区,各个索引分区之间是相互独立的。 全局分区索引 全局分区索引是指先对整个分区表建立索引,然后再对索引进行分区。 全局非分区索引 全局非分区索引是指对整个分区表创建标准的未分区的索引。
  • 121. 创建本地分区索引 分区表创建后,可以对分区表创建本地分区索引。在指明分区方法时使用LOCAL关键字标识本地分区索引。 CREATE INDEX student_range_local ON student_range(sname) LOCAL; 创建全局分区索引 索引分区方法也包括范围分区、列表分区、散列分区和复合分区4种。在指明分区方法时使用GLOBAL关键字标识全局分区索引。 CREATE INDEX student_range_global ON student_range(sage) GLOBAL PARTITION BY RANGE(sage) (PARTITION p1 VALUES LESS THAN (80) TABLESPACE ORCLTBS1, PARTITION p2 VALUES LESS THAN (MAXVALUE) TABLESPACE ORCLTBS2 );
  • 122. 全局非分区索引 为分区表创建全局非分区索引与为标准表创建索引一样。例如,为分区表student_list_index创建全局非分区索引,语句为: CREATE INDEX student_list_index ON student_list(sname);
  • 123. 不讲维护分区表与分区索引使用ALTER TABLE语句来维护分区表,包括增加分区、合并分区、删除分区、交换分区、融合分区、修改分区增加值、修改分区删除值、移动分区、更名分区、分割分区、舍弃分区等。 ALTER TABLE student_hash ADD PARTITION p3 TABLESPACE ORCLTBS3; ALTER TABLE student_range MERGE PARTITIONS p1,p2 INTO PARTITION p1;
  • 124. 其他模式对象簇 序列 同义词 数据库链接
  • 125. 不讲簇簇的概念 创建簇 创建聚簇表 修改簇 创建聚簇索引 删除簇 查询簇信息 利用OEM管理簇
  • 126. 簇的概念 簇是一种存储表数据的方法,一个簇由共享相同数据块的一组表组成。 在一个簇中,Oracle将多个表中具有相同相关列的记录聚簇在相同的数据块中(类似于连接结果)。 对于经常需要访问这些列的应用来说,能够减少硬盘I/O时间、改善连接查询的效率。 聚簇对用户是透明的,使用sql访问聚簇表和非聚簇表是一样的。 聚簇必须先建立,然后才能将聚簇表加入其中。 只有建立了聚簇索引后,才能对聚簇表进行读写操作。
  • 127. 创建簇 在数据库中,簇占据实际的存储空间,因此用户必须具有足够的表空间配额。 CREATE CLUSTER student_class (class_id NUMBER(3)) SIZE 600 TABLESPACE users STORAGE (INITIAL 200K NEXT 300K MINEXTENTS 2 MAXEXTENTS 20);
  • 128. 创建聚簇表 通过将两个或多个聚簇表保存在同一个簇中,可以将两个表中具有相同的聚簇字段值的记录集中存放在同一个数据块(或相邻的多个数据块)中。 CREATE TABLE classes( class_id NUMBER(3) PRIMARY KEY, cname VARCHAR2(10) ) CLUSTER student_class (class_id); CREATE TABLE students ( sno NUMBER(5) PRIMARY KEY, sname VARCHAR2(15) NOT NULL, class_id NUMBER(3) REFERENCES classes) CLUSTER student_class(class_id); 注意:聚簇表中的聚簇字段必须与创建簇时指定的聚簇字段具有相同的名称和数据类型。
  • 129. 修改簇 簇创建之后,用户可以对簇进行修改,包括:修改簇的物理存储参数(PCTFREE,PCTUSED,STORAGE等)、修改SIZE值的大小。 ALTER CLUSTER student_class PCTFREE 30 PCTUSED 60; 注意:不能修改聚簇表的PCTFREE、PCTUSED、INITRANS和MAXTRANS参数。这些参数是由簇的物理存储参数设置的。
  • 130. 创建聚簇索引可以为簇中的聚族字段创建索引,这种类型的索引称为“聚簇索引”。 聚簇索引必须在向簇中的聚簇表中插入任何记录之前创建。 聚簇表中数据的存储顺序与聚簇索引中索引值排序相一致。 CREATE INDEX student_class_index ON CLUSTER student_class TABLESPACE USERS STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 2 MAXEXTENTS 10) PCTFREE 10;
  • 131. 根据簇中是否包含表,簇删除可以分为下列3中情况。 使用DROP CLUSTER删除不包含聚簇表的簇及簇索引。 DROP CLUSTER student_class; 使用DROP CLUSTER...INCLUDING TABLES语句删除包含聚簇表的簇。 DROP CLUSTER student_class INCLUDING TABLES; 如果聚簇表中包含其他表外键参考的主键约束列或惟一性约束列,则需要使用CASCADE CONSTRAINTS子句删除约束同时删除簇。 DROP CLUSTER student_class INCLUDING TABLES CASCADE CONSTRAINTS;
  • 132. 删除聚簇先删除表,再删除聚簇 drop table emp; drop table dept; drop cluster emp_dep; 注:1、聚簇一旦删除,聚簇索引会自动被删除。 2、将聚簇表变为非聚簇表: 建一新表,结构与聚簇表完全一样,复制内容到新建表; 删除聚簇表 新表改名为聚簇表的名字。
  • 133. 不讲查询簇信息DBA_CLUSTERS:包含数据库中所有簇的信息。 ALL_CLUSTERS:包含当前用户可以访问的簇的信息。 US ER_CLUSTERS:包含当前用户的所有簇的信息。 DBA_CLU_COLUMNS:包含数据库中所有聚簇列信息。 USER_CLU_COLUMNS:包含当前用户所有聚簇列信息。
  • 134. 同义词同义词概述 创建同义词 删除同义词
  • 135. 同义词概述同义词是数据库中表、索引、视图或其他模式对象的一个别名。利用同义词,一方面为数据库对象提供一定的安全性保证,例如可以隐藏对象的实际名称和所有者信息,或隐藏分布式数据库中远程对象的位置信息;另一个方面是简化对象访问。此外,当数据库对象改变时,只需要修改同义词而不需要修改应用程序。 同义词分为私有同义词和公有同义词两种。私有同义词只能被创建它的用户所拥有,该用户可以控制其他用户是否有权使用该同义词;公有同义词被用户组PUBLIC拥有,数据库所有用户都可以使用公有同义词。建立共有同义词必须具有DBA权限
  • 136. 创建同义词语法 CREATE [PUBLIC] SYNONYM synonym_name FOR object_name; 示例 CREATE PUBLIC SYNONYM scottemp FOR scott.emp; 利用同义词可以实现对数据库对象的操作 UPDATE scottemp SET ename='SFD‘ WHERE empno=7884;
  • 137. 不讲创建同义词例如: SCOTT拥有E M P表,如果TURNER要访问E M P表,则要以S C O T T . E M P引用: SQL> SELECT empno, ename, sal FROM SCOTT.emp; SQL> create public synonym emp for scott.emp; T U R N E R可以直接称为E M P: SQL> select empno, ename, sal from emp; 如果无公共同义词,TURNER可以对这个对象生成自己的专用同义词,然后不加S C O T T的结构引用E M P SQL> connect turner/ike C o n n e c t e d . SQL> create synonym emp for scott.emp; SQL> select empno, ename, sal from emp;
  • 138. 不讲删除同义词 语法 DROP [PUBLIC] SYNONYM synonym_name; 示例 DROP PUBLIC SYNONYM scottemp;
  • 139. 序列序列的概念 创建序列 使用序列 修改序列 删除序列
  • 140. 序列的概念序列用于产生惟一序号的数据库对象,用于为多个数据库用户依次生成不重复的连续整数。 通常使用序列自动生成表中的主键值。 序列产生的数字最大长度可达到38位十进制数。 序列不占用实际的存储空间,在数据字典中只存储序列的定义描述。
  • 141. 创建序列语法 CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE n | NOCACHE]; 示例 CREATE SEQUENCE stud_sequence INCREMENT BY 1 START WITH 100 MAXVALUE 1000;
  • 142. 创建序列参数说明 INCREMENT BY子句用于设置相邻两个元素之间的差值,即步长,默认值为1; START WITH子句用于设置序列初始值,默认值为1; MAXVALUE|NO MAXVALUE子句用于设置序列有无最大值,默认为无; MINVALUE|NOMINVALUE子句用于设置序列有无最小值,默认为无; CYCLE|NOCYCLE子句用于设置序列是否可以循环,默认为不可循环; CACHE|NOCACHE子句用于设置是否在缓存中预先分配一定数量的数据值,以提高获取序列值的速度,默认为不缓存。
  • 143. 下节课讲 使用序列 属性 CURRVAL:返回序列当前值。 NEXTVAL:返回当前序列值增加一个步长后的值。 注意 序列值可以应用于查询的选择列表、INSERT语句的VALUES子句、UPDATE语句的SET子句,但不能应用在WHERE子句或PL/SQL过程性语句中。 示例 INSERT INTO students(sno,sname) VALUES(stud_sequence.nextval,'JOAN'); SELECT stud_sequence.currval FROM dual;
  • 144. 修改序列 除了不能修改序列起始值外,可以对序列其他任何子句和参数进行修改。 修改结构只对已用使用序列生效。 ALTER SEQUENCE stud_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE CACHE 20;
  • 145. 删除序列 当一个序列不再需要时,可以使用DROP SEQUENCE语句删除序列。 DROP SEQUENCE stud_sequence;
  • 146. 练习1. 删除表对表的非惟一索引有何影响?A. 无影响。B. 删除索引。C. 将索引标为无效。D. 索引包含N U L L值。 2. 下列关于索引的说法哪个是对的?A. B树索引能很好地处理低基数列。B. 位图索引不能很好地处理低基数列。C. B树索引能很好地处理高基数列。 3. 下列哪个选项是把视图中所选列数增加时要采取的步骤? A. 在基表中增加更多列。B. 发出alter view语句。C. 使用视图和相关子查询。D. 删除和重建视图,引用更多列选择。 4. Oracle数据库中要生成序列。下列哪个选项是生成序列的有效参数?A. identified by B. using temporary tablespace C. maxvalue D. on delete cascade 5. 对O r a c l e数据库发出下列语句: create view EMP_VIEW_01 as select E.EMPID, E.LASTNAME, E.FIRSTNAME, A.ADDRESS from EMPLOYEE E, EMPL_ADDRESS A where E.EMPID = A.EMPID with check option;
  • 147. 练习哪一行产生错误? A. create view EMP_VIEW_01 B. as select E. EMPID, E.LASTNAME, E.FIRSTNAME, A.ADDRESS C. from EMPLOYEE E,EMPL_ADDRESS A D. where E.EMPID = A.EMPIDE. with check option; F. 这个语句没有错误。 6. Oracle中使用序列,引用N E X T V A L之后,C U R R V A L值怎么改变?A. 加1。B. 变成P R E V V A L。C. 等于N E X T V A L。D. 不变。 9. 你要清除O r a c l e数据库中的信息。下列哪个语句删除使用一个表的所有视图,同时从数据库中删除这个表? A. drop view B. alter table C. drop index D. alter table drop约束 10. 用下列语句建立视图:CREATE VIEW BASEBALL_TEAM_VWAS SELECT B.JERSEY_NUM, B.POSITION, B.NAMEFROM BASEBALL_TEAM BWHERE B.NAME = USER;用户J O N E S要选择用户S M I T H的清单时发生什么情形?A. select语句收到错误。B. select语句成功。C. select语句从O r a c l e收到NO ROWS SELECTED消息。D. select语句只把数据加进B A S E B A L L _ T E A M中。
  • 148. 数据字典Oracle数据字典的作用: 对数据库中的每个对象以某种方式进行跟踪。 验证数据库的用户连接。 到检验被查询的表是否存在。 查找表的索引,以提高事务处理的性能。 Oracle通常利用catalog.sql和catproc.sql脚本建立数据字典。 数据字典由SYS拥有,并建立在SYSTEM表空间中。 Oracle的数据字典由两个部分组成: ─基表和用户可访问的视图。
  • 149. 数据字典1. 基表: 数据字典中的数据存储在数据库创建的初始阶段所建立的一组表中。由CATALOG.SQL脚本建立在 SYSTEM表空间中的X $表,只有S Y S用户才能直接访问这些表,决不能给其他用户授予直接访问基表的权力,避免破坏字典的基表。 2. 用户可访问的视图: 在建立和填充基表的同时, CATALOG.SQL 脚本建立了一组用户友好的视图,字典视图提取数据字典的信息并将其转换成易于理解的和有用的格式。用户可通过这些视图查看数据字典的数据,而不是访问基表。 获得 Oracle中所有数据字典视图的完整清单,可执行 : select * from dictionary. 与dictionary同义的一些对象是dict、CATALOG和CAT。
  • 150. 数据字典字典视图名称的含义 1. 识别字典视图的范围 U S E R 视图:允许你看到你所拥有的相关数据库对象。只能显示你的模式中的数据库对象。 A L L 视图:允许你看到你所拥有的,或虽不拥有但可以访问的相关的数据库对象。为了能够访问一个数据库对象,以下三个条件之一必须为真: ? 你建立了该对象。 ? 对象的所有者授予你访问该对象的权限。 ? 对象的所有者授予P U B L I C用户访问该对象的权限。 DBA 视图:使你能看到整个数据库中所有的相关对象,不管它们是否属于你,也不管你是否可以访问。
  • 151. 数据字典2. 识别字典视图的主题 任何字典视图名字的第二部分都标识了该视图的主题。如:user_tables视图的主题为表, all_indexs视图的主题为索引。 常用数据字典视图: ? USER_OBJECTS、ALL_OBJECTS、DBA_OBJECTS 分别提供有关当前用户所拥有的各种数据库对象、当前用户可用的数据库对象或数据库中所有对象的信息。 ? U S E R _ T A B L E S、A L L _ T A B L E S、D B A _ T A B L E S 分别显示有关当前用户所拥有的或可用的表的信息,或者 O r a c l e数据库中所有表的信息。 ? U S E R _ I N D E X E S、A L L _ I N D E X E S、D B A _ I N D E X E S 分别显示有关当前用户所拥有的或可用的索引的信息,或者 O r a c l e数据库中所有索引的信息。 ? U S E R _ V I E W S、A L L _ V I E W S、D B A _ V I E W S 分别显示有关当前用户所拥有的或可用的视图的信息,或者O r a c l e数据库中所有视图(包括字典视图)的信息。
  • 152. 数据字典? USER_SEQUENCES、ALL_ SEQUENCES 、DBA _ SEQUENCES分别显示当前用户所拥有的或可用的序列的信息,或者 O r a c l e数据库中所有序列的信息。 ? U S E R _ U S E R S、A L L _ U S E R S、DBA _ USER S 分别显示有关当前用户或者 O r a c l e中所有用户的信息。 ? USER_CONSTRAINTS、A L L _ CONSTRAINTS 、D B A _ CONSTRAINTS分别显示有关当前用户所拥有的或可用的约束信息,或者 O r a c l e数据库中所有的约束信息。 ? USER_CONS_COLUMNS、A L L _ CONS_COLUMNS 、D B A _ CONS_COLUMNS分别显示有关当前用户所拥有的或可用的具有约束的表列的信息,或者 O r a c l e中具有约束的所有表列的信息。
  • 153. 数据字典? USER_IND_COLUMNS、ALL_IND_ COLUMNS 、 D B A _ IND_COLUMNS分别显示有关当前用户所拥有的或可用的具有索引的表列的信息,或者具有索引的所有O r a c l e表列的信息。 ? USER_TAB_COLUMNS、A L L _ TAB_COLUMNS、 D B A _ TAB_COLUMNS、分别显示有关当前用户所拥有的或可用的表列的信息,或者 Oracle中所有表的所有列信息 ? U S E R _ R O L E S、A L L _ R O L E S、D B A _ R O L E S 分别显示当前用户所拥有的或可用的角色的信息,或者O r a c l e数据库中的所有角色的信息。 ? U S E R _ T A B _ P R I V S、A L L _ T A B _ P R I V S、D B A _ T A B _ P R I V S 分别显示用户所拥有的或当前用户可用的对象上的对象权限的信息,或者 O r a c l e中所有用户可用的所有对象权限的信息。
  • 154. 数据字典? U S E R _ S O U R C E、A L L _ S O U R C E、D B A _ S O U R C E 分别显示用户所拥有的或当前用户可用的P L / S Q L程序的源代码,或者整个 O r a c l e数据库中的所有P L / S Q L源代码。 ? U S E R _ T R I G G E R S、A L L _ T R I G G E R S、D B A _ T R I G G E R S 分别显示用户所拥有的或当前用户可用的触发器的信息,或者 O r a c l e数据库的所有触发器的信息。 ? R O L E _ T A B _ P R I V S、R O L E _ S Y S _ P R I V S、R O L E _ R O L E _ P R I V S 分别显示有关授予数据库中角色的对象权限、系统权限或角色的信息。 ? D B A _ T A B L E S P A C E S、D A B _ T S _ Q U O T A S 显示有关 O r a c l e中所有表空间以及每个表空间中分配给用户的空间限额的信息。 ? D B A _ D A T A F I L E S、D B A _ S E G M E N T S、D B A _ E X T E N T S、D B A _ F R E E _ S P A C E 分别显示有关O r a c l e数据库中数据文件以及每个数据文件中的段、区和可用空间的信息。
  • 155. 数据字典? D B A _ P R O F I L E S 显示O r a c l e中有关用户配置文件的信息。配置文件是 D B A限制用户与O r a c l e处理一起使用的主机系统的物理资源 (如进程内存分配、C P U周期等)的一种方法。 3. 动态性能视图 动态性能视图不断被 O r a c l e用有关数据库操作的重要数据更新: ? V $ D A T A B A S E 装载到实例上的数据库的常规信息保存在这里。 ? V $ S Y S S T A T 数据库性能的大部分信息保存在这里。 ? V $ S E S S I O N、V $ S E S S T A T 单独的用户会话的性能的大部分信息存储在这里。 ? V $ L O G、V $ L O G F I L E 在这里可以找到关于联机重做日志的信息。 ? V $ D A T A F I L E 在这里可以找到关于 O r a c l e数据文件的信息。 ? V $ C O N T R O L F I L E 可在此找到关于O r a c l e控制文件的信息
  • 156. 练习1. 如果想列出你在O r a c l e数据库中所拥有对象的所有被索引的列,可以使用以下哪种视图? A. USER_TAB_COLUMNS B. ALL_TAB_COLUMNS C. USER_IND_COLUMNS D. ALL_IND_COLUMNS 2. 在识别O r a c l e数据库中的字典对象时,以下哪个是数据字典视图? A. V$DATABASE B. DBA_TABLES C. SYS.AUD$ D. EMP 3. 拥有O r a c l e中的所有数据字典对象的用户为_ _ _ _ _ _ _。 4. 可查询得出O r a c l e中所有数据字典对象的列表的对象是_ _ _ _ _ _ _。 5. 下列哪个选项为O r a c l e数据库的动态性能视图? A. DBA_DATA_FILES B. DBA_SEGMENTS C. V$DATAFILE D. DBA_EXTENTS 6. 为了查找数据库中所有用户的某些特性,应使用的视图是_ _ _ _ _ _。 3. SYS。4. CATALOG、C A T、D I C T I O N A R Y或D I C T 6. DBA_USERS。
  • 157. (本页无文本内容)