一、关系数据库基础理论
1. 关系模式与基本概念
| 知识点 |
内容 |
| 关系模式定义格式 |
关系名(属性名1, 属性名2, ..., 属性名n) |
| 关系模式五要素 |
①关系名 ②属性名 ③属性类型 ④属性长度 ⑤关键字 |
| 属性特性 |
不可再分(原子性,1NF要求) |
| 候选键 |
由一个或多个其值能唯一标识该关系模式中任何元组的属性组成 |
2. 关系代数运算
五种基本运算
并、差、笛卡尔积、投影、选择
传统集合运算
①笛卡尔积 ②并 ③交 ④差
专门的关系运算
①选择 ②投影 ③连接(含自然连接)
| 运算 |
符号/说明 |
特点 |
| 选择 |
σ_F(R) |
按条件f筛选行 |
| 投影 |
Π(R) |
选择列 |
| 笛卡尔积 |
R×S |
最耗时的运算,结果集最大 |
| 自然连接 |
要求R和S含有共有属性 |
自动按同名属性等值连接 |
运算分类(数学基础)
①关系代数 ②关系演算
3. 函数依赖与范式
| 概念 |
说明 |
| A→B |
属性A和属性B的联系是多对一 |
| 1NF |
属性不可再分 |
| 2NF |
消除非主属性对码的部分函数依赖 |
| 3NF |
消除传递函数依赖 |
二、SQL语言(重点⭐)
1. SQL基本特征
| 特性 |
内容 |
| 语言类型 |
非过程化语言(声明式) |
| 数据库类型 |
关系数据库语言 |
| 三大功能 |
数据定义(DDL)、数据操纵(DML)、数据控制(DCL) |
| 使用方式 |
交互式SQL 和 嵌入式SQL |
2. 数据定义语言(DDL)
-- 创建表
CREATE TABLE student(
NO CHAR(4) NOT NULL,
NAME CHAR(8) NOT NULL,
SEX CHAR(2),
AGE NUMBER(2)
);
-- 删除表中属性(列)
ALTER TABLE S DROP Age;
-- 删除表
DROP TABLE 表名;
表空间与数据文件
| 概念 |
说明 |
| 表空间(Tablespace) |
Oracle中最大的逻辑存储结构 |
| 数据文件 |
物理存储文件,必须隶属于某个表空间;一个表空间可包含多个数据文件 |
| 数据块(Data Block) |
最小的I/O逻辑存储单元 |
-- 创建表空间
CREATE TABLESPACE MYTS
LOGGING
DATAFILE 'c:\oradata\orcl\MYTS01.DBF'
SIZE 100M REUSE
AUTOEXTEND ON NEXT 10M MAXSIZE 300M;
-- 创建表时指定表空间
CREATE TABLE emp(
e_no VARCHAR2(5) PRIMARY KEY,
e_name VARCHAR2(10) NOT NULL,
e_job VARCHAR2(9),
e_sal NUMBER(6),
d_no NUMBER(2) REFERENCES dept(d_no)
) TABLESPACE MYTS;
3. 数据操纵语言(DML)
插入数据
-- 方式1:插入完整记录
INSERT INTO R VALUES(25, '李明', '男', 21, '95031');
-- 方式2:插入指定列
INSERT INTO R(NO, NAME, CLASS) VALUES(30, '郑和', '95031');
修改数据
-- 修改单条记录
UPDATE R SET NAME='王华' WHERE NO=10;
-- 批量修改
UPDATE R SET CLASS='95091' WHERE CLASS='95101';
删除数据
-- 按条件删除
DELETE FROM R WHERE NO=20;
-- 模糊匹配删除(姓"王"的学生)
DELETE FROM R WHERE NAME LIKE '王%';
4. 数据查询语言(DQL) — 核心重点
基础查询结构
SELECT [DISTINCT] 列名
FROM 表名
WHERE 条件
GROUP BY 分组列
HAVING 分组条件
ORDER BY 排序列 [ASC/DESC];
空值判断
使用操作符 IS NULL / IS NOT NULL,不能用 = NULL
SELECT * FROM emp WHERE e_job IS NULL;
多表连接查询
-- 方式1:WHERE连接(传统)
SELECT S.SN, SC.C#, SC.GRADE
FROM S, SC
WHERE S.S# = SC.S#;
-- 方式2:JOIN连接(标准)
SELECT S.SN, SC.C#, SC.GRADE
FROM S JOIN SC ON S.S# = SC.S#;
-- 右外连接
SELECT * FROM emp RIGHT OUTER JOIN dept ON emp.d_no = dept.d_no;
嵌套查询(子查询)
-- 1. 比较子查询:检索比"王华"年龄大的学生
SELECT SN, AGE, SEX FROM S
WHERE AGE > (SELECT AGE FROM S WHERE SN='王华');
-- 2. IN/NOT IN子查询
SELECT S# FROM SC
WHERE C#='C1' AND S# IN (SELECT S# FROM SC WHERE C#='C2');
-- 3. ALL/ANY子查询:检索选修C2课程成绩最高的学生
SELECT S# FROM SC
WHERE C#='C2' AND GRADE >= ALL(
SELECT GRADE FROM SC WHERE C#='C2'
);
-- 4. EXISTS子查询:检索选修了全部课程的学生
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM C
WHERE NOT EXISTS(
SELECT * FROM SC
WHERE S#=S.S# AND C#=C.C#
)
);
聚合查询与分组
-- 统计选修四门以上课程的学生总成绩(不统计不及格)
SELECT S#, SUM(GRADE)
FROM SC
WHERE GRADE >= 60
GROUP BY S#
HAVING COUNT(*) >= 4
ORDER BY 2 DESC; -- 按第二列(总成绩)降序
WHERE vs HAVING 区别:
WHERE:用于分组前的行级筛选
HAVING:用于分组后的结果筛选
范围查询
-- BETWEEN...AND...
SELECT S#, SNAME, AGE FROM S
WHERE AGE BETWEEN 18 AND 20;
-- 等价于:AGE >= 18 AND AGE <= 20
5. 视图(View)
| 知识点 |
内容 |
| 视图本质 |
虚表,从一个或几个基本表导出 |
| 存储内容 |
只存放视图的定义,不存放对应的数据 |
| 主要作用 |
提高数据库系统的安全性 |
| 创建视图 |
CREATE VIEW 视图名 AS SELECT... |
| 修改视图数据 |
UPDATE 视图名 SET...WHERE... |
-- 创建视图示例
CREATE VIEW S_CS_VIEW AS
SELECT SNO, SNAME, SEX
FROM STUDENT
WHERE Sdept='CS';
-- 通过视图修改数据
UPDATE S_CS_VIEW
SET SNAME='王慧平'
WHERE SNAME='王平';
-- 创建多表连接视图
CREATE VIEW datascore_view AS
SELECT SNO 学号, SNAME 姓名, GRADE 成绩
FROM STUDENT, SC, COURSE
WHERE STUDENT.SNO=SC.SNO
AND COURSE.CNO=SC.CNO
AND CNAME='数据库';
6. 索引(Index)
-- 创建复合索引(基于多列)
CREATE INDEX c_index ON student(stuno, sname) TABLESPACE users;
| 索引类型 |
说明 |
| B树索引 |
默认索引类型 |
| 位图索引 |
适合低基数列 |
| 复合索引 |
基于多列的索引 |
| 基于函数的索引 |
基于表达式或函数的索引 |
三、数据库设计
1. 数据库设计六阶段
需求分析 → 概念结构设计 → 逻辑结构设计 → 物理结构设计 → 数据库实施 → 数据库运行和维护
| 阶段 |
主要任务 |
核心产出 |
| 需求分析 |
准确了解与分析用户需求(数据与处理) |
数据字典、数据流图(DFD) |
| 概念结构设计 |
综合、归纳与抽象,形成独立于DBMS的概念模型 |
E-R图 |
| 逻辑结构设计 |
将概念结构转换为某个DBMS支持的数据模型 |
关系模式 |
| 物理结构设计 |
为逻辑数据模型选取最适合应用环境的物理结构 |
存储结构、索引设计 |
| 数据库实施 |
建立数据库、编制调试程序、组织数据入库 |
数据库、应用程序 |
| 运行和维护 |
评价、调整与修改 |
维护文档 |
2. E-R图(实体-联系图)
基本元素
- 矩形:实体
- 椭圆:属性
- 菱形:联系
- 连线:实体与联系之间的连接,标注联系类型(1:1, 1:n, m:n)
E-R图合并冲突(三类)
①属性冲突 ②命名冲突 ③结构冲突
E-R图向关系模型转换规则
| 联系类型 |
转换方法 |
| 1:1联系 |
将一方的主键加入另一方,或独立成关系 |
| 1:n联系 |
将1方的主键加入n方作为外键 |
| m:n联系 |
独立转换为一个关系模式,主键为双方主键的组合 |
示例转换
全局E-R图包含:单位、教师、学生、课程 四个实体
转换结果:
单位(单位名, 电话)
教师(教师号, 姓名, 性别, 职称, 单位名) -- 外键:单位名
课程(课程编号, 课程名, 单位名) -- 外键:单位名
学生(学号, 姓名, 性别, 年龄, 单位名) -- 外键:单位名
讲授(教师号, 课程编号) -- m:n联系
选修(学号, 课程编号) -- m:n联系
3. 数据字典
- 定义:系统中各类数据描述的集合
- 内容:数据项、数据结构、数据流、数据存储、处理过程
- 作用:需求分析阶段建立,是概念设计的基础
四、数据库三级模式结构
| 模式 |
别名 |
描述 |
对应 |
| 外模式 |
子模式/用户模式 |
用户看到和使用的局部数据 |
用户应用 |
| 模式 |
概念模式/逻辑模式 |
数据库中全体数据的全局逻辑结构 |
基本表 |
| 内模式 |
存储模式 |
数据存储结构和存取方式 |
物理存储 |
一个数据库系统中只能有一个数据库模式,但可以有多个外模式。
五、Oracle专项知识(真题试卷)
1. Oracle体系结构
实例(Instance)组成
| 组件 |
说明 |
| 系统全局区 (SGA) |
内存区域,缓存数据和控制信息 |
| 后台进程 |
PMON(进程监控)、DBWR(数据库写入)等 |
注意:控制文件是数据库的物理组成部分,不属于实例。
物理结构三文件
数据文件、控制文件、重做日志文件
逻辑存储结构
表空间(Tablespace) → 段(Segment) → 区(Extent) → 数据块(Data Block)
| 概念 |
说明 |
| 表空间 |
最大的逻辑存储结构 |
| 数据块 |
最小的I/O逻辑存储单元 |
2. 数据库对象详解
序列(Sequence)
| 特性 |
说明 |
| 用途 |
生成唯一数字序列的数据库对象 |
| 存储 |
不占用实际存储空间 |
| 伪列NEXTVAL |
返回序列生成的下一个值 |
| 伪列CURRVAL |
返回序列的当前值 |
重要:必须在首次使用 NEXTVAL 后,才能使用 CURRVAL。
-- 创建序列
CREATE SEQUENCE seq_no
START WITH 10000 -- 起始值
INCREMENT BY 2 -- 步长(可为负数)
MINVALUE 10 -- 最小值
NOCYCLE -- 禁止循环
CACHE 5; -- 预先分配5个序列号
模式(Schema)
一个用户拥有的所有数据库对象的集合。
同义词(Synonym)
对象的别名。创建公共同义词命令:
CREATE PUBLIC SYNONYM synonym_name FOR object_name;
3. PL/SQL编程
程序块结构
DECLARE
-- 声明部分
BEGIN
-- 可执行部分
EXCEPTION
-- 异常处理部分
END;
数据类型存储差异
| 类型 |
存储"test"的实际长度 |
| CHAR(10) |
10字符(固定长度,补空格) |
| VARCHAR2(10) |
4字符(可变长度) |
游标(Cursor)属性
| 属性 |
说明 |
| %ROWCOUNT |
获取受最近一次SQL操作影响的行数 |
-- 游标使用示例
DECLARE
CURSOR sales_cur IS SELECT * FROM salesdetails;
BEGIN
FOR sales_rec IN sales_cur LOOP
IF sales_rec.tsales > sales_rec.asales THEN
DBMS_OUTPUT.PUT_LINE('产品:'||sales_rec.pid||'需提高销售额');
ELSIF sales_rec.tsales = sales_rec.asales THEN
DBMS_OUTPUT.PUT_LINE('产品:'||sales_rec.pid||'已达到销售额');
ELSE
DBMS_OUTPUT.PUT_LINE('产品:'||sales_rec.pid||'销售业绩出色');
END IF;
END LOOP;
END;
异常处理
| 异常类型 |
说明 |
| 预定义异常 VALUE_ERROR |
值转换或大小不匹配错误 |
| 自定义异常 |
需使用 RAISE 语句显式触发 |
DECLARE
empname employee.ename%TYPE;
eno employee.empno%TYPE;
BEGIN
eno := '&employee_number';
SELECT ename INTO empname FROM employee WHERE empno = eno;
DBMS_OUTPUT.PUT_LINE('职员姓名:' || empname);
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('要存储在变量中的值过大');
END;
4. 权限管理
权限类型
| 类型 |
说明 |
| 系统权限 |
系统级控制数据库的存储和使用机制(如连接数据库、创建表空间) |
| 对象权限 |
对象级控制(如表、视图的SELECT、UPDATE权限) |
角色(Role)
具有名称的一组相关权限的组合,用于简化权限管理。
用户与授权
-- 创建用户
CREATE USER user1 IDENTIFIED BY abc;
-- 授予系统权限(WITH ADMIN OPTION允许级联授权)
GRANT CONNECT TO user1 WITH ADMIN OPTION;
-- 授予对象权限(WITH GRANT OPTION允许级联授权)
GRANT SELECT ON scott.emp TO user1 WITH GRANT OPTION;
导出工具(EXP)
导出用户所有对象时,使用参数 OWNER。
撤销信息管理
| 版本 |
管理方式 |
| Oracle 10g以前 |
回滚段 (Rollback Segment) |
| Oracle 10g及以后 |
自动UNDO管理 (Automatic UNDO Management) |
5. 程序化对象(存储过程、函数、触发器、包)
过程/函数参数模式
| 模式 |
说明 |
| IN |
输入参数(默认) |
| OUT |
输出参数,在过程中被赋值 |
| IN OUT |
既可输入又可输出 |
函数(Function)
头部 RETURN 子句用于声明返回值的数据类型。
CREATE OR REPLACE FUNCTION dept_func(p_no IN dept.d_no%TYPE)
RETURN VARCHAR2
IS
v_d_name dept.d_name%TYPE;
BEGIN
SELECT d_name INTO v_d_name FROM dept WHERE d_no = p_no;
RETURN v_d_name;
END dept_func;
程序包(Package)
| 概念 |
说明 |
| 规范中声明的过程/函数 |
公有的,可被外部调用 |
| 规范中未声明的包体过程/函数 |
私有的,只能在包内调用 |
触发器(Trigger)
| 特性 |
说明 |
| 触发事件 |
INSERT, UPDATE, DELETE |
| SELECT查询 |
不会触发DML触发器 |
| 替代触发器(Instead-of) |
定义在视图上,用于替换实际执行的DML语句,直接对基表进行操作 |
-- 级联删除触发器示例
CREATE OR REPLACE TRIGGER del_dept_tri
BEFORE DELETE ON dept
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE d_no = :old.d_no;
END;
/
六、实用命令速查
| 命令 |
功能 |
DESC table_name; |
查看表结构 |
CREATE USER ... IDENTIFIED BY ... |
创建用户 |
CREATE PUBLIC SYNONYM ... |
创建公共同义词 |
GRANT ... TO ... WITH ADMIN OPTION |
授予系统权限(级联) |
GRANT ... ON ... TO ... WITH GRANT OPTION |
授予对象权限(级联) |
七、高频考点速记
| 考点 |
答案/要点 |
| 关系模式属性特性 |
不可再分 |
| 五种基本运算 |
并、差、笛卡尔积、投影、选择 |
| 最耗时的运算 |
笛卡尔积 |
| SQL语言类型 |
非过程化 |
| SQL三大功能 |
数据定义、数据操纵、数据控制 |
| 视图提高什么 |
安全性 |
| 数据库设计六阶段 |
需求分析→概念设计→逻辑设计→物理设计→实施→运行维护 |
| E-R图属于哪个阶段 |
概念设计 |
| 设计关系模式是哪个阶段 |
逻辑设计 |
| 索引设计属于哪个阶段 |
物理设计 |
| m:n联系转换 |
双方主键组合作为新关系的主键 |
| 合并冲突类型 |
属性冲突、命名冲突、结构冲突 |
| Oracle实例组成 |
SGA + 后台进程(不含控制文件) |
| Oracle物理结构三文件 |
数据文件、控制文件、重做日志文件 |
| 序列伪列 |
NEXTVAL、CURRVAL(NEXTVAL先使用) |
| 空值判断 |
IS NULL(不能用= NULL) |
| CHAR vs VARCHAR2 |
CHAR固定长度补空格,VARCHAR2可变长度 |
| GROUP BY vs HAVING |
WHERE过滤行,HAVING过滤分组 |
| 触发器触发事件 |
INSERT/UPDATE/DELETE(SELECT不触发) |
| 程序包私有成员 |
规范中未声明的包体过程/函数 |
| 函数RETURN作用 |
声明返回值的数据类型 |
| 最小I/O单元 |
数据块(Data Block) |
| 最大逻辑存储结构 |
表空间(Tablespace) |
八、易错点提醒
- DELETE vs DROP vs ALTER TABLE DROP:
DELETE删除数据行;DROP删除表结构;ALTER TABLE...DROP删除列
- WHERE vs HAVING:
WHERE过滤行(分组前);HAVING过滤分组(分组后)
- NULL判断:必须使用
IS NULL / IS NOT NULL,绝对不能用= NULL
- GRANT授权:
WITH ADMIN OPTION(系统权限级联)、WITH GRANT OPTION(对象权限级联)
- 序列使用:必须先使用
NEXTVAL,才能使用CURRVAL
- 触发器类型:替代触发器(Instead Of)定义在视图上,用于替换DML操作;SELECT不会触发DML触发器
- CHAR vs VARCHAR2:CHAR是固定长度(补空格),VARCHAR2是可变长度
- 实例 vs 数据库:实例=SGA+后台进程;控制文件属于物理结构,不属于实例
!建议重点掌握SQL查询语句编写、E-R图转换、范式判断和Oracle对象管理这四类大题。