Oracle数据库
学习目标:
1. 理解Oracle数据库体系结构
2. 熟练掌握SQL命令和SQL函数
3. 使用Oracle的各种数据库对象
4. 使用PL/SQL编写存储过程
5. 掌握基本的数据库配置的管理
第1期 Oracle入门
本期目标:
1. 了解Oracle体系结构的各种组件
2. 掌握Oracle中的基本用户管理
3. 了解Oralce的工具
4. 了解Oracle的安装和卸载
Oracle物理组件:'数据文件'、'控制文件'、'日志文件'
Oracle逻辑组件:'数据库'、'表空间'、'段'、'区'、'数据块'以及'模式'
表空间是数据库中最大的逻辑单位,一个Oralce数据库至少包含一个表空间(SYSTEM)。
每个表空间是由一个或多个数据文件组成的,一个数据文件只能与一个表空间相关联。
表空间的大小等于构成该表空间的所有数据文件大小之和。
创建表空间的语法是:
CREATE TABLESPACE tablespacename
DATAILE 'filename' [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
段是构成表空间的逻辑存储结构,段由一组区组成。
按照段存储数据的特征,将段分为四种类型,即数据段、索引段、回退段、和临时段。
区为段分配空间,它由连续的数据块组成。
当段中的所有空间已完全使用时,系统自动为该段分配一个新区。
区不能跨数据文件存在,只能存在于一个数据文件中。
数据块是Oracle服务器所能分配、读取或写入的最小存储单元。
Oracle服务器以数据块为单位管理数据文件的存储空间。
模式是对用户所创建的数据库对象的总称。
模式对象包括表、视图、索引、同义词、序列、过程和程序包等。
创建用户:
CREATE USER username
IDENTIFIED BY password
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
权限指的是执行特定命令或访问数据库对象的权利。
权限有两种类型,系统权限和对象权限
系统权限允许用户执行某些数据库操作,如创建表就是一个系统权限
对象权限允许用户对数据库(如表、视图、序列等)执行特定操作
角色是一组相关权限的组合,可以将权限授予角色,再把角色授予用户,以简化权限管理。
授权命令:
GRANT CONNECT TO user; //CONNECT允许用户连接至数据库,并创建数据库对象
GRANT RESOURCE TO user; //RESOURCE角色允许用户使用数据库中的存储空间
GRANT CREATE SEQUENCE TO user; //此系统权限允许用户在当前模式中创建序列,此权限包含在CONNECT角色中
GRANT SELECT ON table TO user; //允许用户查询表的记录
GRANT UPDATE ON table TO user; //允许用户更新表中的记录
GRANT ALL ON table TO user; //允许用户插入、删除、更新和查询表中的记录
第2期 SQL查询和SQL函数
本期目标:
1. 了解Oracle数据类型
2. 了解数据定义语言和数据操纵语言
3. 了解事务控制语言和数据控制语言
4. 掌握SQL操作符和SQL函数
SQL命令类别:数据定义语言(DDL)、数据操纵语言(DML)、事务控制语言(TCL)、数据控制语言(DCL)
字符类型
CHAR 1-2000字节
VARCHAR2 1-4000字节
LONG 最大2GB
数据类型
NUMBER [(p[,s])] p表示精度,s表示小数点的位数
可以存储整数、浮点数和实数,最高精度为38位
日期时间类型
DATE 存储日期和时间部分,精确到整个的秒
TIMESTAMP 存储日期、时间和时区信息,秒值精确到小数点后6位
二进制数据类型
RAW 最多2000字节
LONG RAW 最多2GB
大对象数据类型
LOB称为“大对象”数据类型,可以存储多达4GB的非结构化信息,例如声音剪辑和视频文件等
CLOB (Character LOB)(字符型LOB) 它能够存储大量字符数据
BLOB (Binary LOB) (二进制 LOB) 可以存储较大的二进制对象,如图形、视频剪辑和声音文件
BFILE (Binary File) (二进制文件) 它用于将二进制数据存储在数据库外部的操作系统文件中
伪列数据类型
Oracle中伪列就像一个表列,但是它并没有存储在表中。伪列可以从表中查询,但不能插入、更新和删除它们的值。
ROWID 是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用ROWID伪列快速地定位表中的一行
ROWNUM 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数
数据定义语言
数据定义语言用于改变数据库结构,包括创建、更改和删除数据库对象
命令有:
CREATE TABLE
ALTER TABLE
TRUNCATE TABLE
DROP TABLE
数据操纵语言
数据操纵语言用于检索、插入和修改数据,其是最常见的SQL命令
命令包括:
SELECT
INSERT
UPDATE
DELETE
DML-SELECT
利用现有的表创建表
语法:
CREATE TABLE AS
SELECT column_names FROM ;
eg:
CREATE TABLE newitemfile AS SELECT * FROM itemfile;
CREATE TABLE newitemfile1 AS SELECT itemcode,itemdesc,qtyhang FROM itemfile;
CEEATE TABLE newitemfile2 AS SELECT * FROM itemfile WHERE 1=2;
选择无重复的行
在SELECT子句,使用DISTINCT关键字
SELECT DISTINCT vencode FROM vendor_master;
使用列别名
为列表达式提供不同的名称,该别名指定了列标题
SELECT itemcode,itemdesc,max_level,max_level*2 AS NEW_MAXLEVEL FROM itemfile;
SELECT itemcode,itemdesc,max_level,max_level*2 "New Maximum Level" FROM itemfile;
DML-INSERT
插入日期类型的值
INSERT INTO order_master VALUES('o001','12-4月-08','V002','25-4月-08');
INSERT INTO my_table(date_col) VALUES(TO_DATE('2008-04-18','YYYY-MM-DD'));
插入来自其它表中的记录
语法:
INSERT INTO [(cloumn_list)]
SELECT column_names FROM ;
eg:
INSERT INTO newvendor_master SELECT * FROM vendor_master;
INSERT INTO newvendor_master(vencode,venname) SLELECT vencode,venname FROM vendor_master;
事务控制语言
事务的最小的工件单元,作为一个整体进行工作。保证事务的整体成功或失败,称为事务控制。
用于事务控制的语句有:
COMMIT - 提交并结束事务处理
ROLLBACK - 撤销事务中已完成的工作
SAVEPOINT - 标记事务中可以回滚的点
eg:
SQL> UPDATE order_master SET del_date = '30-3月-08' WHERE orderno <= 'o002';
SQL> SAVEPOINT mark1;
SQL> DELETE FROM order_master WHERE orderno = 'o002';
SQL> SAVEPOINT mark2;
SQL> ROLLBACK TO SAVEPOINT mark1;
SQL> COMMIT;
数据控制语言
数据控制语言为用户提供权限控制命令
用于权限控制的命令有:
GRANT - 授予权限
REVOKE - 撤销已授予的权限
eg:
GRANT SELECT ON vendor_master TO accounts WITH GRANT OPTION;
REVOKE SELECT,UPDATE ON order_master FROM MARTIN;
SQL操作符
Oracle支持的SQL操作符分类如下:
算术操作符 ( +, -, *, / )
比较操作符 ( =, !=, <, >, <=, >=, BETWEEN...AND, IN, LIKE, IS NULL )
逻辑操作符 ( AND, OR, NOT )
连接操作符 ( || )
集合操作符 ( UNION, UNION ALL, INTERSECT, MINUS )
INTERSECT 操作符只返回两个查询的公共行
MINUS 操作符返回从第一个查询结果中排除第二个查询中出现的行
eg: SELECT orderno FROM order_master
MINUS
SELECT orderno FROM order_detail;
SQL操作符的优先级从高到低的顺序是:
> 算术操作符 ------ 最高优先级
> 连接操作符
> 比较操作符
> NOT 逻辑操作符
> AND 逻辑操作符
> OR 逻辑操作符 ------ 最低优先级
SQL函数
SQL函数带有一个或多个参数并返回一个值
分类:
单行函数
分组函数
分析函数
单行函数分类
单行函数建于从表中的每一行只返回一个值,可以出现在SELECT子句中和WHERE子句中。
划分:
日期函数
数字函数
字符函数
转换函数
其他函数
日期函数
日期函数对日期值进行运算,并生成日期数据类型或数值类型的结果
日期函数包括:
ADD_MONTHS
MONTHS_BETWEEN
LAST_DAY
ROUND
NEXT_DAY
TRUNC
EXTRACT
字符函数
字符函数接受输入并返回字符或数值
常用函数有:
Initcap(char) select initcap('hello') from dual; Hello
Lower(char) select lower('FUN') from dual; fun
Upper(char) select upper('sun') from dual; SUN
Ltrim(char,set) select ltrim('xyzadams','xyz') from dual; adams
Rtrim(char,set) select rtrim('xyzadams','ams') from dual; xyzad
Translate(char, from, to) select translate('jack', 'j', 'b') from dual; back
Replace(char, searchstring, [rep string]) select replace('jack and jue', 'j', 'bl') from dual; black and blue
Instr(char, m, n) select instr('worldwide', 'd') from dual; 5
Substr(char, m, n) select substr('abcdefg', 3, 2) from dual; cd
Concat(expr1, expr2) select concat('Hello', ' world') from dual; Hello world
其它字符函数:
CHR 和 ASCII
LPAD 和 RPAD
TRIM
LENGTH
DECODE
数字函数
数字函数数字输入并返回数值结果
常用函数:
Abs(n) Select abs(-15) from dual; 15
Ceil(n) Select ceil(44.778) from dual; 45
Cos(n) Select cos(180) from dual; -.5984601
Cosh(n) Select cosh(0) from dual; 1
Floor(n) Select floor(100.2) from dual; 100
Power(m,n) Select power(4,2) from dual; 16
Mod(m,n) Select mod(10,3) from dual; 1
Round(m,n) Select round(100.256,2) from dual; 100.26
Trunc(m,n) Select trunc(100.256,2) from dual; 100.25
Sqrt(n) Select sqrt(4) from dual; 2
Sign(n) Select sign(-30) from dual; -1
转换函数
转换函数将值从一种数据转换为另一种数据类型
常用的转换函数有:
TO_CHAR TO_DATE TO_NUMBER
eg:
SELECT TO_CHAR(sysdate, 'YYYY"年"fmMM"月"fmDD"日" HH24:MI:SS') FROM dual;
SELECT TO_DATE('2008-03-06', 'yyyy-mm-dd') FROM dual;
SELECT TO_NUMBER('100') FROM dual;
其它函数
以下是几个用来转换空值的函数:
NVL NVL2 NULLIF
分组函数
分组函数基于一组行来返回结果,为第一组行返回一个值
包括:
AVG
MIN
MAX
SUM
COUNT
GROUP BY 和 HAVING 子句
GROUP BY 子句
用于将信息划分为更小组
每一组行返回针对该组的单个结果
eg:
SELECT p_category, MAX(itemrate) FROM itemfile GROUP BY p_category;
HAVING 子句
用于指定 GROUP BY 子句检索行的条件
eg:
SELECT p_category, MAX(itemrate) FROM itemfile
GROUP BY p_category
HAVING p_category NOT IN ('accessories');
第三期 锁和表分区
本期目标:
1.理解锁定的概念
2.了解和使用表分区
锁的概念
锁是数据库用来控制共享资源并发访问的机制
锁用于保护正在被修改的数据
直到提交或回滚了事务之后,其他用户才可以更新数据
锁的优点
一致性-一次只允许一个用户修改数据
完整性-为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
并行性-允许多个用户访问同一数据
锁的类型
行级锁
表级锁
行级锁
对正在被修改的行进行锁定,其他用户可以访问除被锁定的行以外的行
行级锁是一种排他锁,防止其他事务修改此行
在使用以下语句时,Oracle会自动应用行级锁:
INSERT
UPDATE
DELETE
SELECT ... FOR UPDATE (该语句允许用户一次锁定多条进行更新)
使用 COMMIT 或 ROLLBACK 语句释放锁
SELECT ... FOR UPDATE 语法:
SELECT ... FOR UPDATE [OF columns] [WAIT n | NOWAIT];
eg:
SQL> SELECT * FROM order_master WHERE vencode=’V002’ FOR UPDATE OF odate, del_date;
SQL> UPDATE order_master SET del_date=’28-8月-05’ WHERE vencode=’V002’;
SQL> COMMIT;
表级锁
锁定整个表,限制其他用户对表的访问
使用命令显示地锁定表,应用表级锁的语法是:
LOCK TABLE table_name IN mode MODE;
表级锁类型
行共享 (ROW SHARE) 禁止排他锁定表
行排他 (ROW EXCLUSIVE) 禁止使用排他锁和共享锁
共享 (SHARE)
锁定表,仅允许其他用户查询表中的行
禁止其他用户插入、更新和删除行
多个用户可以同时在同一个表上应用此锁
共享行排他 (SHARE ROW EXCLUSIVE) 比共享锁更多的限制,禁止使用共享锁及更高的锁
排他 (EXCLUSIVE) 限制最强的表锁,仅允许其他用户查询该表的行,禁止修改和锁定表
死锁
当两个事务相互等待对方释放资源时,就会形成死锁
Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁
表分区
允许用户将一个表分成多个分区
用户可以执行查询,只访问表中的特定分区
将不同的分区存储在不同的磁盘,提高访问性能和安全性
可以独立地备份和恢复每个分区
表分区的类型
范围分区
散列分区
列表分区
复合分区
范围分区
以表中的一个列或一组列的值的范围分区
语法:
PARTITION BY RANGE (column_name)
(
PARTITION part1 VALUES LESS THAN(range1),
PARTITION part2 VALUES LESS THAN(range2),
...
[PARTITION partN VALUES LESS THAN(MAXVALUE)]
);
eg:
CREATE TABLE Sales(
Product_ID varchar2(5),
Sales_Cost number(10)
)
PARTITION BY RANGE (Sales_Cost)
(
PARTITION P1 VALUES LESS THAN(1000),
PARTITION P2 VALUES LESS THAN(2000),
PARTITION P3 VALUES LESS THAN(3000),
PARTITION P4 VALUES LESS THAN(MAXVALUE)
);
散列分区
介绍:
允许用户对不具有逻辑范围的数据进行分区
通过在分区键上执行 HASH 函数决定存储的分区
将数据平均地分布到不同的分区
语法:
PARTITION BY HASH (column_name)
PARTITIONS number_of_partitons;
或
PARTITION BY HASH (column_name)
(
PARTITION part1 [TABLESPACE tbs1],
PARTITION part2 [TABLESPACE tbs2],
...
PARTITION partN [TABLESPACE tbsN]
);
eg:
CREATE TABLE EMPLOYEE(
emp_id NUMBER(4),
emp_name VARCHAR2(14),
emp_address VARCHAR2(15),
department VARCHAR2(10)
)
PARTITION BY HASH (department)
PARTITION 4;
列表分区
允许用户将不相关的数据组织在一起
语法:
PARTITON BY LIST (column_name)
(
PARTITION part1 VALUES (values_list1),
PARTITION part2 VALUES (values_list2),
...
PARTITON partN VALUES (DEFAULT)
);
eg:
CREATE TABLE Employee(
Emp_ID number(4),
Emp_Name varchar2(14),
Emp_Address varchar2(15)
)
PARTITION BY LIST (Emp_Address)
(
PARTITION north VALUES ('芝加哥');
PARTITION west VALUES ('旧金山', '洛杉矶');
PARTITON south VALUES ('亚特兰大', '达拉斯', '休斯顿');
PARTITON east VALUES ('纽约', '波斯顿')
);
复合分区
复合分区是范围分区与散列分区或列表分区的组合
语法:
PARTITON BY RANGE (column_name1)
SUBPARTITION BY HASH (column_name2)
SUBPARTITONS number_of_partitons
(
PARTITON part1 VALUE LESS THAN(rang1),
PARTITON part2 VALUE LESS THAN(rang2),
...
PARTITION partN VALUE LESS THAN(MAXVALUE)
);
eg:
CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2 (5),
SALES_DATE DATE NOT NULL,
SALES_COST NUMBER (10)
)
PARTITION BY RANGE (SALES_DATE)
SUBPARTITION BY HASH (PRODUCT_ID)
SUBPARTITIONS 5
(
PARTITION S1 VALUES LESS THAN (TO_DATE(‘01/4月/2001', 'DD/MON/YYYY')),
PARTITION S2 VALUES LESS THAN (TO_DATE(‘01/7月/2001', 'DD/MON/YYYY')),
PARTITION S3 VALUES LESS THAN (TO_DATE(‘01/9月/2001', 'DD/MON/YYYY')),
PARTITION S4 VALUES LESS THAN (MAXVALUE)
);
操纵已分区的表
在已分区的表中插入数据与操作普通表完全相同,Oracle会自动将数据保存到对应的分区
查询、修改和删除分区表时可以显式指定要操作的分区
> INSERT INTO SALES3 VALUES ('P001', '02-3月-2007', 2000);
INSERT INTO SALES3 VALUES ('P002', '10-5月-2007', 2508);
> SELECT * FROM SALES3 PARTITON(P2);
> DELECT FROM SALES3 PARTITON(P1);
分区表维护操作
分区维护的类型:
计划事件 - 定期删除最旧的分区
非计划事件 - 解决应用程序或系统问题
维护操作:
添加分区——在最后一个分区之后添加新分区
ALTER TABLE SALES ADD PARTITION P4 VALUES LESS THAN(4000);
删除分区——删除一个指定的分区,分区的数据也随之删除
ALTER TABLE SALES DROP PARTITION P4;
截断分区——删除指定分区中的所有记录
ALTER TABLE SALES TRUNCATE PARTITION P3;
合并分区——将范围分区或复合分区的两个相邻分区连接起来
ALTER TABLE SALES MERGE PARTITION S1,S2 INTO PARTITION S2;
拆分分区——将一个大分区中的记录拆分到两个分区中
ALTER TABLE SALES SPLIT PARTITION P2 AT(1500) INTO (PARTITION P21, PARTITION P22);
第四期 数据库对象
本期目标:
1.使用同义词
2.使用序列
3.创建视图
4.创建索引
数据库对象简介
Oracle数据库对象又称模式对象
数据库对象是逻辑结构的集合,最基本的数据库对象是表,其他包括:同义词、序列、视图、索引
同义词
同义词是现有对象的一个别名,好处:
简化SQL语句
隐藏对象的名称和所有者
提供对对象的公共访问
类型:
公有同义词
可被所有的数据库用户访问
CREATE SYNONYM emp FOR SCOTT.emp;
私有同义词
只能在其模式内访问,且不能与当前模式的对象同名
CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp;
创建或替换现有同义词
CREATE OR REPLACE SYNONYM emp_syn FOR SCOTT.emp;
删除同义词
DROP SYNONYM emp;
DROP PUBLIC SYNONYM emp_syn;
序列
序列是用于生成唯一、连续序号的对象
序列可以是升序的,也可以是降序的
使用 CREATE SEQUENCE 语句创建序列
CREATE SEQUENCE toys_seq
START WITH 10
INCREMENT BY 10
MAXVALUE 2000
MINVALUE 10
NOCYCLE
CACHE 10;
可以通过序列的伪列来访问序列的值
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值
eg:
SELECT toys_seq.CURRVAL FROM dual;
更改和删除序列
使用 ALTER SEQUENCE 语句修改序列,不能更改序列的 START WITH 参数
ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE;
使用 DROP SEQUENCE 语句删除序列
DROP SEQUENCE toys_seq;
视图
视图以经过定制的方式显示来自一个或多个表的数据
视图可以视为“虚拟表”或“存储的查询”
创建视图所依据的表称为“基表”
优点:
提供了另外一种级别的表安全性
隐藏了数据的复杂性
简化了用户的SQL命令
隔离基表结构的改变
通过重命名列,从另一个角度提供数据
语法:
CREATE [OR REPLACE] [FORCE] VIEW
view_name [(alias[, alias]...)]
AS select_statement
[WITH CHECK OPTION]
[WITH READ ONLY];
创建视图
使用 WITH CHECK OPTION 选项创建视图
CREATE OR REPLACE VIEW pause_view AS
SELECT * FROM order_master WHERE ostatus='p'
WITH CHECK OPTION CONSTRAINT chk_py;
使用 ORDER BY 子句创建视图
CREATE OR REPLACE VIEW ord_ven AS
SELECT * FROM vendor_master ORDER BY venname;
创建带有错误的视图
CREATE FORCE VIEW ven AS
SELECT * FROM venmaster;
联接视图
CREATE VIEW Stud_sub_view AS
SELECT Studno,Studname,Submrks,Subname
FROM Stud_details,Sub_Ddtails
WHERE Stud_details.Subno = Sub_details.Subno
创建外联接视图
CREATE VIEW ven_ord_outj_view AS
SELECT vm.vencode,venname,orderno,odate,ostatus
FROM vendor_master vm, order_master om
WHERE vm.vencode = om.vencode(+);
SELECT vm.vencode,venname,orderno,odate,ostatus
FROM vendor_master wm LEFT OUTER JOIN order_master om
ON vm.vencode = om.vencode;
视图上的DML语句
在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE
视图上的DML语句有如下限制:
只能修改一个底层的基表
如果修改违反了基表的约束条件,则无法更新视图
如果视图包含连接操作符、DISTINCT关键字、集合操作符、聚合函数或GROUP BY子句,则将无法更新视图
如果视图包含伪列或表达式,则将无法更新视图
视图中的函数
视图中可以使用单行函数、分组函数和表达式
CREATE VIEW item_view AS
SELECT itemcode, LOWER(itemdesc) item_desc
FROM itemfile;
使用DROP VIEW语句删除视图
DROP VIEW toys_view;
索引
索引是与表相关的一个可选结构
用以提高SQL语句执行的性能
减少磁盘I/O
使用 CREATE INDEX 语句创建索引
在逻辑上和物理上都独立于表的数据
Oracle自动维护索引
创建标准索引
CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs;
重建索引
ALTER INDEX item_index REBUILD;
删除索引
DROP INDEX item_index;
唯一索引
唯一索引确保在定义索引的列中没有重复值
Oracle自动在表的主键列上创建唯一索引
使用 CREATE UNIQUE INDEX 语句创建唯一索引
CREATE UNIQUE INDEX item_index ON itemfile(itemcode);
组合索引
组合索引是在表的多个列上创建的索引
索引中列的顺序的任意的
如果SQL语句的WHERE子句中引用了组合索引的所有列或大多数列,则可以提高检索速度
CREATE INDEX comp_index ON itemfile(p_category, itemrate);
获取索引的信息
与索引有关的数据字典视图有:
USER_INDEXS -用户创建的索引的信息
USER_IND_PARTITIONS -用户创建的分区索引的信息
USER_IND_COLUMNS -与索引相关的表列的信息
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
ORDER BY INDEX_NAME,COLUMN_POSITION;