第一章 Oracle 11g概述
1.1 Oracle翻译为“甲骨文”,由Oracle公司推出。
1.2 关系型数据库
1.2.1 数据库管理技术发展经历了 人工管理、文件系统、数据库系统3个阶段。数据库系统主要由层次模型、网状模型、关系模型。
1.2.2 E-R图由 实体、属性、联系组成。
1.2.3 数据库设计范式,一般满足前3个就足够。第一范式:列不可分割原子性。第二范式:要有主键,且其他键依赖主键。第三范式:不存在非关键字列对任意候选关键字列的传递函数依赖。
第二章 Oracle 11g体系结构概述
2.1 Oracle数据库管理系统3个关键概念 实例、数据库、数据库服务器。数据库存储结构分为:逻辑存储结构、物理存储结构。
2.2 逻辑存储结构:由小到大分为 数据块、数据区、数据段、逻辑对象、表空间、数据库。
- 1数据块:逻辑最小单位,通常是操作系统块的整数倍。由块头、表目录、行目录、空余空间、行数据5部分组成。
- 2数据区:一些数据块组成,会自行扩展。Oracle储存分配的最小单元。
- 3数据段:一些数据区组成,用于存储表、索引或簇等占用空间的数据对象。包括:数据段、索引段、回滚段、临时段。
- 4表空间:最大的逻辑区分,物理上对应数据文件。Oracle系统自动生成:
- 4.1SYSTEM表空间:存放系统表与数据字典。
- 4.2SYSAUX表空间:辅助SYSTEM。
- 4.3UODO表空间:撤销表空间。
- 4.4USERS表空间:用户表空间。
2.3 物理存储结构:数据文件、控制文件、重做日志文件、归档日志文件、参数文件、口令文件、警告日志文件等。
- 1数据文件:保存用户应用程序数据和Oracle系统内部数据的文件。在读取数据时,Oracle会先从高速数据缓存区中取,没有再从数据文件中取。
- 系统数据文件、撤销数据文件、用户数据文件
- 2控制文件:记录了数据库的物理结构,包括数据库名、数据文件与日志文件的名称和位置等
- 3日志文件:日志进程LGWR、归档进程ARCH
- 重做日志文件:记录了数据库所发生过得更改信息(修改、删除、添加等)。
- 归档日志文件:非归档模式会在日志记满时覆盖、归档模式会日志写满时运行归档进程。
- 4服务器参数文件:记录了Oracle数据库的基础参数信息(数据库名、控制文件所在路径、日志缓冲大小等)。查询数据库的服务器参数:
- 1.select name,value,ismodified from v$parameter;
- 2.SQL*Plus 的show parameter
- 3 修改服务器参数 ALTER SYSTEM;
- 5密码文件:用于密码的验证:NONE表示只要通过操作系统验证,就不用通过Oracle密码文件验证。SHARED表示多个数据库实例都可以采用此密码文件验证。EXCLUSIVE表示只有一个数据库实例可以使用此密码文件验证。
- 6警告文件:记录Oracle系统的运行信息和错误信息。
- 7跟踪文件:后台进程跟踪文件用于记录后台进程的警告或错误信息、用户进程跟踪文件用于记载与用户进程相关的信息。
2.4Oracle服务器主要由 实例、数据库、程序全局区、前台进程组成。
- 1实例:系统全局区(SGA)和后台进程(PMON、SMON等)。系统全局区包括高速数据缓冲区、重做日志缓冲区、共享池、大型池、java池、流池。后台进程是系统后台执行的程序,包括:1数据写入进程DBWR、2检查点进程CKPT、3日志写入进程LGWR、4归档进程ARCH、5系统监控进程SMON、6进程监控进程PMON、7锁定进程LCKN、8恢复进程RWCO、9调度进程DNNN、10快照进程SNPN等200多个。可以从v$bgprocess数据字典查看实例进程。
- 2程序全局区PGA:也可称用户进程全局区,用户间不共享。包括:私有SQL区、会话区。
- 3前台进程:1用户进程:连接和会话。2服务器进程:用于处理用户会话过程中向数据库发出的SQL与命令。
2.5数据字典:存放数据信息的地方。可以查看数据库的表、视图、等等信息。
- dba_ :包含数据库实例的所有对象信息。
- v$_ :当前实例的动态视图,包含系统管理和系统优化等所使用的视图。
- user_ :记录用户的对象信息。
- gv_ :分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图。
- all_ :记录用户的对象信息机被授权访问的对象信息。
第三章 SQL*Plus 命令
常用PL/SQL Developer,不使用命令,故了解即可。
其他博主总结:SQL*Plus 命令
第四章 SQL语言基础
4.1.1 SQL全称是结构化查询语言。特点:1集合性 2统一性 3易于移植性
4.1.2 1数据查询语言DQL、2数据操作语言DML、3事务控制语言TCL、4数据定义语言DDL、5数据控制语言DCL
4.1.3 SQL关键字不区分大小写。但字符值区分大小写。
4.2 Oracle为了便于管理用户创建的数据库对象(比如数据库、索引、视图等),引入了模式的概念。(就是常说的“用户C1”)。模式对象就是这个模式包含的所有内容。Oracle提供示例模式SCOTT。
4.3 select语法格式:
select {[distinct|all] columns|* }
[into table_name]
from {tables |views |other select}
[where conditions]
[group by columns]
[having conditions]
[order by colimns]
- Oracle数据库中,有一个标识行中唯一特性的行标识符ROWID,伪列长度为18位字符,包含了该行数据在Oracle数据库中的物理地址。
- distinct 表示不重复
- 在where条件的属性比较中(= > < <> <= >=),可以添加ANY、ALL。如A {比较符}ANY B。
- 当用户使用Group by 时,选择列表中任一非聚集表达式内的所有列都应该包含在Group by列表中。
- Having 子句的语法与where类似,但Having中可以使用聚合函数,如count、avg。
4.3 多表关联查询
- 1.内连接、外连接、自然连接、自连接、交叉连接。
- 内连接关键字INNER JOIN ,INNER可以省略,取交集。
- 外连接分LEFT JOIN、RIGHT JOIN,取主表所有与交集。FULL JOIN取两表所有,完全外连接时,Oracle会执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复。
- 两个具有相同列明的表,直接join 不需要on条件,Oracle自动添加on条件。也是内连接。
- 交叉连接不需要任何连接条件,用CROSS JOIN。
4.4 常用系统函数
4.4.1 字符类函数:ASCII©返回字符ASCII码、CHR(I)返回ASCII码的字符、CONCAT(s1,s2)连接、INITCAP(s)驼峰、INSTR(s1,s2[,i][,j])查找s2在s1中位置、LENGTH(s)返回字符长度、LOWER(s)/UPPER(s)大小写转换、LTRIM(s1,s2)/RTRIM(s1,s2)/TRIM(s1,s2)去掉两边字符、REPLACE(s1,s2[,s3])替换字符、SUBSTR(s,i,[j])截取字符。
4.4.2 数字类函数:ABS(n)绝对值、MOD(n1,n2)取模。
4.4.3 日期和时间类函数:ADD_MONTHS(d,i)在d上加i月、MONTHS_BETWEEN(d1,d2)返回d1与d2之间的数目、SYSDATE()获取当前日期。
4.4.4 转换类函数:TO_CHAR()、TO_DATE()、TO_NUMBER()。
4.4.5 聚合类函数:MIN()、MAX()、COUNT()、SUM()。
4.5 子查询的使用
- 多表关联没子查询灵活,但比其块。因为外查询检索一行,内查询要检索一遍。
- 多行子查询可以使用 IN、ANY、ALL。
- 当有大量数据时,关联子查询会比较慢。
4.6 操作数据库
4.6.1 插入数据语法:
INSERT INTO table_name [(column_name1[,column_name2]…)]
VALUES(express1[,express2]…)
或省略VALUES用select语句替换。select子句中的列名可以和insert子句中的不一致,但类型必须是兼容的。
4.6.2 更新数据语法:
UPDATE table_name
SET {column_name1=express1[,column_name2=express2…]
|(column_name1[,column_name2…])=(selectSubquery)}
[WHERE condition]
4.6.3 删除数据语法:
DELETE FROM table_name
[WHERE condition]
或
TRUNCATE table_name truncate速度快,因为其不产生回滚记录。
4.7事务处理
- 事务4种重要的属性ACID(原子性、一致性、隔离性、持久性)
- 事务结束的标准:
- 1执行commit命令
- 2执行rollback命令
- 3执行一条数据定义语言DML,系统自动提交或回滚。
- 4执行一条数据控制语言DCL ,系统自动提交或回滚。
- 5系统断开或关闭。
- 提交事务时后台运行:1在回滚段内记录当前事务已提交 2启动日志写入进程将日志写入重做日志文件 3释放资源 4通知用户完成。
- 回滚事务时后天运行:1使用回滚段内记录还原数据 2释放资源 3通知用户。
- 可以使用SAVEPOINT设置保存点。
第五章 PL/SQL编程
5.1 概述
- PL/SQL是一种过程话语言,是Oracle独有的。
- PL/SQL块:
[DECLARE]
–声明部分,可选
BEGIN
–执行部分,必须
[EXCEPTION]
–异常处理部分,可选
END- 代码块中可以使用dbms_output.put_line©;语句来输出信息。
- PL/SQL字符集:
- 大写和小写字母、数字、制表符、空格、回车、数字符号(+,-,*,/,<,>,=等)、间隔符号(包括(),{}, [],?等)
5.2数据类型
- 5.2.1 基本数据类型:
- 数值类型:NUMBER、PLS_INTEGER、BINARY_INTEGER
- 字符类型:VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR2
- VARCHAR2(maxlength)中maxlength必须输入且小于32767字节。数据库支持最大为4000字节。
- 日期类型DATA
- 布尔类型BOOLEAN,值包括TRUE、FALSE、NULL。
- 特殊数据类型
- %TYPE 表示与指定列同类型。
- RECORD类型 记录类型,可以由多个列值组成。语法:
type record_type is record
(
var_member1 data_type [not null] [:=default_value],
…
) - %ROWTYPE类型,根据表的结构定义的类型,可以储存表的一行数据。
- 5.2.3 变量与常量
- 定义变量 <变量名> <数据类型>[(长度):=<初始值>];
- 定义常量 <变量名> constant <数据类型>:=<常量值>;
5.3 流程控制语句
- 5.3.1 选择语句
- if <condition_expression> then
plsql_sentence1
else if <condition_expression> then
plsql_sentence2
else
plsql_sentence3
end if; - case
when then plsql_sentence1;
when then plsql_sentence2;
…
when then plsql_sentencen;
[else plsql_sentence;]
end casel; - 5.3.2 循环语句
- loop循环
loop
plsql_sentence;
exit when end_condition_exp
end loop; - while 语句
while condition_expression loop
plsql_sentence;
end loop; - for语句
for variable_counter_name in [reverse] lower_limit…upper_limit loop
plsql_sentence;
end loop;
- loop循环
5.4 游标(显式游标、隐式游标、具有引用类型特性的REF游标)
- 5.4.1 显式游标
- 处理步骤:声明游标、打开游标、读取游标和关闭游标。
- 1声明游标:
cursor cur_name[(input_parameter1[,input_parameter2]…)]
[return ret_type]
is select_sentence;
其中input_paraeter的格式为
para_name [in] datatype [{:=|default para_value}] - 2打开游标
open cur_name[(para_value1[,para_value2]…)];
打开游标的过程中,程序先将符合条件的记录送入内存,然后再将“指针”指向第一条记录。 - 3读取游标
fetch cur_name into {variable};
打开游标后,指针会指向第一行,当执行fetch…into后,会把第一行数据付给into的变量,然后指针自动向下移动一行。 - 4关闭游标
close cur_name;
- 5.4.2 游标的属性
- %found 布尔属性,如果SQL语句至少影响到一行数据则为TRUE。
- %notfound 与%found 相反。
- %rowcount 数字型属性,返回受SQL语句影响的行数。
- %isopen 布尔属性,当游标打开时为TRUE。
- 5.4.3 隐式游标
- 在执行SQL时,Oracle会自动创建一个隐式游标。主要处理数据操纵语言DML的执行结果。
- 隐式游标默认名称 SQL。
- 5.4.4 通过for语句来循环游标
for var_auto_record in cur_name loop
plsql_sentence;
end loop;
其中plsql_sentence中,可以通过var_auto_record直接点"."的方式,直接访问游标结果列。
for循环中,不用打开游标、读取游标、关闭游标,Oracle会自动完成。
5.5 PL/SQL 异常处理
- 异常处理通常放在PL/SQL的EXEPTION代码块中
- 两大类异常:预定义异常、自定义异常。
- 5.5.1 预定义异常 20个左右
- 包括除数为零ZERO_DIVIDE、TOO_MANY_ROWS结果集超出1行 等,用户可以直接捕获,不用自己定义 。
exception
when too_many_rows then
dbms_output.put.line(‘返回结果集超出一行’);
end;
- 包括除数为零ZERO_DIVIDE、TOO_MANY_ROWS结果集超出1行 等,用户可以直接捕获,不用自己定义 。
- 5.5.2 自定义异常
- 1错误编号异常
- Oracle系统出错时会显示错误编号和异常信息,但错误编号不宜与理解,所以可以再PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用PRAGMA EXCEPTION_INIT 为错误编号关联异常名称。然后就可以像预定义异常那样捕获处理了。
declare
primary_iterant exception;
pragma exception_init(primary_iterant,-00001);— -00001为主键不为一错误
- Oracle系统出错时会显示错误编号和异常信息,但错误编号不宜与理解,所以可以再PL/SQL块的声明部分(DECLARE部分)使用EXCEPTION类型定义一个异常变量名,然后使用PRAGMA EXCEPTION_INIT 为错误编号关联异常名称。然后就可以像预定义异常那样捕获处理了。
- 2业务逻辑异常
-首先再DECLARE部分使用EXCEPTION类型声明一个异常变量,然后再BEGIN部分根据一定的业务逻辑使用RAISE语句抛出异常(再RAISE后跟异常名称),最后再EXCEPTION部分捕获异常就可以了。
- 1错误编号异常
第6章 过程、函数、触发器和包
-
6.1 存储过程
-
6.1.1创建存储过程
create [or replace] procedure pro_name [(parameter1[,parameter2]…)] is|as [inner_variable]
begin
plsql_sentences;
[exception]
[dowith_sentences;]
end [pro_name];-
执行存储过程
- 1通过 execute pro_name; 方式
- 2 把存储过程放入PL/SQL代码块中
begin
pro_name;
end;
-
6.1.2存储过程的参数(包括IN、OUT、INOUT)
-
IN模式,输入类型参数,存储过程只能读取。默认模式。可以指定名称传递(parname=>value,…)、按位置传递。有默认值可以不传递参数。
-
OUT模式,输出类型参数,存储过程可以修改其值。
-
INOUR模式,输入输出类型参数。即可读取也可修改。
-
-
6.2 函数
-
6.2.1 函数的创建
create [or replace] function fun_name ([parameter1[, parameter2]…]) return data_type is
[inner_variable]
begin
plsql_sentence;
[exception]
[dowith_sentences];
end [fun_name];
-
调用函数:调用函数时必须使用一个变量来保存函数的返回值。如:avg:=get_avg(10);
-
删除函数:drop function fun_name;
-
-
6.3 触发器
-
6.3.1 触发器可以看作是一种特殊的存储过程,它定义了一些与数据库相关的事件(触发事件DML、DDL、数据库系统事件、用户事件等)发生时应执行的“功能代码块”。
-
语法:
create [or replace] trigger tri_name
[before | after | instead of] tri_event
on table_name | view_name |user_name |db_name
[for each row] [when tri_condition]
begin
plsql_sentences;
end tri_name;
-
行级触发器、语句级触发器、替换触发器、用户事件触发器、系统事件触发器。
-
前触发适合强化安全性、启用业务逻辑和进行日志记录。后触发适合记录操作或做某些事后处理。
-
6.3.2 语句级触发器:就是针对一条DML语句的触发器,不使用for each row ,无论操作多少行,只触发一次。
- 条件谓词:inserting、updating、deleting。还可以使用updating(dname)判断某列是否被更新。
-
6.3.3 行级触发器
- 针对每一行数据都执行一次触发器,必须使用 for each row语句。
- 列标识符::new.column_name 、:old.column_name。
-
6.3.4 替换触发器
- 使用 instead of 语句,用于替换DML操作。定义在视图上。
-
6.3.5 用户事件触发器
- 因进行DDL操作或用户登录、退出等操作而引起运行的触发器。
- 常见的用户事件为CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、RENAME、TRUNCATE、SUSPEND、LOGON、LOGOFF等。
-
-
6.4 程序包
-
程序包由PL/SQL程序元素(如变量、类型)和匿名PL/SQL块(如游标)、命名PL/SQL块(如存储过程和函数)组成。
-
在PL/SQL块中使用dbms_output.put_line语句就是程序包的一个应用。
-
6.4.1 程序包头
-
语法:
create [for replace] package pack_name is
[declare_variable];
[declare_type];
[declare_curosr];
[declare_function];
[declare_procedure];
end [pack_name];
-
-
6.4.2 程序包体
-
包含了程序包头中声明的对象。
-
语法:
create [or replace] package body pack_name is
[inner_variable]
[cursor_body]
[function_title]
{begin
fun_plsql;
[exception]
[doeith_sentences];
end [fun_name]}
[procedure_title]
{begin
pro_plsql;
[exception]
[dowith_sentences;]
end [pro_name]}
…
end [pack_name];
-
-
第七章 管理控制文件和日志文件
- 7.1 管理控制文件
- 控制文件时Oracle数据库最重要的文件之一,每个Oracle数据库都必须至少有一个控制文件,在启动数据库实例时,Oracle会根据初始化参数查找到控制文件,并读取控制文件的内容,然后根据控制文件中的信息(如数据库名称、数据文件和日志文件的名称及位置等)在实例和数据库之间建立关联。
- 只有Oracle进程才能安全地更新控制文件的内容。为了保证控制文件的安全,Oracle提供了备份和多路复用的机制。
- 至少要为数据库建立两个控制文件,且保存在不同的磁盘中。实现控制文件的多路复用主要包括更改CONTROL_FILES参数和复制控制文件两步。
- 在控制文件全部丢失后,唯一补救办法就是手动创建控制文件。使用CREATE CONTROLFILE语句。创建控制文件步骤:
- 1查看数据文件和重做日志文件
- 2关闭数据库
- 3备份文件
- 4重启数据库实例
- 5创建新的控制文件
- 6编辑参数
- 7打开数据库
- 使用alter database backup controfile语句备份控制文件,有两种方式:1二进制备份 2脚本备份
- 备份后恢复控制文件,只需要在初始化文件中重新设置CONTROL_FILES 参数的值,指向备份文件。
- 删除控制文件
- 1关闭数据库 shutdown
- 2编辑初始化参数CONTROL_FILES,清除掉打算删除的控制文件名称。
- 重新启动数据库。startup
- 查询控制文件信息,使用数据字典 V$CONTROLFILE等。
- 7.2 管理重做日志文件
- 重做日志文件(Redo Log File)通常也称为日志文件,它是保证数据库安全和数据库备份与恢复的文件。
- 用于记载事务操作引起的数据变化,当执行DDL或DML操作时,有LGWR进程将缓冲区中与该事务有关的重做记录全部写入重做日志文件。
- 一个Oracle数据库至少需要两个重做日志文件组,没个组包含一个或多个重做日志文件。
- 可以通过数据字典V L O G 、 V LOG、V LOG、VLOGFILE、V$LOG_HISTORY查看日志文件信息。
- 7.3 归档日志文件
- Oracle有两种日志模式,非归档日志模式、归档日志模式,在归档模式下,通过“归档日志文件”来提前保存因日志写满而即将被覆盖的重做日志文件。
- 通过数据字典查看归档信息V$DATABASE等。
第八章 管理表空间和数据文件
- 8.1 表空间与数据文件关系
- 表空间是数据文件的逻辑层表示。查看表空间对应数据文件的信息可以用数据字典DBA_DATA_FILES。
- 8.2 Oracle 11g的默认表空间
- EXAMPLE:存放各样例的数据。
- SYSAUX:SYSTEM表空间的辅助空间。
- 通过DBA_SEGMENTS查看SYSAUX表空间信息。
- SYSTEM:存放数据字典、包括表、视图、存储过程的定义等。
- 可以再数据字典DBA_SEGMENTS中查询某个表空间存放的数据对象及其类型和拥有者。
- TEMP:存放SQL语句处理的表和索引的信息,比如排序就占用此空间。
- UNDOTBS1:存放撤销数据的空间。
- USERS:存放“应用系统”所使用的数据对象。
- 8.3 创建表空间
- 1通过本地化管理方式创建表空间
- 2通过空间管理方式创建表空间
- 3创建非标准块表空间
- 4创建大文件表空间
- 8.4 维护表空间与数据文件
- 8.4.1 设置默认表空间:系统创建用户时,如果不指定表空间,则默认是TEMP表空间,默认永久表空间是SYSTEM。这样会导致应用系统和Oracle系统竞争使用SYSTEM表空间,所以Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间,非TEMP表空间设置为应用系统的临时表空间。
- 表空间有两种状态:只读和可读写。只读时不能进行DML操作。
- 8.5 管理撤销表空间
- UNDO撤销段所在表空间。
- 8.6 管理临时表空间
- 临时表空间是磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的那个逻辑区域,排序完后自动释放。
第九章 数据表对象
-
9.2 创建数据表
-
在创建数据表时,Oracle将在一个指定的表空间中为其分配存储空间。
-
Oracle内置的数据类型:
- 字符型:
- CHAR数据类型:用于存储固定长度的字符串,插入数据少于固定长度时,后补空格。插入数据大于固定长度是,会报错。
- VARCHAR2数据类型:用于存储变长的字符串数据,保留实际字符串长度。
- 数值类型:
- NUMBER(precision,scale):精度和范围,如果插入数据超过指定位数,将四舍五入。
- 日期时间类型:
- DATE:存储日期和时间的组合数据。
- LOB类型:
- 用于大型的、未被结构化的数据。如二进制文件、图片文件和其他类型的外部文件。
- BLOB:存储二进制对象。如图像、音频文件。
- CLOB:存储字符格式的大型对象。
- BFILE:存储二进制格式的文件。
- ROWID数据类型:被称为“伪列类型”,记录每条记录的物理地址。
- 字符型:
-
9.2.2 创建数据表语法
CREATE TABLE table_name
{
列名 数据类型 约束|默认值,
…
表级约束|主键|外键
}
也可以使用
CREATE TABLE table_name as select …- 数据表的特性:
- 1存储参数:Oracle创建表时,如果没指定会使用默认的存储参数。也可以通过STORAGE子句设置存储参数,这样可以控制表中盘区的分配管理方式。STORAGE子句指定INITIAL、NEXT、MINEXTENTS这3个参数。
- INITIAL:用于为表指定分配的第一个盘区大小。
- NEXT:用于指定分配的第二个盘区大小,在字典管理的表空间起作用。
- MINEXTENTS:用于指定分配的最小盘区数目,在本地化管理的表空间不起作用。
- 2数据块管理参数
- PCTFREE和PCTUSED
- 在管理方式为AUTO自动下,不用设置。SEGMENT SPACE MANAGEMENT AUTO
- 在管理方式为MANNUAL手动管理,可以设置。SEGMENT SPACE MANAGEMENT MANUAL
- PCTFREE用于指定数据块中必须保留的最小空闲空间比例,空闲空间用于插入、更新时使用。默认10
- PCTUSED用于设置数据块是否可用的界限。
- PCTFREE和PCTUSED和必须小于等于100,和与100差越大,存储效率越高。
- INITRANS参数:用于指定一个数据块所允许的并发事务数目。能够访问一个数据块的事务总数由MAXTRANS参数决定,一般默认255个。
- PCTFREE和PCTUSED
- 3重做日志参数
- 在创建表时,使用NOLOGGING子句,则不记录DDL日志,记录DML日志。使用LOGGING子句则都记录。
- 4缓存参数
- 使用CACHE子句会将全文搜索时,将读入的数据块放在LRU中最近最常使用的一端,默认是放入最近最少使用的一端。这样就提高了针对该表的查询效率。对于比较小且又经常查询的表可以用。
- 1存储参数:Oracle创建表时,如果没指定会使用默认的存储参数。也可以通过STORAGE子句设置存储参数,这样可以控制表中盘区的分配管理方式。STORAGE子句指定INITIAL、NEXT、MINEXTENTS这3个参数。
-
-
9.3 维护数据表
-
9.3.1 增加和删除字段
- ALTER TABLE 表名 ADD(新字段名,数据类型);
- ALTER TABLE 表名 DROP [(列名1,列名2) | column 列名];
-
9.3.2 修改字段
- alter table table_name modify column_name colun_property;
-
9.3.3 重命名表名
- alter table table_oldname rename table_newname;
- Oracle会自动更新数据字典中的外键、约束定义以及表关系。但不会更新存储过程、客户应用以及依赖该对象的其他对象。
-
9.3.4 改变表空间和存储参数
-
1修改表空间:若要将一个“非分区”表移动到一个新的表空间,则可以使用
alter table table_name move tablespace newtbsp_name;
-
2修改存储参数:alter table table_name pctfree newvalue pctused newvalue;
-
-
9.3.5删除表
- drop table table_name [cascade constraints];
- 如果表存在约束、关联的视图和触发器等,必须使用子句 cascade constraints。
- 一般删除后只是在数据字典中删除,并没有清理空间,而是把表放在了回收站。所以删除后可以参看回收站是否存储而闪回还原。
- 查看回收站:数据字典RECYCLEBIN
- 闪回:FLASHBACK TABLE table_name to before drop;
- 如果drop时使用purge选项就彻底删除了。
-
9.3.6 修改表状态
- 用户可以将表置于READ ONLY(只读)状态,然后就不能执行DML和某些DDl操作了。
- alter table table_name read only;
-
-
9.4 数据完整性和约束性:非空约束、主键约束、唯一约束、外键约束、检查约束、默认约束。
- 1非空约束:NOT NULL
- 2主键约束:可以在列名后,也可以再所有列之后声明,包含非空约束、唯一。
- constraint key_name primary key (column1[,column2…])。constraint 可以省略,省略时系统自动生成约束名。
- alter table table_name add [constraint key_name] primary key(column);
- alter tbale table_name drop constraint key_name;
- 3唯一性约束:可以在列名后,也可以在所有列之后声明。
- CONSTRAINT u_name UNIQUE;不允许重复,但可以有多个空值。
- ALTER TABLE table_name ADD CONSTRAINT u_name UNIQUE (column_name);
- ALTER TABLE table_name DROP CONSTRAINT u_name;
- 4外键约束:两个表关联
- CINSTRAINT f_name FOREIGN KEY(本列名)REFERENCES 关联表名(关联列名)[on …];
- 关联列名与本表列名相同时,关联列名可以省略。
- 可以通过关键字 ON 指定引用行为的类型。
- NO ACTION 当删除应用表中被引用类的数据时,将违反外键约束,报错。默认。
- SET NULL 删除时外键表中外键被设置为NULL
- CASCADE 级联删除。例如: ON DELETE CASCADE;
- 5禁用和激活约束
- 创建后默认激活,可以在创建create时或之后用alter指定 disable关键字禁用。
- 禁用主键约束时,会一起删除其包括的唯一索引。可以在禁用时使用关键字KEEP INDEX放在约束后面,来保留唯一索引。使用CASCADE关键字会级联禁用关联的外键约束。
- 使用ALTER TABLE table_name ENABLE [novalidate | validate] constraint con_name;
- 6删除约束
- ALTER TABLE … DROP CONSTRAINT …;
第十章 其他数据对象
-
10.1 索引对象
- Oracle对索引和对表的操作相似,会在数据字典中保存索引的定义,还在用户默认表空间中分配实际的索引段。
- 按存储方式分为:B树索引、位图索引、反向键索引、基于函数的索引。按唯一性分为:单一索引、复合索引。
- 建立索引的要求:
- 1索引因建立在WHERE子句频繁引用表列上,并且检索行数不低于总行数15%。
- 2经常用于排序的列建立索引。
- 3索引会减低DML速度。
- 4索引块空间是为了以后INSERT操作预留的空间,所以INSERT大量的表应该设置PCTFREE较大,则索引块空间会较小。
- 5将表和索引部署到相同的表空间,可以简化表空间管理。将表和索引部署到不同的表空间,可以提高访问性能。
- 6在大表上建立索引时,使用NOLOGGING可以节省日志空间、降低索引建立时间。
- 7不要在小表上建立索引。
- 8在表链接的列上建立索引。
- 创建索引:使用CREATE INDEX语句
- 1建立B树索引:默认,以B树结构组织并存放索引数据。分配均匀满树下,无论获取哪个页块都可以保证经过的索引层次是相同的。
- 子句TABLESPACE用于指定索引段所在表空间,不指定就在用户默认表空间。
- 2建立位图索引:当列的基数低于1%时,适于建立位图索引。使用 create bitmap index inx_name on table_name(column_name);
- 位图索引默认分配位图区大小为8MB,可以使用CREATE_BITMAP_AREA_SIZE参数修改。
- 3建立反向键索引:在Oracle中,系统会自动为表主键建立索引,默认是B树索引。但表主键通常是自动增长的序列编号,如果数据量非常大时将导致索引数据分配不均,可以使用反向键索引(将主键值反向),将数据随机分散到索引中。
- create index inx_name on table_name(clumn_name) reverse;
- alter index inx_name rebuild reverse;
- 4基于函数的索引:基于函数的索引是常规B树索引,它存放的数据是由表中的数据应用函数后所得到的。
- create index inx_name on table_name(函数(clumn_name));
- 修改索引
- 有两种方式可以清除索引碎片:重建索引和合并索引
- 合并索引:alter index inx_name coalesce deallocate unused;
- 重建索引:alter index inx_name rebuild;
- 有两种方式可以清除索引碎片:重建索引和合并索引
- 删除索引:
- drop index inx_name;
- 索引信息数据字典:
- DBA_INDEXES显示数据库的所有索引;ALL_INDEXES显示当前用户可以访问的所有索引;USER_INDEXES显示当前用户的索引信息。
- DBA_IND_COLUMNS显示所有索引的表列信息;ALL_IND_COLUMNS显示当前用户可以访问的所有索引列信息;USER_IND_COLUMNS显示当前用户的所有索引列信息。
- DBA_IND_EXPRESSIONS显示数据库所有函数索引对应的函数或表达式;USER_IND_EXPRESSIONS。
- DBA_SEGMENTS显示索引段位置及大小。
-
10.2 视图对象:数据库只在数据字典中存储视图的定义信息,不存储数据值。
-
10.2.1 创建视图
-
create [or replace] view <view_name> [alias[,alias]…]
as
[with check option] [constraint constraint_name]
[with read only]
-
简单视图:单个表,不包含函数、表达式、分组数据时,可以对视图DML操作。
-
只读视图、复杂视图、连接视图 不可以执行DML。
-
-
管理视图:
- 数据字典USER_VIEWS查看视图定义信息。
- create or replace view 重新定义视图。
- alter view view_name compile;重新编译视图
- drop view view_name;
-
-
10.3 同义词对象
- 同义词是表、索引、视图等模式的一个别名(公有同义词、私有同义词)。
- 建立公
第十一章 表分区与索引分区
-
11.4 管理表分区
-
11.4.1 添加表分区 ALTER TABLE … ADD PARTITION
alter table table1 add partition hebei values(“河北省”)
storage(inital 10k next 20k) tablespace tbsp_1
nologging;
-
11.4.2 合并分区
- 合并散列分区 alter table … coalesce partition;
- 合并复合分区 alter table person2 modify partition par3 coalesce subpartition;
-
11.4.3 删除分区
- 可以从范围分区或复合分区中删除分区,但是散列分区和复合分区的散列子分区,只能通过合并分区来达到删除的目的。
- 删除一个表分区 alter table … drop partition
- 删除有数据、全局索引、有完整性约束的表分区,要先删数据和禁用完整性约束,再删分区,最后重建索引。
-
11.4.4 并入分区
- 使用merge partition语句将相邻的范围分区合并变成一个新分区。合并完需重建索引。
-
-
11.5 创建索引分区
-
Oracle索引分区分为本地索引分区和全局索引分区。
-
本地索引分区:就是使用和分区表同样的分区键进行分区的索引。
-
create index par_name on table_name(clumn_name)
local
(
partition p1 tablespace ts_1,
…
) ;
-
可以通过DBA_IND_PARTITIONS来查看索引分区信息。
-
-
全局索引分区:
-
就是没有与分区表相同分区键的分区索引,当分区中出现许多事务时,采用全局索引分区。
-
无论表是否采用分区,都可以对表采用全局索引分区,不能对Cluster表、位图索引采用全局索引分区。
-
create index index_name on table_name(clumn_name) --全局范围索引分区
global partition by range(clumn_name)
(
partition p1 values less than(number_value),
…
);
-
global partition by hash(clumn_name); --全局hash索引分区
-
-
-
11.6 管理索引分区
-
删除索引分区 alter index … drop partition…
-
删除后若只剩一个索引分区,需要重建 alter index … rebuild partition…
-
重命名索引分区:alter index index_name rename partition old_name to new_name;
-