《数据库》期中复习
只有两个重点:SQL语句和抽象地描述一个数据库。
第二章 关系数据模型
数据模型是用于描述数据或信息的标记,由数据结构、数据操作和数据上的约束条件组成。
一个关系的列被称为属性 attribute,关系名和其属性的集合称为关系的模式 schema,关系的每一行称为元组 tuple,元组的每个分量所属的类型称为域 domain,一个给定关系中的一个元组的集合叫做关系的一个实例 instance。
键 key是关系的一组属性组成的集合,通过键的定义,可以保证一个关系实例中在这组属性上的元组是唯一的。
(a) 考虑三个元组的全排列为 \(3!\) 三个属性的全排列为 \(3!\) 答案为 \(3!*3!=36\)
(b) 略
(c) 容易证明答案 \(n!m!\) 如果考虑元组出现重复情况,每种元组的个数为 \(a_1, a_2, ..., a_k\) 答案应该是 \(\frac{n!m!}{a_1!a_2!...a_k!}\)
SQL 支持的数据类型包括:
-
可变长度字符串
VARCHAR(n)
,表示最多可有n
个字符的字符串;固定长度字符串CHAR(n)
,表示恒定有n
个字符的字符串。 -
位串
BIT(n)
,表示恒定有n
个比特的串;可变位串BIT VARYING(n)
,表示最多有n
个比特的串。 -
逻辑类型
BOOLEAN
,可取值为TRUE
、FALSE
或UNKNOWN
。 -
整数类型
INT
,SHORTINT
。 -
浮点类型
FLOAT
,DOUBLE
,表示浮点数;高精度的浮点类型DOUBLE PRECISION
;指定小数点后位数的DECIMAL(n, d)
,表示有n
位有效数字,小数点在右数第d
位。 -
日期和时间类型
DATE
,TIME
;为了区分日期和字符串类型,往往需要额外添加DATE
关键字,比如DATE '2020-10-19'
表示一个日期。
简单的表定义如下:
CREATE TABLE <relation name>
(
<attribute name> <data type>,
...
<attribute name> <data type>
);
删除某个关系:
DROP TABLE <relation name>;
修改关系中的某个属性(增加新的属性或者删除原有属性):
ALTER TABLE <relation name>
ADD <attribute name> <data type>;
ALTER TABLE <relation name>
DROP COLUMN <attribute name>; -- MySQL 中使用 DROP COLUMN
为了避免用 NULL
填充默认值,可以在创建表或者增加新的属性的时候指定默认值:
CREATE TABLE <relation name>
(
<attribute name> <data type> DEFAULT <default value>,
...
<attribute name> <data type> DEFAULT <default value>
);
ALTER TABLE <relation name>
ADD <attribute name> <data type> DEFAULT <default value>;
有两种方式为关系指定键:PRIMARY KEY
和 UNIQUE
。PRIMARY KEY
指定的属性 S 不能有 NULL
值,但是 UNIQUE
可以允许 NULL
值。
CREATE TABLE <relation name>
(
<attribute name> <data type> PRIMARY KEY,
...
<attribute name> <data type> UNIQUE
);
(d) 答案如下:
CREATE TABLE Printer(
model VARCHAR(10) PRIMARY KEY,
color BOOLEAN,
type VARCHAR(10),
price DECIMAL(10, 2)
)
(e) 答案如下:
ALTER TABLE Printer
DROP COLUMN color;
(f) 答案如下:
ALTER TABLE Laptop
ADD od VARCHAR(10) DEFAULT 'none';
在关系上定义并、交、补运算:R 和 S 是具有同样属性集合的表,同时 R 和 S 的各个属性的域也必须匹配且有相同的顺序。
-
并运算:\(R \cup S\),包含 R 和 S 中的所有元组。
-
交运算:\(R \cap S\),包含 R 和 S 中共有的元组。
-
差运算:\(R - S\),包含 R 中但不在 S 中的元组。
投影操作用来从关系 R 生成一个新的关系,这个关系只包含 R 中的一部分属性。投影操作的结果是一个关系,其模式是 R 的属性的一个子集。
\[\pi_{A_1, A_2, ..., A_n}(R) \]选择操作用来从关系 R 中选择出满足某个条件的元组。选择操作的结果是一个关系(元组的集合),其模式是 R 的模式。
\[\sigma_{condition}(R) \]笛卡尔积接受两个关系作为输入,生成一个新的关系,其模式是输入关系的元组的集合的笛卡尔积。
\[R \times S \]自然连接是一种特殊的连接操作,它是在两个关系的笛卡尔积上应用选择操作,选择那些在两个关系的公共属性上取值相等的元组。如果一个元组不能和另一个关系中的任何元组匹配,那么这个元组被称为悬浮元组 dangling tuple。
\[R \bowtie S \]\(\theta\) 连接是一种连接操作,它是在两个关系的笛卡尔积上应用选择操作,选择那些满足某个条件的元组。当条件是在两个关系的公共属性上取值相等时,\(\theta\) 连接和自然连接是等价的。
\[R \bowtie_{condition} S \]有一个很有意思的等价关系可以连接笛卡尔积和自然连接:
定义条件 \(c\) 为 \(R.A = S.A \land R.B = S.B \land ...\),\(L\) 是在关系 \(R\) 和 \(S\) 中不在 \(R\) 和 \(S\) 的属性上的属性的集合,那么:
\[R \bowtie S = \pi_L (\sigma_c(R \times S)) \]重命名操作是为关系的属性或者关系本身指定一个新的名字。重命名操作的结果是一个新的关系,其模式是原来的模式,但是属性名或者关系名被替换为新的名字。
\[\rho_{newname}(attrname1, attrname2, ...)(R) \](a)
\(\pi_{model}(\sigma_{speed >= 3.00}(PC))\)
(b)
\(\pi_{maker}(\sigma_{hd >= 100}(Product \bowtie Laptop))\)
(f)
\(\pi_{hd}(\sigma_{PC1.model <> PC2.model \text{ AND } PC1.hd = PC2.hd}(\rho_{PC1}(PC) \bowtie \rho_{PC2}(PC)))\)
已经讨论了数据结构和数据操作,接下来讨论数据约束。数据约束是关系数据库中的一种重要机制,用来保证数据的完整性和一致性。
用关系代数表示约束有两种风格:
-
“ R 的值必须为空”的约束,与“R中没有元组”等价,用 \(R = \emptyset\) 表示。
-
“R 的值必须是 S 的子集”的约束,用 \(R \subseteq S\) 表示。
这两种形式是等价的,因为 \(R \subseteq S\) 显然等价于 \(R - S = \emptyset\)。
引用完整性约束 referential integrity constraint 是一种常见的约束,如果关系 R 中的某个属性(A)的值 v,人们希望这个值也是关系 S 中的某个属性(B)的值,那么这个约束就是引用完整性约束。
\[\pi_{A}(R) \subseteq \pi_{B}(S) \]键约束 key constraint 是一种约束,要求关系中的某个属性集合是一个键,这一约束同样可以用关系代数表示。
以上面的练习为例,可以有
\[\sigma_{PC1.model = PC2.model \text{ AND } PC1.hd <> PC2.hd}(\rho_{PC1}(PC) \bowtie \rho_{PC2}(PC)) = \emptyset \]此时,PC 的 model 构成了一个键。
通过上述的方式,我们就找到了一种彻彻底底形式化描述数据库的方法。
\[\pi_{A1, A2, ..., An}(R) - \pi_{A1, A2, ..., An}(S) = \emptyset \]等价于
\[\pi_{A1, A2, ..., An}(R) \subseteq \pi_{A1, A2, ..., An}(S) \] 标签:关系,...,复习,数据库,元组,期中,TABLE,pi,属性 From: https://www.cnblogs.com/sysss-blogs/p/18476060