数据库复习
可以用代数、逻辑等方法描述关系操作,最基本最常用的是代数方法,即关系代数。
关系代数也是一门代数,关系代数包括一个运算集合,这些运算以一个或两个关系作为运算数,产生一个新的关系作为结果。
关系代数运算包含基本关系代数运算、附加关系代数运算和扩展关系代数运算。其中基本关系代数运算包含选择、投影、集合并、集合差、笛卡尔积和更名运算。
选择:选择运算是选出满足给定谓词(条件)的元组,结果关系和原关系有着相同的模式。
选择运算用 $\sigma$ 表示。将谓词写作 $\sigma$ 的右下标,并在 $\sigma$ 后面的括号中给出作为参数的关系名。例如:
就是在students关系表中选出gender属性为none的元组。(hhh)
投影:投影运算用来从给定关系产生一个只有其部分列的新关系。投影运算用 $\pi$ 表示。所有希望在结果关系中出现的属性作为右下标,作为参数的关系名紧跟在 $\pi$ 后面的括号中。结果关系的模式是 $\pi$ 的下标中列出的所有属性,并按 $\pi$ 下标中列出的顺序出现。例如:
于是结果关系中只包含id和age两个属性,并且会去掉结果关系中重复的元组。
⚠️ 关系代数把表看作是作为元组集合的关系,既然是集合,就不包括重复元组,也就是说,关系代数每个运算都是去重的。
并运算:关系是相容的。两个关系必须是同元的,即它们所包含的属性个数必须相同;两个关系对应属性的域必须相同或相容。
例如,找出所有已有考生报考又安排了考官组卷的eid:
差运算:用来查询在一个关系中而不在另一个关系中的那些元组,和并运算一样,差运算只能在相容的关系间进行。
例如,找出所有已有考生报考但没有安排考官组卷的eid:
笛卡尔积运算:结果关系的模式是参与运算的两个关系的模式的串接。运算符左侧关系中的每一个元组与右侧关系的每一个元组拼接,形成结果关系中的一个元组。
⚠️ 元组的拼接
更名:对给定的关系代数表达式E,表达式 $\rho_X(E)$ 返回表达式E的结果,并把名字X赋给了它。
如果关系代数表达式E是n元的,则表达式 $\rho_{X(A_1,A_2,…,A_n)}(E)$ 返回表达式E的结果,并赋给它名字X,同时将E的各属性更名为 $A_1,A_2,…,A_n$。
关系运算的运算参数是关系,运算结果也是关系。
查询历史学院的考生的姓名:
关系代数基本运算是完备的,足以表达任何普通的关系代数查询。但是许多查询的表达式复杂、冗长,因此定义附加运算,简化一些查询的表达。
常见的附加运算有:集合交、自然联接、属性联接、条件联接和赋值运算。
集合交:集合交运算的结果是由那些同时在参与运算关系中存在的元组组成,只能在相容的关系间进行,用 $\bigcap$ 表示。
自然联接:可以将特定选择运算和笛卡尔积合并为一个运算。首先计算笛卡尔积,然后在笛卡尔积的结果上,基于两个关系模式中都出现的属性,即两个关系模式的所有同名属性进行属性值相等的选择运算,最后去掉重复列。也就是结果关系模式中相同的属性只保留一列,因为在任何元组中同名属性的值都是相等的。
例如:
examinee表:
eeid | eename | dname |
---|---|---|
123 | A | 历史 |
234 | B | 心理 |
345 | C | 教育 |
department表:
dname | dloca | dtele |
---|---|---|
历史 | 46-A | 444 |
教育 | 45-B | 555 |
心理 | 44-C | 666 |
先算笛卡尔积:
examinee.eeid | examinee.eename | examinee.dname | department.dname | department.dloca | department.dtele |
---|---|---|---|---|---|
123 | A | 历史 | 历史 | 46-A | 444 |
123 | A | 历史 | 教育 | 45-B | 555 |
123 | A | 历史 | 心理 | 44-C | 666 |
234 | B | 心理 | 历史 | 46-A | 444 |
234 | B | 心理 | 教育 | 45-B | 555 |
234 | B | 心理 | 心理 | 44-C | 666 |
345 | C | 教育 | 历史 | 46-A | 444 |
345 | C | 教育 | 教育 | 45-B | 555 |
345 | C | 教育 | 心理 | 44-C | 666 |
选择examinee.dname和department.dname相同的元组,最终选出了3组,将examinee.dname和department.dname属性合并后,成为了结果关系。
属性联接:首先计算笛卡尔积,然后在笛卡尔积的结果上,基于两个关系模式中都出现的属性,即两个关系模式的指定同名属性进行属性值相等的选择运算,最后去掉重复列。指定同名属性只保留一个。
自然联接用 $S1 \infty S2$ 表示,属性联接用 $S1 \infty_{attribute} S2$ 表示。
例如指定了属性name,那么联接时就只看S1.name和S2.name相等的元组。
因此区别就是,当参与联接运算的两个表有多个同名列时,自然联接的匹配条件是所有同名列全部取值相等,而属性联接的匹配条件是指定其中的某些同名列取值相等。
赋值:赋值运算是将 $\leftarrow$ 右侧的表达式结果赋给其左侧的关系变量,该关系变量可以在后续的表达式中使用。
例如:从A中去除属性X
关系代数运算的进一步扩充:
广义投影:允许将算术运算作为投影的一部分
聚集:例如计算给定集合元素的总和、平均值等
外联接:使得关系代数表达式可以处理缺失信息
广义投影:允许在投影列表中使用算术表达式。
例如 $\pi_{F_1,F_2,…,F_n}(E)$ 中,E是任意关系代数表达式,$F_1,F_2,…,F_n$ 中的每一个都是涉及E的属性的算术表达式,也可以仅仅是单个属性或常量。
广义投影的结果是对关系表达式t的每一行分别计算 $F_1,F_2,…,F_n$,
聚集函数:sum, avg, count, max, min等。
例如:
查询结果只包含一个元组,只有单个属性。
还可以这样:
意思是说对元组按dname进行分组。
有些元组不能跟另外关系的任何一个元组匹配,一些实际应用系统可能希望在结果中保留悬浮元组,这就有了外联接运算。
不考虑悬浮元组的自然联接、属性联接和条件联接都属于内联接。
外联接:首先计算内联接,然后加入左侧关系、右侧关系、两侧关系中的悬浮元组,对应称为左外联接(L)、右外联接(R)、全外联接(F)。表示方法:$\infty^R$.
E-R图
实体用方框表示。
联系用菱形表示。
实体和实体集统称实体。
实体通常使用属性来描述。同类实体通常使用相同的属性组来描述。
属性可能取值的范围成为属性域
现实生活中经常需要区分同类实体集中一个个不同的实体。例如在考生实体集中,由于可能出现同名同姓的考生,所以用考号来区分。
能够并且用以区分一个实体集中不同实体的最小属性集称为标识符或主键,组成主键的属性称为标识属性。
属性用椭圆表示。
联系也有属性!
用线段将属性与其相对应的联系或实体连接起来。
并在那些用于标识实体或联系的属性下面加上下划线
2021/5/16 add
候选码(candidate key) / 候选键
关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称为候选码。
关系中可以有多组候选码,例如:
1 | Student(S#, Sname, Sage, Sclass, Saddress) |
S#是候选码,(Sname, Saddress)也是候选码。
1 | Employee(EmpID, EmpName, MobileNumber) |
EmpID是候选码,MobileNumber也是候选码。
主码(primary key) / 主键
当有多个候选码时,可以选定一个作为主码。
DBMS以主码为主要线索管理关系中的各个元组。
例如可以选定属性 S# 作为 Student 表的主码,也可以选定属性组 (Sname, Saddress) 作为 Student 表的主码。
主属性和非主属性
包含在任何一个候选码中的属性被称作主属性,而其他属性被称作非主属性。
最简单的,候选码只包含一个属性。
最极端的,所有属性构成这个关系的候选码,称为全码(all-key)。
外码(foreign key) / 外键
关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
例如”合同”关系中的”客户号”不是候选码,但却是外码,因为它与”客户”关系中的候选码”客户号”相对应。
两个关系是通过外键连接起来的。
关系模型的完整性
实体完整性
关系的主码中的属性值不能为空值。
空值:不知道或无意义的值。
意义:关系中的元组对应到现实世界相互之间可区分的一个个个体,这些个体是通过主码来唯一标识的;若主码为空,则出现不可标识的个体,这是不允许的。
参照完整性
如果关系R1的外码Fk与关系R2的主码Pk相对应,则R1中的每一个元组的Fk值或者等于R2中某个元组的Pk值,或者为空值。
意义:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在。
用户自定义完整性
用户针对具体的应用环境定义的完整性约束条件。
例如,S# 要求是10位整数,性别只能是男或女,年龄只能在12到35岁之间。
DBMS对关系完整性的支持
实体完整性和参照完整性由DBMS系统自动支持。
DBMS系统通常提供了如下机制:
- 它使用户可以自行定义有关的完整性约束条件
- 当有更新操作发生时,DBMS将自动按照完整性约束条件检验更新操作的正确性,即是否符合用户自定义的完整性。
关系代数
并相容性
某些关系代数操作,如并、差、交等,需要满足”并相容性”。
参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性。
定义:关系R与关系S存在相容性,当且仅当:
- 关系R和关系S的属性数目必须相同;
- 对于任意 i,关系R的第 i 个属性的域必须和关系S的第 i 个属性的域相同。
例如:
1 | Student(SID char(10), Sname char(8), Age char(3)) |
并操作(Union)
定义:假设关系R和关系S是并相容的,则关系R与关系S的并运算结果也是一个关系,记作:$R \cup S$,它由或者出现在关系R中,或者出现在S中的元组构成。
并运算是将两个关系的元组合并成一个关系,在合并时去掉重复的元组。
theta-join
投影与选择操作只是对单个关系(表)进行操作,而实际应用中往往涉及多个表之间的操作,这就需要theta-连接操作。
数据库完整性
数据库完整性(DB Integrity)是指DBMS应保证的DB的一种特性——在任何情况下的正确性、有效性和一致性。
游标
游标是指向某检索记录集的指针。
通过这个指针的移动,每次读一行处理一行,直至处理完毕。
第一范式 1NF
若关系模式R(U)中关系的每个分量都是不可分的数据项,则称R(U)属于第一范式.
1 | Star(name, address(street, city)) |
Star不属于1NF,因为属性address仍包含了street, city两个属性,其分量不是原子。
不符合1NF的处理
将非1NF转换为1NF:
1 | Star(name, address(street, city)) |
第二范式 2NF
若R(U)是1NF且U中的每一非主属性完全函数依赖于候选键,则称R(U)属于第二范式。
1 | R(S#, , SD, , G) |
第二范式消除了非主属性对候选键的部分依赖。
第三范式 3NF
第三范式是确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性。 如果一个关系满足第二范式,并且除了主键以外的其他列都依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式。
第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系。也就是说,对于一个满足2nd NF 的数据结构来说,表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。
关系模式R 中若不存在这样的码X、属性组Y及非主属性Z(Z (强制依赖)Y),使得X→Y,Y→Z,成立,Y→X不成立,则称R ∈ 3NF。
若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
如果R∈3NF,则R也是2NF。
采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。
SQL
SELECT INTO
SELECT INTO
语句从一个表中选取数据,然后把数据插入另一个表中。
常用于创建表的备份复件或者用于对记录进行存档。
1 | SELECT * INTO new_table_name [IN externaldatabase] FROM old_database |
或者只把需要的列插入新表:
1 | SELECT column_name(s) |
AUTO INCREMENT
AUTO INCREMENT
(自动增长)语句会在新纪录插入表时生成一个唯一的数字。PostgreSQL使用序列来标识字段的自增长,数据类型有smallserial, serial和bigserial。
使用AUTO INCREMENT
的原因:我们通常希望在每次插入新纪录时,自动地创建主键字段的值。因此我们可以在表中创建一个AUTO INCREMENT
字段。
伪类型 | 存储大小 | 范围 |
---|---|---|
SMALLSERIAL |
2字节 | 1 到 32,767 |
SERIAL |
4字节 | 1 到 2,147,483,647 |
BIGSERIAL |
8字节 | 1 到 922,337,2036,854,775,807 |
SERIAL数据类型的基础语法:
1 | CREATE TABLE tablename( |
假定我们要创建一张 COMPANY 表,并创建下面几个字段:
1 | runoobdb=# CREATE TABLE COMPANY( |
现在往表中插入几条记录:
1 | INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) |
查看 COMPANY 表的记录如下:
1 | id | name | age | address | salary |
触发器
触发器是一种由事件自动触发执行的特殊存储过程,这些事件可以是对一个表进行 INSERT、UPDATE、DELETE 等操作。
触发器经常用于加强数据的完整性约束和业务规则上的约束等。
在SQL内部把触发器看作是存储过程但是不能传递参数。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行。
在SQL Server里就是对一个表的一定操作触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
SQL Server提供了两种触发器:Instead of和After触发器。
这两种触发器的差别在于它们
- Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of触发器也可以用于视图,用来扩展视图可以支持的更新操作。
- After触发器在一个INSERT, UPDATE或DELETE语句之后执行,约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。
触发器的执行过程:如果一个INSERT, UPDATE或DELETE语句违反了约束,那么After触发器不会执行,因为对约束的检查是在After触发器被激活之前发生的。所以After触发器不能超越约束。
- Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立、其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。
触发器创建语法
1 | CREATE [ CONSTRAINT ] TRIGGER name |
Concurrency Control
The general process of assuring that transactions preserve consistency when executing simultaneously is called concurrency control.
The scheduler takes read/write requests from transactions and either executes them in buffers or delays them.
lec01
数据库是:长期存储在计算机内、有组织的、可共享的数据的集合。
数据库管理系统:DBMS是位于用户和操作系统之间的一层数据管理软件。
- DBMS是系统软件
- DBMS是大型复杂的软件系统
数据库系统DBS (database system)是针对某种应用开发的信息管理系统 (IMS, information management system)。
DBS的构成:数据库、DBMS、数据库管理员(DBA)、应用程序
DBMS的诞生——三大标志性事件:
- IMS系统——1966,层次数据模型
- DBTG报告——1969,网状数据模型
- Codd发表论文——1970,关系数据模型
A data model is a notation for describing data or information. It consists of 3 parts: structure, operations, constraints on the data.
Important data models: Relational model (object-relational extensions), Graph data model (RDF).
Other data models: Hierarchical data model, Network data model, XML data model, object-oriented model
Relational Model in Brief
- structure
- operations: relational algebra, table-oriented
- constraints
Graph Model in Brief
RDF三元组
Relations: 2-dimensional table
Attributes: the column names of a relation, describing the meaning of entries in the column
Schemas: relation name and its attributes. The schema for relation Movies is: Movie(title, year, length, genre)
.
Relational database schema: the set of schemas for the relations of a database
Tuples: a row of relation. A tuple has one component for each attribute. e.g., (Gone With the Wind, 1939, 231 drama)
.
Domains: a particular elementary type. Associated with each attribute of a relation. e.g., Movies(title:string, year:integer, length:integer, genre: string)
Key: a set of attributes of a relation.
SQL: the principal language used to describe and manipulate relational databases.
Two aspects of SQL:
- DDL(Data-Definition Language), declaring database schemas
- DML(Data-Manipulation Language), querying and modifying database
Data Types
1 | CHAR(n) |
Relational Algebra
Data-manipulation aspect of the relational model
- querying the data
- modifying the data
An algebra on relations: input and output are all relations
Set Operations
1 | -- Union |
Projection
to avoid duplicate tuples, use DISTINCT
.
1 | SELECT DISTINCT genre FROM Movies; |
Selection
1 | SELECT name FROM Movies WHERE length >= 100; |
Cartesian Product
1 | SELECT * FROM R CROSS JOIN S; |
Natural Joins
1 | SELECT * FROM R NATURAL JOIN S; |
Dangling tuple: a tuple fails to pair with any tuple of the other relation in a join
使用自然连接NATURAL JOIN
时,两表中同名的字段不能超过一个;如果超过了1个,就用INNER JOIN
.
Theta Join
1 | SELECT * FROM U INNER JOIN V WHERE A < D; |
1 | SELECT * FROM U INNER JOIN V WHERE A < D AND U.B <> V.B; |
Renaming
Use ESCAPE
to define a escape character:
1 | SELECT titles FROM Movies WHERE titles LIKE 'x%%x%' ESCAPE 'x'; |
NULL
1 | SELECT titles FROM Movies WHERE name IS NOT NULL; |
ORDER BY <list of attributes>
The order is by default ascending
Use key words DESC and ASC
1 | SELECT * |
All the atrributes of Movies are available at the time of sorting, even if they are not part of the SELECT clause.
1 | SELECT s1.n, s2.n FROM Star s1, Star s2 WHERE s1.a = s2.a AND s1.n < s2.n; |
Subquery
EXISTS R
is a condition that is true if and only if R is not empty.
S IN R
is true if and only if S is equal to one of the values in R.
S < ALL R
is true if and only if S is greater than every value in unary relation R.
S <> ALL R
is the same as S NOT IN R
S > ANY R
is true if and only if S is greater than at least one value in unary relation R.
S = ANY R
is the same as S IN R
Five Aggregation Operators
1 | AVG |
1 | SELECT |
Two rules about HAVING clauses
An aggregation in a HAVING clause applies only to the tuples of the group being tested
Any attribute of relations in the FROM clause may be aggregated in the HAVING clause, but only those attributes that are in the GROUP BY list may appear unaggregated in the HAVING clause
The same rule as for the SELECT clause
INSERT INTO table_name WHERE conditions;
DELETE FROM table_name WHERE conditions;
Delete all tuples in a relation: DELETE FROM table_name;
UPDATE R SET a=19 WHERE a<b;
inner join是内连接,显示符合连接条件的记录
语法如下:
select select_list from table1 inner join tabl2 on table1.column1=table2.column1
natural join是对两张表中字段名和数据类型都相同的字段进行等值连接,并返回符合条件的结果 。
natural join是自然连接,自动对两个表按照同名的列进行内连接语法如下:
select select_list from table1 natural join tabl2
使用自然连接要注意,两个表同名的列不能超过1个。
natural join:指明了两表进行自然连接,并且连接是基于两表中所有同名字段的。
join…using:用于两表有同名字段但数据类型不同,或者使用多个同名字段中的某一个做等值连接
join…on :最为灵活,可以指明连接的条件。
设K为R(U)中的属性或属性集合,若K完全函数决定U,则K是R(U)上的后候选键。
可选任意候选键作为R的主键。
包含在任一候选键中的属性称为主属性,其他属性称为非主属性。
完全函数依赖
{学号,课号}—>成绩
学号+课号 可以决定 成绩 但只有学号or只有课号无法决定成绩
部分函数依赖
{学号,课号}—>姓名
只有学号就能决定姓名 (课号是冗余的)
候选键:最小性、唯一性
外键:不是此关系的候选键,但是是另一个关系的候选键。
本文作者 : preccrep
原文链接 : https://preccrep.github.io/2021/04/07/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%8D%E4%B9%A0/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!