谨编写该 Markdown 来整理一下知识点并把书上一些语言翻译成人类语言[滑稽]
数据模型:对现实世界数据特征的抽象
现实世界 ⇔ \Leftrightarrow ⇔ 信息世界 ⇔ \Leftrightarrow ⇔ 机器世界
具体内容参见 数据库设计
英文 | 名称 | 内涵 |
---|---|---|
Entity | 实体 | 客观存在并可相互区别的事物 |
Attribute | 属性 | 实体所具有的某一特征 |
Key | 码 | 实体唯一标识符 |
Entity Set | 实体集 | 同类型实体合集 |
Relationship | 联系 | 实体间的联系(1-1、1-n、m-n) |
三级模式,两层映像
外模式:用户模式(视图)
⇕ \Updownarrow ⇕ 外模式/模式映像:逻辑独立性,模式改变,外部程序不变
模式:逻辑模式(数据库定义)
⇕ \Updownarrow ⇕ 模式/内模式映像:物理独立性,存储结构修改,模式不变
内模式:存储模式(内在数据管理与组织)
名称 | 定义 |
---|---|
域 | D i D_i Di 相同类型的数据集合 |
笛卡尔积 | D 1 × D 2 … × D n D_1\times D_2\ldots\times D_n D1×D2…×Dn |
基数 | m i m_i mi 域可取值的总数 |
候选码 | 可唯一表示对象的最小属性组 |
关系 | R ( D 1 , D 2 , D 3 , … , D n ) R(D_1,D_2,D_3,\ldots,D_n) R(D1,D2,D3,…,Dn) |
R ( U , D , D O M , [ F ] ) R(U,D,DOM,[F]) R(U,D,DOM,[F]) |
SQL
DCL
用对关系的运算来表达查询
名称 | 英文 | 运算 |
---|---|---|
并 | Union | R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S= \{t\mid t\in R\vee t\in S\} R∪S={t∣t∈R∨t∈S} |
差 | Except | R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S= \{t\mid t\in R\wedge t\notin S\} R−S={t∣t∈R∧t∈/S} |
交 | Intersection | R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S= \{t\mid t\in R\wedge t\in S\} R∩S={t∣t∈R∧t∈S} |
笛卡尔积 | Cartesian Product | R × S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S } R\times S= \{\hat{t_rt_s}\mid t_r\in R\wedge t_s\in S\} R×S={trts^∣tr∈R∧ts∈S} |
名称 | 英文 | 运算 |
---|---|---|
选择 | Selection | σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = t r u e } \sigma_F(R)= \{t\mid t\in R\wedge F(t)=true\} σF(R)={t∣t∈R∧F(t)=true} |
投影 | Projection | Π A ( R ) = { t [ A ] ∣ t ∈ R } \Pi_A(R)= \{t[A]\mid t\in R\} ΠA(R)={t[A]∣t∈R} |
连接 | Join | R ⋈ A θ B S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R\underset{A\theta B}\Join S= \{\hat{t_rt_s}\mid t_r\in R\wedge t_s\in S\wedge t_r[A]\theta t_s[B]\} RAθB⋈S={trts^∣tr∈R∧ts∈S∧tr[A]θts[B]} |
*自然连接 | Natrual Join | R ⋈ S = { t r t s ^ [ U − B ] ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] = t s [ B ] } R\Join S= \{\hat{t_rt_s}[U-B]\mid t_r\in R\wedge t_s\in S\wedge t_r[A]= t_s[B]\} R⋈S={trts^[U−B]∣tr∈R∧ts∈S∧tr[A]=ts[B]} |
除 | Division | R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ⊆ Y x } , Y x 为 x 在 R 中 的 象 集 , x = t r [ X ] R\div S= \{t_r[X]\mid t_r\in R \wedge\Pi_Y(S)\subseteq Y_x\}, Y_x为x在R中的象集,x=t_r[X] R÷S={tr[X]∣tr∈R∧ΠY(S)⊆Yx},Yx为x在R中的象集,x=tr[X] |
下面简述一下它和SQL语句的对应关系:
SELECT student.s_id, student.s_name FROM student, student_course
WHERE student.s_id = student_course.sc_s_id AND student_course.sc_score < 60;
Π s _ i d , s _ n a m e ( s t u d e n t ⋈ σ c _ s c o r e < 60 ( s t u d e n t _ c o u r s e ) ) \Pi_{s\_id, s\_name}(student \Join \sigma_{c\_score\lt60}(student\_course)) Πs_id,s_name(student⋈σc_score<60(student_course))
= { t ( 2 ) ∣ ( ∃ s ) ( ∃ s c ) ∧ s t u d e n t ( s ) ∧ s t u d e n t _ c o u r s e ( s c ) ∧ t [ 1 ] = s [ 1 ] ∧ t [ 2 ] = s [ 2 ] ∧ s [ 1 ] = s c [ 1 ] ∧ s c [ 3 ] < 60 } = \{ t^{(2)}\mid (\exist s)(\exist sc)\wedge student(s) \wedge student\_course(sc)\wedge t[1]=s[1]\wedge t[2]=s[2]\wedge s[1]=sc[1]\wedge sc[3]<60\} ={t(2)∣(∃s)(∃sc)∧student(s)∧student_course(sc)∧t[1]=s[1]∧t[2]=s[2]∧s[1]=sc[1]∧sc[3]<60}
创建数据库:
-- 通用
CREATE DATABASE db_name;
-- SQL Server
CREATE DATABASE db_name
ON PRIMARY (
name = db_data_name,
filename = N'fs_db_path',
size = fs_size,
filegrowth = growth_percent
)
LOG ON (
name = db_log_name,
filename = N'fs_log_path'
);
创建表(通用):
CREATE TABLE table_name (
attr_name attr_type [col_restrict],
...
[table_restrict]
);
基础类型 | 数据类型 | 含义 |
---|---|---|
字符串 | CHAR(n) | n个定长字符 |
- | VARCHAR(n) | n个变长字符 |
数值 | INTEGER | 4bytes 整型 |
- | SMALLINT | 2bytes 整型 |
- | BIGINT | 8bytes 整型 |
- | MONEY | 8bytes 2位小数 |
- | BOOLEAN, BIT | 1bytes |
日期时间 | DATETIME | yyyy-mm-dd HH:MM:SS |
- | TIME | HH:MM:SS |
- | DATE | yyyy-mm-dd |
-- 对象表(学生)
CREATE TABLE student (
s_id CHAR(12),
s_dept_id INTEGER,
s_name CHAR(20),
s_sex CHAR(2),
PRIMARY KEY(s_id),
FOREIGN KEY(s_dept_id) REFERENCES department(d_id)
);
--对象表(课程)
CREATE TABLE course (
c_id CHAR(4),
c_name CHAR(40) NOT NULL,
c_pno CHAR(4),
PRIMARY KEY(c_id),
FOREIGN KEY(c_pid) REFERENCES course(c_id)
);
--参照表(学生课程)
CREATE TABLE student_course (
sc_s_id CHAR(12),
sc_c_id CHAR(4),
sc_score INTEGER,
PRIMARY KEY(sc_s_id, sc_c_id),
FOREIGN KEY(sc_s_id) REFERENCES student(s_id),
FOREIGN KEY(sc_c_id) REFERENCES course(c_id)
);
创建模式:
CREATE SCHEMA schema_name AUTHORIZATION user_name
CREATE TABLE ... ();
修改表:
ALTER TABLE table_name
[ADD COLUMN col_name col_type [col_restrict]]
[ADD [table_restrict]]
[DROP COLUMN col_name [RESTRICT|CASCADE]]
[DROP [table_restrict]];
删除表:
DROP TABLE table_name [RESTRICT|CASCADE];
RESTRICT
将检查依赖,违反则不予执行CASCADE
将删除所有依赖列/表DROP
时按照 RESTRICT
准则进行建立索引:
CREATE [UNIQUE|CLUSTERED] INDEX index_name
ON table_name(col_name_1 [ASC|DESC],...);
删除索引:
DROP TABLE index_name;
SELECT [ALL|DISTINCT] des_row,...
FROM table_or_view_name,[table_or_view_name_2,...]|
AS custom_name
WHERE condition
[GROUP BY col_name [HAVING condition_gp]]
[ORDER BY col_name [ASC|DESC]];
ALL
条件表达式:
条件 | 谓词 |
---|---|
逻辑运算符 | AND OR NOT |
比较运算符 | = > < … |
元组 | IN (tuple or subselect) |
范围 | BETWEEN up AND down |
字符正则 | LIKE 'REGEXP' |
空值判定 | IS NULL |
ESCAPE
来转义不翻译的字符的标示符
LIKE 'WQL\_YQML' ESCAPE '\'
聚集函数:
函数名 | 功能 |
---|---|
COUNT(*|[DISTINCT|ALL] col_name) |
对列计数 |
SUM([DISTINCT|ALL] col_name) |
求和 |
AVG([DISTINCT|ALL] col_name) |
均值 |
MAX([DISTINCT|ALL] col_name) |
最大值 |
MIN([DISTINCT|ALL] col_name) |
最小值 |
COUNT(*)
均自动跳过空值SELECT
中进行查询HAVING
子句中,做为分组的筛选条件从多张表中 SELECT
列,然后从整体运算的笛卡尔积中使用条件表达式找出符合要求的元组
连接查询的笛卡尔积运算量很大,是一种很智障但写起来很简单的查询方式
SELECT student.s_id FROM student, student_course
WHERE student.s_id = student_course.sc_s_id
SELECT FIRST.c_id. SECOND.c_pid FROM course FIRST, course SECOND
WHERE FIRST.c_pid = SECOND.c_id;
SELECT student.*
FROM course LEFT OUTER JOIN student_course
ON student.s_id = student_course.sc_s_id;
SELECT student.*, course.* FROM student, student_course, course
WHERE student.s_id = student_course.sc_s_id AND
course.c_id = student_course.sc_c_id
多个 SELECT-FROM-WHERE
查询块叠加
SELECT s_name FROM student
WHERE student.s_id IN
(SELECT sc_s_id FROM student_course
WHERE sc_c_id =
(SELECT c_id FROM course
WHERE c_name = '坤学')
);
ORDER BY
[comparation_opetator][ANY|ALL]
来进行筛选使用 EXISTS
来判定候选组是否存在
SELECT s_name FROM student
WHERE EXISTS
(SELECT * FROM student_course
WHERE c_id =
(SELECT c_id FROM course
WHERE c_name = '坤学') AND
student.s_id = student_course.sc_s_id
);
(SELECT * FROM ... WHERE ...)
[UNION|INTERSECT|EXCEPT]
-- 并,交,差
(SELECT * FROM ... WHERE ...)
-- 直接插值
INSERT INTO table_name(col_name_1, col_name_2, ...)
VALUES(value_1, value_2, ...);
-- 插入查询结果
INSERT INTO table_name(col_name_1, col_name_2, ...)
(SELECT ... FROM ... WHERE ...);
UPDATE table_name
SET col_name_1 = expression_1,
col_name_2 = expression_2, ...
WHERE conditions;
DELETE FROM table_name
WHERE conditions;
对应外模式映像,本质为一段查询,为虚表,实时查询实时调用,其数据结果不储存
CREATE VIEW view_name(col_name_1, col_name_2) AS
(SELECT ... FROM ... WHERE)
避免非授权访问、恶意更改
-- 赋予权限
GRANT privilege_name
ON object_type object_name
TO user_name
WITH GRANT OPTION;
object_type | privilege_name |
---|---|
VIEW 或 TABLE |
SELECT /INSERT /UPDATE /DELETE / PREFERENCES /ALL PREVILEGES |
列 | SELECT /INSERT /UPDATE /PREFERENCES /ALL PREVILEGES |
previlege_name(col_name)
,ON
后填写表名GRANT OPTION
将给予用户授权的权限,-- 驳回权限
REVOKE privilege_name
ON object_type object_name
FROM user_name [CASCADE|RESTRICT]
CREATE USER user_name [WITH] [DBA|RESOURCE|CONNECT];
CONNECT
权限 | CREATE USER |
CREATE SCHEMA |
CREATE TABLE |
数据存取修改 |
---|---|---|---|---|
DBA |
✓ \checkmark ✓ | ✓ \checkmark ✓ | ✓ \checkmark ✓ | ✓ \checkmark ✓ |
RESOURCE |
× \times × | × \times × | ✓ \checkmark ✓ | ✓ \checkmark ✓ |
CONNECT |
× \times × | × \times × | × \times × | ✓ \checkmark ✓ 拥有相应权限 |
角色为被命名的权限的集合
-- 创建角色
CREATE ROLE role_name;
-- 授予权限
GRANT privilege_name
ON object_type object_name
TO role_name;
-- 赋予用户角色
GRANT role_names
TO user_1[,user_2,...];
-- 驳回权限
REVOKE privilege_name
ON object_type object_name
FROM role_name;
PRIMARY KEY
不可为空,不可重复CASCADE
级联操作,修改所有相关键NO ACTION
拒绝执行CREATE TABLE student_course (
sc_s_id CHAR(12),
sc_c_id CHAR(4),
sc_score INTEGER,
PRIMARY KEY(sc_s_id, sc_c_id),
FOREIGN KEY(sc_s_id) REFERENCES student(s_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY(sc_c_id) REFERENCES course(c_id)
ON DELETE NO ACTION
ON UPDATE CASCADE,
);
NOT NULL
非空CHECK expression
满足表达式UNIQUE
列值唯一CREATE TABLE student (
s_id CHAR(12),
s_dept_id INTEGER NOT NULL,
s_name CHAR(20) UNIQUE,
s_sex CHAR(2) CHECK s_sex IN ('m','f'),
PRIMARY KEY(s_id),
FOREIGN KEY(s_dept_id) REFERENCES department(d_id)
);
-- 创建断言
CREATE ASSERTION assertion_name
CHECK expression;
-- 移除断言
DROP ASSERTION assertion_name;
-- 语句级
-- 修改后执行
CREATE TRIGGER trig_name
AFTER UPDATE OF col_name ON table_name
REFERENCING OLD ROW AS old_row
NEW ROW AS new_row
FOR EACH STATEMENT
BEGIN
expression;
END;
-- 行级
-- 修改前执行
CREATE TRIGGER trig_name
BEFORE INSERT OR UPDATE ON table_name
REFERENCING NEW ROW AS new_row
FOR EACH ROW
BEGIN
expression;
END;
-- 移除触发器
DROP TRIGGER trig_name;
X → Y X\rightarrow Y X→Y 则X函数确定Y
X → Y X\rightarrow Y X→Y 且其真子集 X 1 ↛ Y X_1\nrightarrow Y X1↛Y,则Y对X完全函数依赖,记作 X → F Y X\xrightarrow{F}Y XFY
若Y不完全函数依赖于X但 X → Y X\rightarrow Y X→Y,则Y对X部分函数依赖,记作 X → P Y X\xrightarrow{P}Y XPY
关系模型满足要求的不同程度
5NF ⊂ \subset ⊂ 4NF ⊂ \subset ⊂ BCNF ⊂ \subset ⊂ 3NF ⊂ \subset ⊂ 2NF ⊂ \subset ⊂ 1NF
对于一个给定的应用环境,构造(设计)优化的数据亏逻辑模式与物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求
构成基本 E-R 图
转化数据模型为逻辑模型
-- 成功执行,提交
BEGIN TRANSACTION;
-- SQL 语句
COMMIT;
-- 发生异常,回滚
BEGIN TRANSACTION;
-- SQL 语句
ROLLBACK;
COMMIT
或ROLLBACK
即属于执行成功事务的特点(ACID特性):
COMMIT
或ROLLBACK
,非预期的,应用程序无法自行处理,使用事务撤销UNDO
来恢复。备份到其他介质,恢复时仅仅可以恢复到备份时的状态:
SQL Server会循环使用一组固定大小的日志文件空间,对其进行分块,并在块写满的位置记录检查点
日志为记录数据库更新操作的文件,内容包含:\
为保证数据可恢复,需要遵循以下两条原则:
事务为并发控制的基本单位
多个事务的并发执行正确 ⇔ \Leftrightarrow ⇔执行结果与按某一次序串行地执行这些任务时相同