- “g”代表网格
- Oracle 服务器: 是一个数据库管理系统,由 Oracle 实例和 Oracle 数据库组成
- Oracle 实例: 是一种访问oracle的方式,一次只打开一个,由内存结构(SGA(系统全局区))+后台进程结构组成
- 连接到实例:建立一个用户连接,加上开启一个会话
- 数据库结构:数据文件、控制文件(其下还有口令文件,参数文件)、联机重做日志文件(其下还有归档日志文件)
- 数据文件:数据库当前数据文件
- 控制文件:存放维护和验证数据库完整的文件
- 联机重做:数据库的更改记录,以循环方式覆盖写入内容
- 归档日志文件:将联机重做日志已写满的文件的内容复制出来, 存放在指定的位置
- 内存结构:SGA(系统全局区)+PGA (程序全局区)
- SGA:由所有服务器进程和后台进程共享,是动态的,包含以下结构:
- 共享池:存储最近执行的SQL语句,和最近使用的数据定义,包含以下两个关键内存结构:
- 库高速缓存:存储最近使用的SQL语句信息,由“最近最少使用算法” (LRU) 管理
- 数据字典告诉缓存:存储最近使用的定义集合,包括数据库文件名,表名,索引,权限等等
- 数据库缓冲区高速缓存:存储从数据文件中检索到的数据块的复本,(LRU)算法来管理
- 重做日志缓冲区:纪录数据库数据块所有变化,主要的用途是恢复
- 大型池:减轻共享池的负担
- Java 池:是在安装使用JAVA情形下用的
- Streams 池
- 共享池:存储最近执行的SQL语句,和最近使用的数据定义,包含以下两个关键内存结构:
- PGA:专用于每一个服务器进程或后台进程,用来为每一个连接到ORACLE数据库的用户进程所用的自由内存区
- SGA:由所有服务器进程和后台进程共享,是动态的,包含以下结构:
- 进程结构:调用应用程序或 Oracle 工具时,Oracle 服务器会通过创建服务器进程来执行应用程序发出的命令。Oracle 服务器还会针对一个实例创建一组后台进程。
- 用户进程:在用户要求连接到ORACLE服务器时启动,不能直接和ORACLE服务器交互
- 服务进程:连接到ORACLE实例,当用户创建会话时开始,直接和ORACLE服务器进行交互的程序
- 后台进程:当ORACLE实例启动后启动,物理和内存结构之间的关系是通过ORACLE后台进程来保持和加强的,必须得后台进程有
- DBWn:数据库书写器进程
- LGWR:日志书写器进程
- SMON:系统监控
- PMOM:过程监控进程
- CKPT:检查点进程
- ARCn:归档进程
- 逻辑结构:表空间、段、分区(分配单位)、数据块(使用单位)
- 文件命名语法:
- 控制文件:/pm/q/d/controln.ctl
- 重做日志文件:/pm/q/d/redon.log
- 数据文件:/pm/q/d/tn.dbf
- 管理用户
- SYS:口令(chang_on_install),管理数据库数据字典表,系统表
- SYSTEM:口令(manager),管理工具所需的内表和视图
- SQL*PLUS:操作和控制数据库,启动和关闭数据库、创建和运行查询、添加行、修改
- 登陆SQLPLUS:DOS界面(sqlplus useername/password@dbname)
- 常用查询语句:
- 显示当前环境变量的值:Show all
- 显示当前在创建函数、存储过程、触发器、包等对象的错误信息 Show error
- 显示数据库的版本:show REL[EASE]
- 显示当前的用户名 show user
- 显示表结构 desc table;
- 显示缓冲区内容(缓冲区记录SQL语句,不记录SHOW等语句) list
- 显示缓冲区内容的第n行 list n
- 修改缓冲区的内容 change /old/new
- 直接改变第n行内容 n text
- 缓冲区后增加内容(不换行) append text
- 缓冲区后增加内容(换行) input text
- 在第一行前插入数据 0 text
- 清除缓冲区内容 clear buffer
- 删除缓冲区第n行 del n
- 用记事本编辑缓冲区内的文本 edit
- 将缓冲区内的文本保存为可执行的sql文件 save filename
- 执行保存的sql文件 start filename
- 读取sql文件内容放到缓冲区中 get filename
- 初始化参数文件
- 静态参数文件:PFILE,名为initSID.ora,纯文本文件,缺省路径是$ORACLE_HOME/dbs
- 永久参数文件:SPFILE名为spfileSID.ora,二进制文件
- 启动数据库
- 优先顺序:spfileSID.ora-->缺省SPFILE-->initSID.ora-->缺省PFILE
- 任务顺序:ORACLE_HOME/dbs 读取初始化文件-->分配SGA-->启动后台进程-->打开alertSID.log 文件和跟踪文件
- 打开数据库:包括打开数据文件和联机重做日志文件
- 数据库常用命令:
- 从nomount-》mount: ALTER DATABASE db01 MOUNT;
- 打开只读数据库 ALTER DATABAE db01 OPEN READ ONLY;
- 关闭数据库:shutdown 【以下方式】
- NORMAL(最慢)
- TRANSACTIONAL等做完事务但不等断开联结
- IMMEDIATE(最快)不等做完所有事情把正在做的事情做ROLLBACK,回滚掉已做的事情到一致的状态再断开联结
- ABORT用做RECOVERY
- 单行函数:返回一个值
- 字符
- 转大写:upper('string')
- 转小写:lower('STRING')
- 首字母大写:initcap('string')
- 字符串
- 连接:concat('hello','world')
- 截取:substr('helloworld',2,5)-->ello
- 返回长度:length('helloworld')
- 返回指定字符串的首字母在原字符串中的位置:instr('helloworld','ello') -->2
- 左填充:LPAD(SALARY,10,'*') -->*****24000
- 右填充:RPAD(SALARY,10,'*')
- 截去:trim('h' from 'helloworld')
- 数字
- 四舍五入:round(45.926,-1)-->50
- 截断小数:trunc (45.926,2)-->45.92 若省去n,则默认为0 eg:trunc (45.926)-->45
- 取余数:mod(1600,300)-->100
- 日期:默认DD-MON-RR --> 09-JUN-98
- 字符
SYSDATE:返回系统日期
两日期间的月数:MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
把月加上:ADD_MONTHS ('11-JAN-94',6) -->'11-JUL-94'
下个星期几是几号:NEXT_DAY ('01-SEP-95','FRIDAY') --> '08-SEP-95'
指定月的最后一天:LAST_DAY('01-FEB-95') --> '28-FEB-95'
四舍五入日期:sysdate='25-JUL-95'
ROUND(SYSDATE,'MONTH') 01-AUG-95
ROUND(SYSDATE ,'YEAR') 01-JAN-96
截去日期:
TRUNC(SYSDATE ,'MONTH') 01-JUL-95
TRUNC(SYSDATE ,'YEAR') 01-JAN-95
5、转换函数
date->char TO_CHAR(date, 'format_model') ps:必须加单引号,并且区分大小写
用一个fm 元素用来删除填补的空,或者前导
零
日期格式模板:
时间格式:
spth(显示英文序数)
number ->char TO_CHAR(number, 'format_model') PS:引号必须
数字格式:
char->number to_number('999.00')
char->date to_date('01-jan-99','DD-Mon-YY')
6、通用函数:转换空值为实际值:NVL (expr1, expr2) 非空转2空转3: NVL2 (expr1, expr2, expr3) 返回第一个非空表达式:COALESCE (expr1, expr2, ..., exprn) 相等返回空,不相等返回第一个表达式:NULLIF (expr1, expr2)
7、条件表达式:
case expr when 条件 then 返回
when 条件 then 返回
else 返回
end
DECODE expr, 条件1, 返回1,
条件2, 返回2,
默认值
- 多表查询:
- SELECT table1.column, table2.column
- FROM table1, table2
- WHERE table1.column1 = table2.column2;
- DUAL 是一个虚拟表,你可以用它来查看函数和计算的结果
- AND:增加限制条件 where sal>1000 and empno=10 and deptno=50
- 别名
- 为了连接n 个表,你最少需要n-1 个连接条件。
- 非等值连接:WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
- 外连接:WHERE e.department_id(+) = d.department_id ;
- 自然连接:基于两个表之间有相同名字的所有列 select empno,ename, dname from emp natural join dept;
- 交叉连接:笛卡尔积 select empno,ename, dname from emp cross join dept;
- USING子句连接:匹配唯一列 select emp.empno,emp.ename,dept.dname from emp join dept using (deptno);
- on子句:指定任意条件或者要连接的列,还可以创建3表的连接
- 字符串和日期的值放在单引号中
- 比较条件(where中用)
匹配列表中任意值:in(1,2,3)
匹配字符模板:like ‘_o%' (% 表示零个或多个字符 _ 表示一个字符)
匹配空值:where emptno is null
- 求值顺序:算数-》比较-》is null , like , in -> between -> not -> and -> or
- order by ... asc (默认)/ desc 在SELECT 语句的最后
- 组函数:用在select语句中,且除组函数之外的列必须包含在group by 中,不能使用WHERE 子句来约束分组,但可以使用having子句限制,是多行查询
- DISTINCT 无重复值
- 创建数据组:GROUP BY 位于order前where后
- select ... from ... where ... group by ... having ... order by
- 单行子查询:where salary > (select from where ....) ps:括号不要忘记
- 多行子查询:
- 约束:create table 时定义
id int primary key (不指定约束名,此时系统会自己配一个复杂的约束) 《--》 hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL(指定约束名)
2、表级定义:定义多个列的约束,但不能定义NOT NULL
id int , constraint emp_id_pk primary key (id) ps:括号不能忘
- not null :不能为空
- UNIQUE :值唯一,且空永远满足(即空可以有多个)
- PRIMARY KEY :一个表只能有一个主键,非空且唯一,会自动添加索引
- FOREIGN KEY :外键引用的值必须在主键中出现,主键与外键可以是同一张
CREATE TABLE EMP(.....CONSTRAINT emp_dept_fk FOREIGN KEY (deptno) REFERENCES dept(deptno))
ps:前面是本表的列,references 到另一张表的主键
ON DELETE CASCADE: 当父表中的行被删除时,删除子表中相依赖的行
ON DELETE SET NULL: 转换相依赖的外键为空 create table lyo2(id int,constraint emp_fk foreign key (id) references lyo1(id) on delete set null);
- check:CONSTRAINT emp_salary_min CHECK (salary > 0)
- 添加约束:ALTER TABLE emp ADD CONSTRAINT emp_dept_fk FOREIGN KEY (deptno) REFERENCES dept(deptno);
- 删除约束:ALTER TABLE employees DROP CONSTRAINT emp_manager_fk;
- 禁用/启用约束:ALTER TABLE employees DISABLE/ENABLE CONSTRAINT emp_emp_id_pk CASCADE;(CASCADE 选项禁用相依赖的完整性约束)
- 启用一个带CASCADE 选项的被禁用的主键约束不会起用任何依赖于该主键的外键。??
- 查看约束:C 代表CHECK,P 代表PRIMARY KEY,R 代表引用完整性, U 代表UNIQUE 键
查看约束关联的列:SELECT constraint_name, column_name FROM user_cons_columns
- 视图:不包含它自己的数据,只是一个窗口,如果视图中包含组函数,GROUP BY 子句,DISTINCT 关键字,伪列ROWNUM 关键字,就不能删除行,不能修改数据,不能添加数据,如果其中有表达式定义的列,那它则仅不能修改数据
修改:CREATE OR REPLACE VIEW lyo(第1列别名,第2列别名...) as select...
只读:....as select .... with read only;
删除:drop view lyo
- 查询本用户已有的表:select table_name from user_tables;
- 子查询创建表:create table lyo as select .....
- 修改表:ALTER/delete/update/insert
ALTER TABLE LYO MODIFY (last_name VARCHAR2(30)); ALTER TABLE LYO DROP COLUMN job_id;
delete from lyo where empno=10
update emp set empno=1 where ename='lyo'
insert into emp(empno,ename) values (1,'lyo')
- 删除表:DROP TABLE lyo;
- 改变名字:RENAME dept TO detail_dept;
- 截断表:删除内容不删除表,TRUNCATE TABLE dept
- 索引:定义一个PRIMARY KEY或UNIQUE 约束时,一个唯一索引被自动创建
创建索引的情况:一个列包含一个大范围的值, 一个列包含很多的空值, 一个或多个列经常同时在一个WHERE 子句中或一个接条件中被使用, 表很大,并且经常的 查询期望取回少于百分之2 到4 的行
查询索引:USER_INDEXES 数据字典视图包含索引和它唯一的名字,USER_IND_COLUMNS 视图包含索引名、表名和列名
删除索引:drop index lyo
- 添加注释:COMMENT ON TABLE employees IS 'Employee Information';
- TOP-N分析:
- P L / S Q L块的类型:命名块(过程和函数)和匿名块
- PL/SQL块:由3部分组成:定义部分(DECLARE),可执行部分(BEGIN),异常处理部分(EXCEPTION)。 DECLARE....BEGIN...EXCEPTION...END;
- 字块嵌在主块的BEGIN部分
- 定义部分
- 定义标量:一行定义一个标示符,用;结束,如果定义了constant,表明该变量是常量,必须为其赋值,赋值符号为:=,或者使用default进行初始化
- 变量名 【constant】 类型 【not null 】【:=初值】【default ..】
- 用 %TYPE 表示声明一个变量与某个列的数据类型一致:Student_name Teacher_name%TYPE
- 记录类型:TYPE LYO IS RECORD (ID NUMBER NOT NULL, .....);相当于定义了一个类,使用时可以这样:STUDENT LYO;
- 用%ROWTYPE表示声明一个记录类型与已有的表的结构(emp)一样:Emp_value EMP %ROWTYPE; 引用时可以使用:emp_value.empno
- 可执行部分:只能使用SELECT,INSERT,UPDATE,DELETE,COMMIT,ROLLBACK等数据查询、数据操纵或事务控制命令,不能使用CREATE,ALTER,DROP,GRANT,REVOKE等数据定义和数据控制命令。SELECT语句必须与INTO子句相配合,在INTO子句后面跟需要赋值的变量。结果只能有一条,如果返回了多条数据或没有数据,则将产生错误。
- 赋值用:=(where中的=还是=)
- 用SELECT语句为%ROWTYPE型变量整个赋值:SELECT * INTO EMP_VALUE FROM EMP WHERE ENAME:=’SMITH’;
- 条件控制语句:IF-THEN-END IF;IF-THEN-ELSE-END IF;IF-THEN-ELSIF-THEN-ELSIF-THEN-ELSE-END IF(elsif不要写成elseif)
- 循环语句:
- 直到型循环:LOOP ...SQL语句.. EXIT WHEN ..条件.. END LOOP;
- FOR循环:FOR V_COUNT(循环变量) IN [REVERSE] 1(下界)..10(上界)LOOP...END LOOP;
- 此处的循环变量不需要在DECLEAR中定义,系统自动默认他为一个整形变量,并每次自动+1
- WHILE循环:WHILE V_COUNT(循环变量)<10 LOOP ... END LOOP;
- 异常处理: WHEN 异常情况1 [OR 异常情况2…] THEN …;....WHEN OTHERS THEN ....END;
- 存储过程:PROCEDURE
- 优点:存储在服务器端,减少网络上所传送数据的数量,几个用户可以共享一个存储过程在内存中的代码
- 语法: CREATE OR REPLACE PROCEDURE lyo (变量名 NUMBER IN ,变量名 INT OUT,....) is(类似于declare)(一般很少用)声明 begin CODE 【exception】 .... END lyo
- 括号部分:
- IN 输入变量,begin中不允许被赋值,默认()内的是IN变量,(id in number)<->(id number)
- OUT 输出变量,BIGIN中不能用他的值,只能赋值,(eno number,name out varchar2,salary out number)
- 声明部分:一般不怎么用
- begin部分:
- select语句仍然要与into连在一起
- 运行:
- execute lyo(过程名) (过程参数)
- 如果过程参数中有OUT变量,在运行之前需要声明一个实体变量,即VARIABLE USER_ID NUMBER;EXECUTE LYO(:USER_ID)
- 删除过程:DROP PROCEDURE lyo
- 函数:
- 语法:CREATE OR REPLACE FUNCTION lyo (变量名 NUMBER IN ,变量名 INT OUT,....) RETURN 数据类型 IS (类似于declare)(把out的变量声明放在这里)声明 begin SELECT ... INTO .V_SAL... FROM ....RETURN ...(V_SAL)... //括号要加 【exception】 .... END
- 执行:
- 定义return的变量:variable v_sal number ; excute :v_sal := lyo(2400)
- 存储过程调用本身就是一个SQL语句, 函数调用则是表达式的一部分
- DBMS_OUTPUT.PUT_LINE (' ')
- 包:将一系列相关对象存储在一起的结构,仅能存储在非本地的数据库中。
- 显式游标:select语句查询的结果可以是单条记录,多条记录,也可以是零条记录。要访问查询结果的所有记录,可以通过FETCH语句,进行指针的移动来实现。
- 定义语法:DECLARE Cursor LYO_C IS SELECT ..FROM ...; //定义游标游标指针 LYO_C%rowtype; //定义游标指针 BEGIN OPEN LYO_C;//打开游标,即执行上面的select语句,将结果放置工作区 LOOP //获取参数 FETCH LYO_C INTO 游标指针1,游标指针2...; IF LYO_C%FOUND THEN //指针仍指向数据 DBMS_OUTPUT.PUT_LINE(游标指针.列名||' '||游标指针.列名....); ELSE EXIT; END IF; END LOOP; CLOSE LYO_C; //关闭游标
- 游标指针只能向下移动,不能回退。要回退,则需关闭游标再打开
- INTO子句中的变量个数、顺序、数据类型必须与工作区中每行记录的字段数、顺序以及数据类型一一对应。即select出多少列,就要into多少列。所以一般使用游标名%rowtype定义游标指针
- 游标属性(用法:游标指针名%isopen)
- %ISOPEN:该属性是为FALSE;布尔型。如果游标已经打开,返回TRUE,否则为FALSE。
- %FOUND:布尔型,如果最近一次使用FETCH语句,有返回结果则为TRUE;
- %NOTFOUND:布尔型,如果最近一次使用FETCH语句,没有返回结果则为TRUE
- %ROWCOUNT:数值型,描述的是到目前为止实际从游标工作区抽取的记录数。
- 隐式游标:在Declare段中无隐式游标说明把SELECT语句直接安排进begin中,PL/SQL会隐含地处理游标定义。每个隐式游标必须有一个INTO;
- 异常:’no_data_found’和‘too_many_rows’
- 判断条件:SQL%ROWCOUNT SQL%NOTFOUND
- 触发器:触发器是数据库内部的特殊存储过程。其功能是,当某种触发事件出现时,触发器便被显式地执行。
- 触发时间
- BEFORE:在操作发生之前执行触发。
- AFTER:在操作发生之后执行触发。
- 触发事件
- INSERT:插入触发;
- UPDATE:更新触发;
- DELETE:删除触发。
- 触发类型
- ROW:行触发,对每一行操作都要触发。
- STATEMENT:语句触发,只对该类操作触发一次。
- 定义语法:CREATE OR REPLACE TRIGGER LYO AFTER/BEFORE INSERT ON TABLE or DELETE ON TABLE or UPDATE [OF COLUMN , COLUMN....] ON TABLE
- FOR EACH ROW DECLARE .... BEGIN IF INSERTING/DELETING/UPDATING THEN ..... END IF; END LYO;
- OLD/NEW关键词:
- old表示数据操纵前的值,old只对UPDATE和DELETE操作。:old.empno
- new表示数据操纵后的值,new只对UPDATE和INSERT操作。:new.empno
- 删除触发器:drop trigger lyo
- 触发时间
- 关于存储过程、触发器、函数、包的几点说明:
- 当存储过程、函数、包或触发器中所依赖的表结构发生变化时,要重新编译存储过程、函数、包或触发器。
- 当其他用户调用该模式对象时,需要有执行的权限。
- 存储过程、函数、包或触发器的执行权限,只能通过命令方式授权,不能通过角色的方式。
- 备份与恢复(几乎都要处于归档模式)
- 目的:数据都能从错误状态恢复到某种逻辑一致的状态。
- 非介质故障:由系统自行处理
- 事务性故障:(数据输入错误、违反了完整性限制、竞争资源导致死锁等)使事务未运行到正常终止点而夭折,这种情况就称为事务故障。此时数据库系统仍然在运行。解决方法:回滚
- 数据库例程故障(突然停电等)事务以非正常方式终止。此时内存中数据库缓冲区的数据全部丢失,但物理数据库上的数据未受影响。解决方法:重启,一边回退未完成的事物,一边重做已提交的事物
- 介质故障:误删,读写错误等,解决办法:重装备份副本
- 数据库必须设置为归档模式才能将联机重做日志归档为归档日志.
- 备份方法:
- 逻辑备份:仅考虑数据库的结构与数据,不考虑地址,以二进制的方式存入,是一种临时转存,辅助性的备份方式,用于用户偶尔删除一行进行的回复,
- 物理备份:
- 冷备份(脱机备份):不对外提供服务
- 归档模式:备份数据文件,控制文件,归档日志文件,数据可以通过归档日志和重做日志文件回复全部
- 非归档模式:备份数据文件,控制文件,重做日志文件,数据只能恢复到备份状态
- 热备份(联机备份):不中断正常服务
- 步骤:
- 备份初始化参数文件。
- 使数据库工作在归档模式(修改参数文件或使用SQL语句)
- 备份表空间
- 强制日志切换以便所有的在线日志都被归档
- 使用操作系统命令或拷贝工具,备份归档日志文件。
- 备份控制文件。
- 步骤:
- 冷备份(脱机备份):不对外提供服务
- 恢复方法:
- 事务性故障的恢复
- 数据库例程故障的恢复:
- 出现两种错误:1、数据与日志不一致2、事务完成,但数据未记录
- 重启例程后,将自动执行向前扫描日志,和向后回退日志
- 介质故障恢复,需要手动完成,即通过联机日志文件和归档日志文件载入到系统
- 完全恢复:将备份以后的数据也能恢复
- 不完全恢复:只能恢复到备份时的数据,recover database until time ‘...’
- 脱机恢复:关闭系统
- 联机恢复:不关闭系统
- 常见故障和恢复:
- 数据文件丢失:在已装载的情况下,联机恢复数据文件
- 控制文件不能启动:在已启动状态下,登陆worksheet重建
- 日志文件故障:如有备份,直接覆盖。没有,在已装载情况下,用worksheet进行不完全恢复
- RMAN:数据在装载的情况下进行恢复,恢复成功再打开数据
- 单通道备份:run{ allocate channel c1 type disk; backup full tag 'dbfull' format 'd:\09122499\database%u_%s_%p' databse include current controlfile; sql 'alter system archive log current'; release channel c1; }
- 双通道备份:run{ allocate channel c1 type disk; backup full tag 'dbfull' format 'd:\09122499\database%u_%s_%p' databse include current controlfile; sql 'alter system archive log current'; release channel c1; }
- 双通道恢复:run{ allocate channel ch1 type disk; allocate channel ch2 type disk; restore database; recover database; sql 'alter database open'; release channel ch1; release channel ch2; }
- 查询恢复日志 select * from v$recover_file;
- 切换日志模式:alter system switch logfile;(进行两次)
- 事务处理语句
- DML:数据操纵语言,在commit,rollback,DDL/DCL执行时,退出SQLPLUS自动提交,表共享,行独占
- DDL:数据定义语言,使用所涉及对象上的排他锁
- DCL:数据控制语言
- 创建标记:savepoint 名字
- 回滚到指定标记:rollback to 名字
- 锁保持直到commit 或rollback
- 权限
- 创建用户:create user username identified by password
- 授予权限:grant 权限... to username,权限有
- CREATE SESSION
- CREATE TABLE
- CREATE SEQUENCE
- CREATE VIEW
- CREATE PROCEDURE
- 创建角色:create role rolename; grant 权限 to rolename ; grant rolename to username
- 改变口令:alter user username identified by password
- 授予对象权限:grant select/delete.... on emp to username/public 【with grant option】(即可转授,撤销时也是级联撤销)/【with admin option】(撤销时不级联撤销)
- 撤销授权:revoke select/delete.... on emp to username 【cascade constraints】
- 删除用户:drop user username