当前位置:网站首页>Oracle高级数据库复习

Oracle高级数据库复习

2022-06-11 18:01:00 AlbertOS

考试大纲

分章考点

第三章、Oracle数据库系统结构

考3.1 Oracle数据库系统结构概述,知道数据库系统逻辑结构和物理结构的对应关系就好了

图:数据库系统结构内部关系

数据库系统结构图
oracle数据库由数据库DB和数据库管理系统DBMS构成,分别对应数据库的存储结构和软件结构。
存储结构分为物理结构和逻辑存储结构。
逻辑结构分为表空间、段、区、块;物理结构分为数据文件、控制文件、重做日志文件、归档日志文件、初始化参数文件、跟踪文件、告警文件等组成

软件结构即oracle实例包括内存结构与后台进程两部分。

第四章、数据库设计

这个地方必有一道大题,题型如下,记得逻辑结构设计时要考虑系列、索引、视图、存储过程、函数、触发器的设计。

设计步骤:

  1. 数据库的功能分析
  2. 数据库概念结构设计
  3. 数据库逻辑结构设计
    - 表结构设计
    - 序列设计(自增字段的设计)
    - 索引的设计(提高数据的查询效率,建平衡树、复合索引等)
    - 视图的设计(方便查询)
    - 存储过程的设计(简化应用程序开发)
    - 函数的设计
    - 触发器的设计
  4. sql语句的实现

例题:
图书管理系统的设计
图书管理系统的分析:
一个图书管理系统应该包括图书馆内的书籍信息、学生的个人信息、学生的借阅信息、管理员的信息等。
其中学生可以进行借阅、续借、归还和查询书籍等操作;
管理员可以完成书籍和学生的增加,删除和修改以及对学生,借阅、续借、归还的确认。

图书管理系统的概念结构设计:
通过对图书管理系统中的数据及数据处理过程的分析,
抽象出读者(Reader)、书籍(Book)、管理员(Manager)、剃旧书库、图书供应商五个实体,
其ER图如下:

图书管理系统的逻辑结构设计:
1.表结构设计
表1 读者表结构及其约束(Reader)

字段名数据类型长度约束说明
reader_idintPrimary key读者ID
reader_namechar20Not null读者姓名
reader_sexchar2男或女读者性别
contact_wayvarchar20联系方式
classvarchar64所在班级
effective_timevarchar255Not null生效时间
dead_timevarchar255Not null失效时间
defaultvarchar255违约情况
statusint2状态
lend_numint11可借阅天数
max_numint11最大可借阅数
addupint11累计借书

表2 图书表结构及其约束(book)

字段名数据类型长度约束说明
isbnint11primary key图书ID
book_namevarchar255not null图书名
book_cardvarchar255图书类型
authorvarchar255作者
pressvarchar255出版社
first_launch_timevarchar255上架时间
last_launch_timevarchar255下架时间
statusint20或1状态

表3 管理员表结构及其约束(Manager)

字段名数据类型长度约束说明
manager_idint11primary key管理员ID
manager_namevarchar255管理员姓名
contact_wayvarchar255联系方式
remarksvarchar255备注

表4 登记表结构及其约束(manager_book)

字段名数据类型长度约束说明
manager_idint11primary key管理员ID
isbnint11primary key图书ID
registration_timevarchar255登记时间
remarksvarchar255备注

表5 借阅表结构及其约束(reader_book)

字段名数据类型长度约束说明
reader_idintforeign key读者ID
isbnint11foreign key图书ID
borrow_datevarchar255借阅日期
statusint20或1状态(0表示以归还,1表示借阅状态)
return_datevarchar255归还日期
remarksvarchar255备注
  1. 序列的设计
    为了方便读者编号、管理员编号,创建2个序列自动产生相应的编号。
    (1)创建一个名为“reader_SEQ”的序列,用于产生读者编号,起始值为1,步长为1,不缓存,不循环
    (2)创建一个名为“manager_SEQ”的序列,用于产生管理员编号,起始值为1,步长为1,不缓存,不循环

  2. 索引的设计
    为了提高数据的查询效率,需要在适当表的适当列上创建索引
    (1)在reader表的reader_id 列上创建一个名为“reader_id_INDX”的平衡树索引
    (2)在reader表的reader_name 列上创建一个名为“reader_name_INDX”的平衡树索引
    (3)在reader表的status 列上创建一个名为“reader_status_INDX”的平衡树索引
    (4)在book表的isbn 列上创建一个名为“book_isbn_INDX”的平衡树索引
    (5)在book表的book_name 列上创建一个名为“book_name_INDX”的平衡树索引
    (6)在book表的book_card 列上创建一个名为“book_card_INDX”的平衡树索引
    (7)在book表的author 列上创建一个名为“author_INDX”的平衡树索引
    (8)在book表的press 列上创建一个名为“press_INDX”的平衡树索引
    (9)在book表的first_launch_time列、last_launch_time上创建一个名为“launch_time_INDX”的复合索引

  3. 视图的设计
    为了方便查询,定义图书类型的视图和图书状态的视图
    (1)创建一个名为“book_card_view”的视图,用于对应不同的图书类型的图书查询。
    (2)创建一个名为“book_status_view”的视图,用于对应不同的图书状态的图书查询,例如查询正在被借阅的书籍

  4. 存储过程的设计
    为了简化应用程序开发,创建实现特定功能的存储过程
    (1)创建名为“reader_time”,新增读者表时,自动获取当前时间
    (2)创建名为“reader_book_time”,新增借阅表是,自动获取当前时间

  5. 触发器的设计
    为了简化后端程序的操作,为此创建实现特定功能的触发器
    (1)创建名为“addup_auto”的触发器,当新增借阅表数据的时候,自动查询读者ID并增加累计借书字段+1
    (2)创建名为“staus_auto”的触发器,当新增借阅表数据的时候,自动查询图书ID并修改图书状态

图书管理系统的语句实现:
这个部分在下面都会提到,这也是一道必考的大题。


第五章、数据库存储设置与管理

这里主要是表空间和数据文件的建立,要记sql语句,考法如下:

基于人力资源管理系统数据库中的表,完成如下操作:
employees (emp_id, emp_name, sex, birthday, salary, department_id ),
departments(department_id,dep_name,manager_name)
1、创建一个本地管理永久性表空间LRZYTBS1,数据文件位置、名称自定,大小为50M,区采用定制分配方式512K,段采用自动管理方式
答:
CREATE TABLESPACE LRZYTBS1 DATAFILE
‘D:\app\LRZYTBS1.DBF’SIZE 50M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 521K;

表空间的设置与管理(要记sql语句)

表空间是Oracle数据库中是最大逻辑容器,一个表空间包含一个或多个数据文件,表空间是代表着数据文件的位置,数据库的大小从逻辑上看就是由表空间决定的,用户操作数据在逻辑上就是对不同的表空间的操作。

表空间的主要属性:

  1. 表空间类型:
    永久性表空间(permanent tablespace)创建命令为create tablespace
    临时表空间(temp tablespace)创建命令为create temporary tablespace
    撤销表空间(undo tablespace)创建命令为create undo tablespace
  2. 表空间的管理方式:(默认为local方式 , 题目没有特殊说明不需要添加子句)
    字典管理方式 命令为添加子句 extent management dictionnary
    本地管理方式 命令为添加子句 extent management local
  3. 区分配方式:(默认为autoallocate方式,自动分配方式不需要添加子句)
    自动分配方式 命令为添加子句 autoallocate
    定制分配方式 命令为添加子句 uniform size …
  4. 段管理方式:(默认为auto方式,自动管理方式不需要添加子句)
    自动管理方式 命令为添加子句 auto
    手动管理方式 命令为添加子句 segment space management manual

例题:

>创建一个本地管理永久性表空间LRZYTBS1,
>数据文件位置、名称自定,大小为50M,
>区采用定制分配方式512K,段采用自动管理方式。

CREATE TABLESPACE LRZYTBS1 DATAFILE
‘D:\app\LRZYTBS1.DBF’SIZE 50M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 521K;

数据文件的设置与管理(要记sql语句)

创建

创建数据文件就是向表空间添加文件的过程,在创建数据文件的时候,根据数据量的大小确定文件的大小和文件的增长方式。

添加数据文件语句为alter tablespace … add datafile
添加临时数据文件语句为alter tablespace … add tempfile

例题:

>向uses表空间中添加一个大小为10MB的数据文件

ALTER TABLESPACE USERS ADD DATAFILE
‘D:\app\LRZYTBS1.DBF’SIZE 50M;

修改数据文件

数据文件建立之后,改变它们的名称或者位置也可以用sql语句完成
如果要改变的数据文件属于同一表空间,使用alter tablespace … rename datafile … to
如果要改变的数据文件属于多个表空间,使用alter database rename file … to


第六章、数据库对象的创建与管理

这里就考表的创建、分区表的创建,索引、视图、序列的sql语句不考。

表的创建与管理

这个和sql serve的sql语句是一样的

创建表 create table …
数据类型:char、varchar2、number、date等
约束条件:

  • primary key主键
  • unique唯一性约束
  • foreign key外键约束 references 参考
  • not null 非空约束

表参数
tablespace用于指定表存储的表空间
storage用于设置表的存储参数
logging、nologging指明表的创建过程是否写入重做日志文件
cache、nocache指明表中数据是否缓存
noparallel、parallel指明是否允许并行创建表以及随后对表中数据进行并行操作,默认为noparallel

例子
例题可能就是给一个关系让你创建表:

创建数据库
create database personality;
创建管理员表
create table ausertable(
aname varchar2(50) primary key,
apwd varchar2(50) not null
);

创建分区表(sql语句、复合分区表)

分区的概念是新概念,它是将一个巨型表分成若干个独立的组成部分进行存储和管理,每个相对小的、可以独立管理的部分称为原来表的分区,每个分区都有相同的逻辑属性,但物理属性可以不同
(讲通俗点就是一个表太大了,它可能有几百万条数据了这个时候把它放在一个数据文件中就不是很合适了,所以Oracle就提供了分区这个操作,把一个表分到不同的数据文件中存放但是它们还是代表的一个表)

分区方法:

  • 范围分区,例如根据日期分区等 partition by range
  • 列表分区,将特定分区列值的记录保存到特定分区中 partition by list
  • 散列分区,将数据均匀分布到指定的分区中 partition by hash
  • 复合分区,先采用一个分区方法分区后再采用另一种分区方法再分 第二个分区使用subpartition

基本语法是

create table tablename(...)		--创建一个表
partition by range(...)			-- 按照范围分区
( 	partition 范围分区名 values less than(1000)  --低于1000的
	tablespace 表空间名		--分区存放的表空间
)


创建一个分区表

8、创建一个范围-散列复合分区表,
将职工工资低于10000的职工信息按所在部门分别保存在LRZYTBS1和LRZYTBS2表空间中,
将职工工资高于10000低于20000的职工信息按所在部门分别保存在LRZYTBS3和LRZYTBS4表空间中,
其他职工信息保存在LRZYTBS5表空间中。

CREATE TABLE employess_hash(
	emp_id number(4) PRIMARY KEY,
	emp_name varchar2(50),
	sex varchar2(2),
	birthday date,
	salary number(4) check(salary>3000),
	department_id number(2),
	foreign key (depatment_id) references departments(depatment_id)
)
partition by range(salary)
SUBPARTITION BY HASH(department_id)
(
	partition p1 values less than(1000)
		(subpartition p1_su1 tablespace LRZYTBS1,
		subpartition p1_sub2 tablrspace LRZYTBS2),
	partition p2 values less than(2000)
		(subpartition p2_sub1 tablespace LRZYTBS3,
		subpartition p2_sub2 tablespace LRZYTBS4),
	partition p3 values less than(MAXVALUE) tablespace LRZYTB5
);

第八章、数据查询

层次查询

考法和下面那个一样,将一个表中的数据按照记录之间的联系以树状结构的形式显示出来。sql语句和查询一致,主要是有connect by prior这个子句
子句:

select * from *
start with  ..   --层次查询的起始记录
connect by prior.. 	--指定父记录与子记录之间的关系及分支选择条件

例子

54、以树状结构显示所有员工的上下级关系
COL EMPNO FORMAT A30
COL ENAME FORMAT A50


SELECT 1pad(‘ ‘ ,5*LEVEL-1)||emp_id EMPNO,lpad(‘ ‘,5*level-1)||emp_name ENAME
from employees
start with emp_id=1
connect by prior emp_id = mgr;

TOP-N查询

主要子句:

select * from *
where ... --按照什么方式筛查
order by .. -- 按照特定列排序
offset 3 rows --删除前三个元素
fetch first 3 rows with ties -- 从结果中体现前3名
5、查询工资高于本部门平均工资的员工的信息及其部门的平均工资。
select *,avg(salary) from employees 
where salary>(select avg(salary) from employees where employees.department_id = department_id)
GROUP BY department_id

6、查询50号部门中工资排序在3~6名之间的员工信息。
select * 
from employees
where department_id = 50
order by salary desc 
offset 3 rows
fetch 4 rows with ties

39、查询30号部门中工资排序前3名的员工信息
select * 
from employees
where department_id = 30
order by salary desc 
fetch first 3 rows with ties

40、查询所有员工中工资排序在5~10名之间的员工信息
select * 
from employees
order by salary desc 
offset 5 rows
fetch 5 rows with ties

第九章、PL/SQL

主要考作业和实验上的pl/sql语句,
这里我看的别人的博客Oracle中的pl/sql语句

存储过程

存储过程用于执行特定的操作。
具体语法:

-- [] 表示参数列表是可选项
create or replace procedure 存储过程名[(参数列表)] is/as	
-- 这里可以直接声明变量,无需在begin前加上declare声明
begin
-- 具体的存储过程
exception
-- 异常
end 存储过程名;

参数列表由参数类型+参数模式+形参名三个部分组成;
参数模式有IN、OUT、INOUT三种;

  • IN:只能读不能修改这个参数
  • OUT:只能传出,调用时初始值为NULL
  • INOUT:调用的时候实参先传给形参,结束时赋值返回给实参
 基于人力资源管理系统数据库中的表,完成如下任务:
employees (emp_id, emp_name, sex, birthday, salary, department_id ),
departments(department_id,dep_name,manager_name) 

2、创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于 10 号部门, 
则工资增加 140 元;若属于 20 号部门,则工资增加 200 元;若属于 30 号部门,则工资增加250 元;若属于其他部门,则工资增长 300 元。


CREATE or replace procedure p_sxt2(v_empno in emp.empno%type) 
AS
v_deptno emp.deptno%type;
v_sal emp.sal%type;
BEGIN
select deptno into v_deptno from emp where empno = v_empno;
select sal into v_sal from emp where empno = v_empno;
dbms_output.put_line(v_empno || ' 的部门是 ' || v_deptno || ' 修改前的工资是 ' || v_sal);

case v_deptno
when 10 then
update emp set sal = sal + 150 where empno = v_empno;
when 20 then
update emp set sal = sal + 200 where empno = v_empno;
when 30 then
update emp set sal = sal + 250 where empno = v_empno;
else
update emp set sal = sal + 300 where empno = v_empno;
END case;
select sal into v_sal from emp where empno = v_empno;
dbms_output.put_line(v_empno || ' 的部门是 ' || v_deptno || ' 修改后的工资是 ' || v_sal);
commit;
END p_sxt2;

函数

一般形式:

create or replace function function_name (参数列表)
return 参数类型
is / as
	定义变量;	-- 和存储过程一样,不需要使用declare
begin
	执行过程;
	return 定义变量;
end;

PLSQL的函数的返回值是写在前面的,然后在写函数体

1、创建一个函数,以员工号为参数,返回该员工所在部门的平均工资。

CREATE OR REPLACE FUNCTION func_emp_dept_avgsal(
p_empno employees.employee_id%type)
RETURN employee.salary%type
AS
v_sal employees.salary%type;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id=p_empno;
RETURN v_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,’There is not such an employee!);
END func_emp_salary;

这个包的概念和java程序包是一个意思,就是将语句块组织在一起放在一个服务器中(相同文件夹)

一般形式:

create  or replace 包名
as
程序语句块 -- 可能就是函数、存储过程的声明
end;

3、创建一个包,包中包含一个函数和一个过程。函数以部门号为参数,返回该部门员工 
的最高工资;过程以部门号为参数,输出该部门中工资最高的员工名、员工号。

CREATE OR REPLACE PACKAGE pkg_emp
AS
FUNCTION func_dept_maxsal(p_deptmo employees.department_id%TYPE);
PROCEDURE proc_show_emp(p_deptno employees.department_id%TYPE);
END pkg_emp;

触发器

触发器是一种特殊类型的存储过程,不接收任何参数。
触发器分为DML触发器、instead of触发器、系统触发器三种。

  • DML是建立在基本表上的触发器;
  • instead of是建立在视图上的触发器;
  • 系统触发器是建立在系统或模式上的触发器;

语法:

create or replace trigger 触发器名
before|after 事件
on 表名
[for each row]
[when trigger_condition]
declare 变量声明
begin 方法体
exception 异常
end

4、在 employees 表上创建一个触发器,保证每天 8001700 之外的时间禁止对该
表进行 DML 操作。

CREATE or replace trigger trg_secure_dml
before triggering_event 
on employees
for each row
when trigger_condition
BEGIN
IF TO_CHAR (SYSDATE,’HH24;MI’) NOT BETWEEN08:00AND18:00OR
TO_CHAR (SYSDATE,’DY’,’NLS_LANGUAGE=AMERICAN’)IN(‘SAT’,’SUN’)
THEN
RAiSE_APPLICATION_ERROR(-20205,’只能在正常的工作时间内进行改变。’);
END IF
END;

5、在 employees 表上创建一个触发器,保证修改员工工资时,修改后的工资低于部门最 
高工资,同时高于部门的最低工资。

CREATE or replace trigger trg_dml_emp_satlary
AFTER INSERT OR UPDATE OF salary
ON employees
FOR EACH ROW
DECLARE
v_maxsal employees.salary%type;
v_minsal employees.salary%type;
BEGIN
Select max_salary,min_salary INTO v_maxsal,v_minsal FROM jobs
WHERE job_id=:new.job_id;
IF:new.salary NOT BETWEEN v_minsal AND v_maxsal THEN
RAISE_APPLICATION_ERROR(-2000,’The salary is not between||
v_minsal||AND||v_maxsal);
END_IF;
END trg_dml_emp_salary;

   6、在 employees 表上创建一个触发器,当插入新员工时显示新员工的员工号、员工名和部门名。当删除员工时显示被删除员工的员工号、员工名。

CREATE OR REPLACE TRIGGER trg_emp_dml_row
BEFORE INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
BEGIN
IF INSERTING THEN
DEBMS_OUTPUT.PUT_LINE(:new.employee_id||’’||:new.first_name||’’||
:new.last_name);
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE(:old.salary||’’||:new.salary);
ELSE
DBMS_OUTPUT.PUT_LINE(:old.employee_id||’’||:old.first_name||’’||
:old.last_name);
END IF;
END;

第十章 安全管理

  1. 掌握用户的创建管理。
    创建用户:create user test identified by test;
    修改用户密码:alter user test identified by 123456;
  2. 掌握权限的管理:系统权限和对象权限的授予与回收。
    授予权限: grant connect, resource to test;
    收回权限:revoke connect, resource from test;
  3. 掌握角色的管理:掌握常用的系统预定义角色;自定义角色的创建和权限的管理。
    在oracle里面有如下的这么几个角色:
    (1) connect role(连接角色)
    临时用户,特指不需要建表的用户,通常只赋予他们connect role. 这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。拥有connect role 的用户还能够创建表、视图、序列、簇、同义词、回话和其他数据的链。
    (2)resource role(资源角色)
    更可靠和正式的数据库用户可以授予resource role。resource提供给用户另外的权限以创建他们自己的表、序列、过程、触发器、索引和簇)。
    (3) dba role(数据库管理员角色)
    dba role拥有所有的系统权限,包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有
    自定义角色:
    创建角色:create role testRole;
    授权角色:grant select on class to testRole;
    删除角色:drop role testRole;

例:

创建一个用户sina,密码为hello,并给用户授予创建数据库对象的权限,指定默认表空间为LRZYBS1表空间

CREATE USER sina identified
by hello
default tablespace LRZYBS1;

grant create any table to sina;

总结

本博客没有讲Oracle的基础知识点,对于论述题的回答会比较薄弱,童鞋们可以看看书深入了解Oracle数据库的魅力~

论述题:
关系型数据库和非关系型数据库的异同点及优势所在

Oracle数据库的体系结构

原网站

版权声明
本文为[AlbertOS]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Albert_weiku/article/details/124683038