数据库系统概论 - Introduction to Database Systems
复习一下关系代数和 SQL
- 关系代数
- SQL
- 范式
关系代数
传统集合运算
并
差
交
笛卡尔积
专门的关系运算
Notation
设关系模式
表示元组 中属于属性 的分量 - 设属性列表
,则 表示元组 在属性列 上的值 - 若
则 表示 和 的连接,是一个元组 - 给定一个关系
和 是属性列,则 当 时, 在 中的象集定义为 ,表示 中属性列 值为 的诸元组在 上分量的集合
选择 (selection) - where
其中
投影 (projection) - select
其中
连接 (join) - join
- 等值连接
- 自然连接
,选取同名属性列进行比较,并在结果中去除出重复的属性列
两个关系
当连接操作舍弃全部悬浮元组时,称为外连接,记为
除(division)
给定关系
的集合,可以理解为,其中每一个元组 ,其分量 的象集 包含整个 ,也就是当 时,可以在 值(元组)的集合中找到所有 中 值(元组)的集合,相当于是笛卡尔积的逆运算。
SQL
Identifier
标识符(名称)要么用双引号,要么什么都不用
Schema
1 | create schema [<schema name>] authorization <username>; |
未指定
模式名则默认隐含为用户名
1 | drop schema <schema name><CASCADE|RESTRICT>; |
CASCADE和RESTRICT必选其一,CASCADE为级联删除,删除模式时把该模式中所有的数据库对象全部删除。当模式中有数据库对象时,如果选择RESTRICT则会拒绝删除
PostgreSQL中schema和database不相同,而MySQL则认为两者相同
Table
1 | create table <table name> (<column name><data type>[column constraint] |
1 | drop table <table name> [RESTRICT | CASCADE] |
1 | alter table <table name> |
Index
1 | create [unique][cluster]index <index name> |
1 | alter index <old index name> rename to <new index name>; |
1 | drop index <index name>; |
Common Data Types
| 类别 | 数据类型声明 | 含义与说明 | 示例 |
|---|---|---|---|
| 整数类型 | SMALLINT |
2 字节,小范围整数。范围:-32768 到 +32767。 | user_age SMALLINT |
INT 或
INTEGER |
4 字节,标准整数。范围:-2147483648 到 +2147483647。 | product_id INT |
|
BIGINT |
8 字节,大范围整数。范围:-9223372036854775808 到 +9223372036854775807。 | transaction_id BIGINT |
|
| 任意精度数字 | NUMERIC(p, s) |
精确数值类型,p
是总位数,s 是小数位数。用于需要高精度的场景,如货币。 |
price NUMERIC(10, 2) |
| 浮点类型 | REAL |
4 字节,单精度浮点数。不精确,适用于科学计算。 | temperature REAL |
DOUBLE PRECISION |
8 字节,双精度浮点数。精度高于
REAL。 |
distance DOUBLE PRECISION |
|
| 字符类型 | CHAR(n) 或
CHARACTER(n) |
定长字符串,长度为
n。不足时会用空格填充。 |
country_code CHAR(2) |
VARCHAR(n) 或
CHARACTER VARYING(n) |
变长字符串,最大长度为
n。更节省空间。 |
username VARCHAR(50) |
|
TEXT |
无长度限制的变长字符串。 | article_content TEXT |
|
| 二进制类型 | BYTEA |
用于存储二进制数据,如图片、文件等。 | profile_picture BYTEA |
| 日期时间类型 | DATE |
仅存储日期(年-月-日)。 | birth_date DATE |
TIME |
仅存储时间(时:分:秒)。 | start_time TIME |
|
TIMESTAMP |
存储日期和时间。 | login_time TIMESTAMP |
|
TIMESTAMPTZ |
TIMESTAMP WITH TIME ZONE
的缩写。存储带时区信息的日期和时间,会自动转换为数据库时区。 |
event_time TIMESTAMPTZ |
|
| 布尔类型 | BOOLEAN |
存储逻辑值:TRUE(真)、FALSE(假)或
UNKNOWN(未知)。 |
is_active BOOLEAN |
| JSON 类型 | JSON |
存储 JSON 格式的数据。输入时会进行语法检查,但数据以文本形式存储,查询时需要解析。 | config JSON |
JSONB |
JSON Binary 的缩写。将 JSON
数据以二进制形式存储,支持索引,查询性能远高于
JSON。推荐优先使用。 |
user_preferences JSONB |
|
| 数组类型 | type[] |
存储同一类型元素的集合。可以是一维或多维数组。 | tags VARCHAR[],
matrix INT[][] |
| 枚举类型 | ENUM('label1', 'label2', ...) |
存储一个预定义的枚举值列表中的一个。 | status ENUM('pending', 'processing', 'done') |
Select
1 | select [ALL|DISTINCT]<target expression>[alias name][,<target expression>[alias name]]... |
having对每个组进行,where对表进行
Common Query Conditions
| 查询条件类型 | 运算符 (谓词) | 功能 |
|---|---|---|
| 比较运算 | = |
等于 |
!=,
<> |
不等于 | |
> |
大于 | |
< |
小于 | |
>= |
大于等于 | |
<= |
小于等于 | |
| 逻辑运算 | AND |
逻辑与,多个条件必须同时成立 |
OR |
逻辑或,多个条件中只要有一个成立 | |
NOT |
逻辑非,对单个条件取反 | |
| 范围查询 | BETWEEN ... AND ... |
判断值是否在指定的闭区间内 |
NOT BETWEEN ... AND ... |
判断值是否不在指定的闭区间内 | |
| 列表查询 | IN (...) |
判断值是否在指定的列表中 |
NOT IN (...) |
判断值是否不在指定的列表中 | |
| 空值判断 | IS NULL |
判断值是否为 NULL |
IS NOT NULL |
判断值是否不为 NULL | |
| 模式匹配 | LIKE '模式' |
简单字符串匹配(%匹配任意多字符,_匹配单个字符) |
NOT LIKE '模式' |
简单字符串不匹配 | |
SIMILAR TO '模式' |
SQL 标准的正则表达式匹配 | |
~ '正则表达式' |
POSIX 风格的正则表达式匹配 | |
| 存在性判断 | EXISTS (子查询) |
判断子查询是否返回至少一行数据 |
NOT EXISTS (子查询) |
判断子查询是否没有返回任何数据 | |
| ALL/ANY/SOME | > ALL (...) |
大于子查询结果中的所有值 |
< ANY (...) |
小于子查询结果中的任意一个值 | |
= SOME (...) |
等于子查询结果中的任意一个值(与
IN 功能类似) |
Aggregation Functions
| 函数名 | 功能描述 | 使用示例 |
|---|---|---|
COUNT([DISTINCT/ALL]<column name>) |
统计行数或非 NULL 值的数量。 | COUNT(*):统计总行数。COUNT(column_name):统计指定列中非
NULL 值的数量。 |
SUM([DISTINCT/ALL]<column name>) |
计算指定列的总和。 | SUM(price):计算
price 列所有值的总和。 |
AVG([DISTINCT/ALL]<column name>) |
计算指定列的平均值。 | AVG(salary):计算
salary 列的平均值。 |
MAX([DISTINCT/ALL]<column name>) |
找出指定列的最大值。 | MAX(score):找出
score 列的最高分。 |
MIN([DISTINCT/ALL]<column name>) |
找出指定列的最小值。 | MIN(price):找出
price 列的最低价格。 |
Joiened Querying
外连接查询
1 | select <column>[,<column>,...] |
表 1 和表 2 根据连接条件[左/右/全]外连接
内连接查询
1 | select <column>[,<column>,...] |
谓词子查询
1 | select <column>[,<column>,...] |
用于有多值的子查询的条件判断
带有 exists 的谓词子查询
1 | select <column>[,<column>,...] |
- 带有该谓词的子查询只产生逻辑真值 “true” 或 “false”
- 可以利用 exists 来判断
, , , 非空等是否成立
意义在与子查询中依赖于父查询的字段,也可以通过连接查询实现
Set Querying
1 | <select expression1> |
参与集合查询的各查询结果必须每列的数据类型相同
Derived Table Querying
1 | select <column name>[,<column name>,...] |
将子查询 alias 为一张虚表,进行字段选择、条件判断
Insertion
Basic
1 | insert into <table name>[(<attribute1>[,<attribute2>],...)] |
insert into … select
1 | insert into <table name>[(<attribute1>[,<attribute2>],...)] |
select into
1 | select <column name>[,<column name>,...] into <new table name> |
将查询结果建表保存
Updation
1 | update <table name> |
Deletion
1 | delete from <table name> |
View
1 | create view <view name> [(<column name>[,<column name>]...)] |
with check option表示对视图进行update、insert、delete时保证操作后视图满足视图定义中的谓词条件- 对视图的更新最终通过视图消解变为对表的更新
权限控制
Grant
1 | grant <permission>[,<permission>]... |
with grant option表示允许被授权用户二次授权给其他用户,但不允许循环授权,即被授权者不能再把权限授权回授权者或其祖先。
Revoke
1 | revoke <permisison>[,<permission>]... |
若使用了
CASCADE则级联收回授权,否则默认为RESTRICT不收回转授权限
Role
1 | create role <role name>; |
1 | grant <permission>[,<permission>]... |
1 | grant <role1>[,<role2>]... |
with admin option允许被授予角色的用户授予其他用户被授予的角色
1 | revoke <permisison>[,<permission>]... |
Entity integrity
1 | create table <table name>( |
Reference integrity
1 | create table <table name>( |
User Defined Constraint
Column Constraint
- Column Constraint: NOT NULL | UNIQUE
1 | create table <table name>( |
check短语指定列值需要满足指定条件
Tuple Constraint
1 | create table <table name>( |
对元组的约束
Integrity Constraint
1 | create table <table name>( |
1 | alter table <table name> |
1 | alter table <table name> |
基本范式概念
由于
、 与模式设计关系不大,因此下文中把关系模式表示为
函数依赖 (Functional dependency)
定义
给定关系模式
- 若
,则 称为决定因素 - 若
且 则记作 - 若
不函数依赖于 ,则记作
非平凡的函数依赖 (non-trival functional dependency)
映射到非子集
平凡的函数依赖 (trival functional dependency)
映射到子集
完全函数依赖 (full functional dependency)
在
部分函数依赖 (partial functional dependency)
在
传递函数依赖 (transitive functional dependency)
在
码
设
如果
部分函数依赖于 ,即 则 称为超码
范式
1NF
关系模式
2NF
若
3NF
设关系模式
BCNF
关系模式
4NF
多值依赖 (MVD)
定义
给定关系
形式化的,给定关系
- 若
,而 ,则称 是平凡的多值依赖
性质
- 对称性: 若
,则 ,其中 - 传递性:如果
,则 - 函数依赖是特殊的多值依赖,
,则 - 若
,则
定义
关系模式