一、摘要:

这个系列的文章将循序渐进,介绍数据管理和数据分析的基础知识。具体包括:1.数据库管理基础:设计、存储、更新、查询数据库;2.SQL查询语言:用SQL语言编写数据库查询;3.数据分析技术:数据分析的基本方法eg:统计分析;4.数据安全与隐私:如何确保数据安全性,遵守相关法律。

1.数据

数据是我们日常生活中遇到的各种信息,可以是数字、字符、符号等eg:1,2,3,A,B,C,@,!,#这些信息可以被储存为数字格式,用于计算和分析

2.大数据

“大数据”是指数量庞大到传统工具无法处理的数据。大数据通常具有以下特征:数据量巨大;增长迅速。

分类:

1.结构化数据:数据按预定格式存储,通常存储在关系型数据库中。eg:数据库中的表格数据。

2.非结构化数据:没有明确格式的数据。eg:文本、图片、视频。

3.半结构化数据:介于结构化数据和非结构化数据之间,数据有一定的标记或标签,可以进行部分分析。eg:JSON或XML格式的数据。

3.数据库与数据库管理系统(DBMS)

DBMS是一种软件工具,用于存储、管理、查询、更新数据库中的数据。它提供了以下功能:

数据存储:将数据保存在计算机系统中,方便访问和更新。

数据管理:保证数据的一致性、完整性和安全性。

查询处理:用户通过SQL等语言进行查询,DBMS负责解析、执行和返回查询结果。

4.数据库管理系统 vs. 文件系统

在传统的文件系统中,我们将数据存储在文件中,可能使用文本文件、Excel文件等格式。但是随着数据量增大,文件系统会面临很多问题。eg:

效率低下:每次需要处理数据时都要写新的程序,效率低。

数据冗余:多个文件中可能存储相同的数据,造成浪费。

数据一致性:没有统一管理,多个文件中的数据可能不一致。

并发访问:多个用户同时访问文件时,容易造成冲突。

数据库管理系统(DBMS)可以解决这些问题:

高效访问:DBMS提供优化的数据存储和检索方法,支持高效查询。

数据一致性:DBMS通过约束和规则确保数据的一致性。

并发访问:DBMS支持多个用户同时访问数据,并管理并发操作。

事务管理:在系统崩溃或断电后,DBMS能恢复到崩溃前的状态,确保数据的完整性。

5.为什么使用数据库管理系统(DBMS)?

使用DBMS的原因包括:

设计:设计数据结构,决定数据存储方式。

更新:增加、修改、删除数据库中的数据。

查询:通过SQL查询语言,快速获取所需数据。

管理:控制谁可以访问数据,确保数据的安全。

6.数据模型

数据模型用于描述数据及其结构。

关系模型:数据以表格(关系)的形式存储。最常用的数据库模型。

键值模型:存储键值对,常用于NoSQL数据库。

图模型:数据以图的形式存储,常用于处理社交网络数据。

文档模型:数据存储为文档形式,常见的格式如JSON、XML。

7.SQL(Structured Query Language 结构化查询语言)

SQL是与关系型数据库互动的标准语言。它用于对数据库中的数据进行查询、插入、更新、删除等操作。

二、关系型数据库

关系模型是数据库的核心思想之一,广泛应用于关系型数据库的设计和管理。

1.关系数据库的结构

关系数据库由若干个关系组成,每个关系实际上是一个数据表。一个关系由两部分构成:

<1>模式:定义了关系的名字,包括一系列属性,和每个属性/域的类型。

eg:account(account_number:string,branch_name:string,balance:real)。这里定义了账户信息的表,包含账户号、分行名、余额等属性。

<2>实例:就是关系(表)中的实际数据,表现为元组/行,属性/列。

关系的属性类型:

每个属性有一个名字,属性的域是该属性可能的值的集合。

属性的值不可再分。

空值表示数据缺失或未知。空值在许多数据库操作中需要特别处理。

2. 关系实例

关系实例是一个包含若干个元组(行)的表格。每个元组代表一条数据记录。关系中的元组是无序的,即表格中的行没有固定顺序。

3.数据库中的关系

一个数据库包含多个关系(数据表),每个关系存储不同类型的信息。

关系通过外键等机制连接,形成完整的数据库系统。

4.键

键是用来唯一标识元组的。关系中的每个元组都必须有一个或多个键来保证数据的唯一性。

超键:超键是能唯一标识表中每一条记录的属性集合,可以由一个或多个属性组成。一个超键可以

包含冗余属性,只要它能唯一地标识记录。

候选键:候选键是一个最小的超键,也就是说,候选键是能够唯一标识记录的属性集合,并且没有

冗余属性。

主键:主键是候选键中的一个选定的键,它用于实际的数据库设计中作为记录的唯一标识符。

eg:

学生表(Student)

student_id name email phone_number department
1 Alice alice@domain.com 1234567890 CS
2 Bob bob@domain.com 9876543210 EE
3 Charlie charlie@domain.com 1122334455 CS

在学生表中,以下都是超键:

{student_id}student_id是唯一的,能够唯一标识每个学生。

{student_id, name}:尽管student_id已能唯一标识学生,但将name加进来也能唯一标识每一条记

录,因此它也是超键。

{email, phone_number}emailphone_number一起也能唯一标识学生,所以它也是一个超键。

(全部超键:{student_id},{email},{phone_number},{student_id, name},{student_id,

email},{student_id, phone_number},{email, phone_number})

在学生表中,以下是候选键:

{student_id}:这是一个最小的超键,足够唯一标识学生,不包含任何冗余属性。

{email}:如果每个学生的电子邮件都是唯一的,那么email也是候选键。

(全部候选键:{student_id},{email},{phone_number})

主键是候选键中的一个,它可以是student_idemail等,但在实际使用中只会选一个。

5.外键

外键在数据库中用于建立两个表之间的关系,通过在一个表的列中引用另一个表的主键来确保数的

完整性。

eg:

学生表(Student)

student_id name department
1 Alice CS
2 Bob EE
3 Charlie CS
4 David EE

课程表(Course)

这个表包含课程的信息,包括课程的ID、课程名称以及授课教师的ID。

course_id course_name instructor_id
101 Data Structures 1
102 Algorithms 2
103 Databases 1
104 Computer Networks 2

学生选课表(Enrollment)

student_id course_id
1 101
1 103
2 102
2 104
3 101
4 102

Enrollment 表中的 student_id 列是一个外键,它引用了 Student 表中的 student_id 列。

Enrollment 表中的 course_id 列也是外键,它引用了 Course 表中的 course_id 列。

外键约束确保我们在 Enrollment 表中插入的数据必须对应于 Student 表和 Course 表中的有效数

据。这就表示学生选修的课程和学生本身必须存在于相应的表中,否则插入将会失败。

外键约束的作用:

数据完整性:外键约束确保Enrollment表中的student_idcourse_id引用的值在Student表和

Course表中是有效的,即不会插入无效的数据。

级联更新和删除:

级联删除(CASCADE DELETE):如果在Student表中删除了某个学生(例如,student_id =

1),那么在Enrollment表中,所有与该学生相关的记录也会被删除。

级联更新(CASCADE UPDATE):如果在Student表中更新了某个学生的ID(例如,student_id

= 1更新为student_id = 10),那么在Enrollment表中,所有与该学生相关的记录的student_id

会被更新。

也可以指定禁止删除或更新NO ACTION),这意味着如果尝试删除或更新Student表中某个已被

引用的记录,数据库将会阻止操作。

三、关系代数

关系代数是关系数据库管理系统(DBMS)用来处理和查询数据的数学工具。

1. 关系代数的作用

将用户用SQL等语言表达的查询转换成数据库能够理解和执行的操作。数据库管理系统(DBMS)

会基于关系代数对查询进行优化和计算,找出最有效的查询路径。

2. 关系代数的基本操作(6种)

每个操作都会接受一个或两个关系作为输入,返回一个新的关系作为输出。

选择(Select)σ:用于从关系中选择满足特定条件的元组(行)。

投影(Project)π:从关系中选择特定的属性(列)。

并(Union)∪:将两个关系中的元组合并,去掉重复的元素。

差(Set Difference)–:返回存在于第一个关系中但不在第二个关系中的元组。

笛卡尔积(Cartesian Product)×:将两个关系中的每一对元组进行组合。

重命名(Rename)ρ:给关系或关系中的属性重命名。

<1>选择(Selection,σ)从关系中选择满足特定条件的元组(行)。

语法:σ(predicate)(R)

predicate:一个条件,定义了需要选择的元组; R:一个关系(表)。

eg:

学生表(Student):

student_id name department age
1 Alice CS 22
2 Bob EE 23
3 Charlie CS 21
4 David EE 24

选择所有年龄大于22的学生:σ(age > 22)(Student)

结果是:

student_id name department age
2 Bob EE 23
4 David EE 24

AND 操作符:∧

AND 操作符用于组合多个条件,只有当所有条件都满足时,才会返回对应的元组。

OR 操作符:∨

OR 操作符用于连接多个条件,只要至少有一个条件为真,查询就会返回对应的元组。

NOT 操作符:¬

NOT 操作符用于取反条件,它会返回不满足条件的元组。

<2> 投影(Projection,π)从关系中选择特定的属性(列)。

语法:π(A1, A2, ..., An)(R)

A1, A2, ..., An:列出需要选择的属性(列);R:一个关系(表)。

eg:

学生表(Student):

student_id name department age
1 Alice CS 22
2 Bob EE 23
3 Charlie CS 21
4 David EE 24

选择学生的名字和部门:π(name, department)(Student)

结果是:

name department
Alice CS
Bob EE
Charlie CS
David EE

<3> 并(Union,∪)

返回两个关系中所有元组的并集,去除重复项。要求两个关系必须有相同的属性(列)。

语法: R1 ∪ R2

R1R2:两个具有相同属性的关系。

eg:

学生表(Student):

student_id name
1 Alice
2 Bob
3 Charlie

教师表(Teacher):

teacher_id name
101 David
102 Eva
103 Alice

查询所有人的名字(学生和教师):

π(name)(Student) ∪ π(name)(Teacher)

结果:

name
Alice
Bob
Charlie
David
Eva

4. 差:

返回一个关系中有而另一个关系中没有的元组。

语法:R1 − R2

R1R2:两个具有相同属性的关系。

eg:

学生表(Student)

student_id name
1 Alice
2 Bob
3 Charlie
4 David

已毕业学生表(Graduated)

student_id name
1 Alice
3 Charlie

找出所有未毕业的学生的名字和 ID:

π(student_id, name)(Student) − π(student_id, name)(Graduated)

结果:

student_id name
2 Bob
4   David

5.笛卡尔积(Cartesian Product,×)

返回两个关系中的每一对元组组合。结果关系的列数是两个关系列数之和,行数是两个关系行数的乘积。

语法:R1 × R2

R1R2:两个关系。

学生表(Student):

student_id name
1 Alice
2 Bob

课程表(Course):

course_id course_name
101 Data Structures
102 Algorithms

返回每个学生和每门课程的所有组合:

Student × Course

结果:

student_id name course_id course_name
1 Alice 101 Data Structures
1 Alice 102 Algorithms
2 Bob 101 Data Structures
2 Bob 102 Algorithms

6.重命名

改变关系或属性的名称

语法:ρ X (E):将表达式 E 的结果重命名为关系名 X

ρ X (A1, A2, ..., An) (E):将表达式 E 重命名为X,各属性(列)重命名为 A1, A2, ..., An。

eg:

成绩表(Grade):

student_id course_id grade
1 101 A
2 102 B

Grade 关系重命名为 G

student_id 列重命名为 id,将 grade 列重命名为 student_grade

ρ G(id, course_id, student_grade) (Grade)

结果:

id course_id student_grade
1 101 A
2 102 B

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐