日志-2021-4

4月第1周

数据库系统学习

1.初步认识

数据库是电子信息化的集合,是一些相互之间有关联关系的表/数据的集合。“表”是按行按列形式组织及展现的数据。关于表的术语:表名、表标题(格式)、表内容(值)、行/元组/记录、列/字段/属性/数据项。有关系型数据库、非关系型数据库。结构化数据库、非结构化数据库。

数据库系统包括:数据库DB、数据库管理系统DBMS、数据库应用DBAP、数据库应用DBAP、数据库管理员、计算机基本系统。

数据库管理系统DBMS,是管理数据库的软件。

  1. 从用户的角度看,需要进行数据库定义(表的格式)、数据库操作(CRUD)、数据库控制、数据库维护。实现这些,需要数据库语言,如数据定义语言DDL、数据操作语言DML、数据控制语言DCL,通过数据库语言使用DBMS操作数据库。SQL语言还可嵌入到高级语言中,用于开发数据库应用程序DBAP。
  2. 从系统的角度,DBMS是解析数据库语言并执行的系统。例如,在DBMS中,用户输入的DML经查询编译器,通过数据查询执行引擎,来操作数据库。DBMS为管理DB而运行着一系列程序用于:语言编译、查询优化与实现、数据存取与索引、通信、事务处理、各种控制。

2. 标准结构和数据模型

视图View或数据Data,是某一种表现形式下表现出来的数据库中的数据;模式Schema是对数据库中数据所进行的一种结构性描述,是所观察到数据的结构信息。

数据库系统管理数据抽象为三个层次,也就是三个模式:External Level、Conceptual Level、Inernal Level。两层映像是E-C映像(支持数据概念视图向外部视图的转换,便于用户观察和使用)和C-I映像(支持数据概念视图向内部视图的转换,便于计算机存储和处理)。

两个独立性。逻辑数据独立性,当概念模式变化时,可以不改变外部模式(只需修改E-C MAPPING),从而无需改变应用程序;物理数据独立性,当内部模式变化时,可不改变概念模式(只需改变C-I mapping),从而不改变外部模式。

数据模型,(a) 规定模式统一描述方式的模型,包括:数据结构操作约束;(b) 数据模型是对模式本身结构的抽象,模式是对数据本身结构形式的抽象。三大经典数据模型:关系模型、层次模型、网状模型,分别以表、树、图的形式组织数据。

比如关系模型,所有的模式都可以抽象为表的形式,每一个具体的模式都是拥有不同列名的具体的表。该模型对这种表形式(数据结构)具有统一的操作约束。以表组织数据为关系模型,不同的表的格式可以不同,即可以有多种模式。

层次模型中,有实体型(某条记录的结构形式)和系型(连接两个实体型)。网状模型也有实体型和系型。记录和记录间靠指针联系,指针需要用户建立。

Linux命令学习

1. 读取文件内容

stdin/stdout

重定向与管道可以改变stdin和stdout的输入来源和输出对象。

文本文件处理命令,注意:

  • 不指定文件名时,从stdin(键盘)获得数据
  • 指定处理对象名时,从文件中获取
  • 多数命令可指定多个文件(与shell通配符有关)
  • 处理结果在stdout(屏幕)显示

读取文件内容命令:

  • more/less逐屏显示文件。“回车”显示下一行,“空格”显示下一屏,/pattern按正则式查找。less可以向上看。
  • cat/od。cat文本格式打印文件;od逐字节打印 (字符,8进制,10进制,16进制)
  • head和tail显示文件的前半部/后半部,默认10行,更多-ntail -f,实时打印文件尾部被追加内容
  • tee同时存入文件和显示
  • wc字计数,列出文件一共有多少行,多少单词,多少字符。-l只列出行数
  • sort排序,有很多选项。比如**-n**,按数字大小而非字节序排序
  • tr形如tr string1 string2翻译字符,把stdin拷贝到stdout中,用string1替换 string2。
  • uniq筛选文件中的重复行(相邻且相同的行)

2. 正则式概念和相关命令

正则表达式是满足规则的表达式,其功能是描述一个字符串模式,进而有字符串匹配操作和替换操作。文件名通配符用于文件处理,而正则表达式用于文本处理。不同软件对正则表达式定义不同。

有6个特殊字符(元字符). * [ \ ^ $,除此之外的其他字符与自身匹配。\为转义字符,原点·匹配任意单字符。长的正则表达式由单字符正则表达式构成。可以定义集合,如[abcd](这也是单字符正则表达式),元字符在集合中也代表自己。定义一个区间[a-d],或[ad-]。^用在开头表示补集,如[^a-z]匹配任一非小写字母。

单字符串正则表达式组合在一起。*,匹配此单字符正则表达式任意多次。锚点,^$在特殊位置时才有意义,比如^printf匹配行首为printf的字符串。

扩展的正则表达式更为灵活和复杂,一般使用的也是扩展的正则表达式。有ERE:扩展的正则表达式和PCRE: Perl-compatible regular expression。比如(xy)*,匹配任意组xy;可以有逻辑符号,如(hi|hello)匹配hi或hello;+匹配出现一次或多次等。

查看grep的一些规则

1
$ man pcrepattern

3. 行筛选器grep,流编辑sed,行筛选awk

在文件中查找字符串,有众多选项。

1
grep 模式 文件名列表

-n显示行号

1
2
3
4
5
$ grep -n '^int' bits.c
145:int bitXor(int x, int y) {
154:int tmin(void) {
165:int isTmax(int x) {
...

流编辑sed,可以通过正则表达式替换

1
2
3
sed '命令' 文件列表
sed -e '命令1' -e '命令2' -e '命令3' 文件列表
sed -f 命令文件 文件名列表

awk逐行扫描一个文件进行文本处理

1
2
3
awk '程序' 文件名列表
awk -f 程序文件名 文件名列表
# 程序 = 条件 + 动作

条件有关系运算符、逻辑运算符、正则式模式匹配等。动作有算术逻辑运算、流程控制(if、for等)和print等。每一行为一个“记录”,每行被该行的空格分为多个域,$1$2$3等,$0表示整行,NR是该行行号。

1
2
$ ps -ef | awk '/pts/ {printf("%s ", $8);}'
bash bash ps awk
1
2
3
4
5
6
$ ls -s | awk '$1 ~ "[0-9]" && $1 > 8 {print $2}'
bits.c
btest
btest.c
dlc
driver.pl

4. 读取文件内容(附)

1.1 stdin/stdout

重定向与管道可以改变stdin和stdout的输入来源和输出对象。

文本文件处理命令,注意:

  • 不指定文件名时,从stdin(键盘)获得数据
  • 指定处理对象名时,从文件中获取
  • 多数命令可指定多个文件(与shell通配符有关)
  • 处理结果在stdout(屏幕)显示

1.2 more/less

逐屏显示文件。“回车”显示下一行,“空格”显示下一屏,/pattern按正则式查找。less可以向上看。

1.3 cat/od

cat文本格式打印文件

不使用编辑器创建文件,从stdin输入,crtl-d结束。

1
2
3
4
5
6
$ cat > pengye.sh
ls -l
ps -ef
$ cat pengye.sh
ls -l
ps -ef

od逐字节打印 (字符,8进制,10进制,16进制)

1
2
3
$ echo abcd | od -t x1
0000000 61 62 63 64 0a
0000005

1.4 head和tail

显示文件的前半部/后半部,默认10行,更多-n

tail -f,实时打印文件尾部被追加内容

1
2
3
4
5
6
$ ls -s | sort | head -n 5
12 bits.c
12 driver.pl
16 btest.c
20 btest
4 bits.h

1.5 tee

同时存入文件和显示

1
2
3
4
$ echo abcd | tee temp.log
abcd
$ cat temp.log
abcd

1.6 wc

字计数,列出文件一共有多少行,多少单词,多少字符。-l只列出行数

1
2
3
4
5
6
7
8
$ wc -l *.c
317 bits.c
583 btest.c
57 decl.c
151 fshow.c
75 ishow.c
118 tests.c
1301 总用量

1.7 sort

排序,有很多选项。比如**-n**,按数字大小而非字节序排序

1.8 tr

形如tr string1 string2翻译字符,把stdin拷贝到stdout中,用string1替换 string2。

1
2
$ echo abcdefg | tr '[b-d]' '[B-D]'
aBCDefg

1.9 uniq

筛选文件中的重复行(相邻且相同的行)

1
2
3
$ uniq -u temp #保留没重复的行
$ uniq -d temp #保留有重复的行
$ uniq -c temp #计数重复的行出现了几次

4月第2周

文件内容对比

逐字节比较两文件cmp

md5dum/sha1sum比较hash值是否相同,用于验证完整性

1
2
3
4
5
$ md5sum ht3.c > myf.sum
$ vi myf.sum # 修改
$ md5sum -c myf.sum
ht3.c: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

求出两文件差别diff

1
2
$ diff file1 file2 # 
$ diff -u file1 file2 # unified格式

关系模型

关系模型三要素:基本结构(关系/表)、基本操作(关系运算)、完整性约束。一个关系就是一个table,关系模型是处理表的。关系运算包括:关系代数、关系演算(元组演算和域演算)。关系代数是基于集合的运算,元组演算是基于逻辑的运算,域演算是基于示例的运算。

什么是关系

域:列的取值范围,时候一组值的取值范围,有相同的数据类型。集合中元素个数为域的基数cardinality。

笛卡尔积:所有可能组合成的元组的集合。元组(d1, d2, …, dn)是从每一个域任取一个值形成的一种组合,笛卡尔积是所有这种可能组合的集合。笛卡尔积中的每个元素(d1, d2, …, dn)被称为一个n-tuple。

关系:笛卡尔积中具有某种意义的元组的集合,是笛卡尔积的子集。关系的不同列可能来自同一个域,为了区分每列,取一个名字,属性名。属性值来自某一个域。关系中属性的数目为“度”或“目”,关系中元组的数目为关系的“基数”。关系中属性名一般为属性的类型和长度,如char(8)。

关系模式和关系。关系模式是关系的结构,关系是关系模式在某一时刻的数据。关系模式稳定,关系是时变的。

关系的特性

列示同质的,每一列来自同一域,是同一类型的。

不同的列可能来自同一域。行位置可以互换,列位置可以互换。区分不同的列、行不靠位置,靠名字、值。

关系的任意两个元组不能完全相同,而table不一定遵守该规则。

关系的第一范式:属性不可再分。不能存在复合属性、对应多个值的属性。

候选码与外码

候选码Candidate Key:关系中的一个属性组,可以唯一标识一个元组。关系中可能有多个候选码,要选一个作为主键/主码,DBMS以主键为主要线索管理关系中的各个元组,主码比候选码更严格。

主属性:包含在任何一个候选码中的属性。全码All-Key,所有属性构成这个关系的勾选码。

外码Foreign Key:关系R中一个属性组,不是R的候选码,但它与另一个关系S的候选码相对应,则称该属性组为R的外码。两个关系通常靠外码连接起来。

完整性

实体完整性,关系的主码的属性值不能为空。主码是能唯一区分元组的属性组。空值会影响运算,要特殊处理。可以设默认值。

参照完整性,对外码而言,(1)为空值;(2)非空,但必须是另一表中的做主码的某个值。这保证了两个关系之间连接的正确性,关系数据的一致性。

自定义完整性,用户自定义的约束性。如值的取值范围。

DBMS中,前二者由结构保证,自定义完整性在定以后,DBMS会检查相关操作的正确性。