CPT103-Lecture 1
CPT103-Lecture 1
迟然什么是数据库?
数据库是以一定方式存储大量数据的集合。其中的数据通常是有组织的,并可以共享和重复使用,通常使用数据库管理系统 (DBMS) 来管理。
数据库的类型有很多,包括:
- 关系数据库:这是最常见类型的数据库。关系数据库中的数据存储在表中。
- NoSQL 数据库:NoSQL 数据库是为非关系数据设计的。NoSQL 数据库通常比关系数据库更灵活和可扩展。
- 云数据库:云数据库是托管在云中的数据库。云数据库可以提供灵活性和可扩展性。
以下是一些常见的数据库示例:
- MySQL:MySQL 是一种流行的关系数据库。
- PostgreSQL:PostgreSQL 是一种流行的关系数据库。
- MongoDB:MongoDB 是一种流行的 NoSQL 数据库。
- Amazon Relational Database Service (RDS):RDS 是 Amazon Web Services (AWS) 提供的云数据库服务。
CPT103中,我们需要学习关系数据库,并使用MySQL完成课程要求。
关系数据库
关系数据库建立在关系模型的基础上,使用表格来组织数据。每个表都包含行和列。行代表数据中的记录,列代表记录的属性。不同的表之间可以通过外键来相互关联。(外键是表中的一列,它引用另一个表中的主键。)
想象一个学校,它需要存储学生、课程和成绩等信息。
我们可以使用关系数据库来存储这些信息。
学生表
学生ID | 学生姓名 | 性别 | 出生日期 |
---|---|---|---|
1 | 张三 | 男 | 2000-01-01 |
2 | 李四 | 女 | 2001-02-02 |
3 | 王五 | 男 | 2002-03-03 |
课程表
课程ID | 课程名称 | 老师 |
---|---|---|
1 | 数学 | 王老师 |
2 | 语文 | 李老师 |
3 | 英语 | 张老师 |
成绩表
学生ID | 课程ID | 成绩 |
---|---|---|
1 | 1 | 90 |
1 | 2 | 80 |
1 | 3 | 70 |
2 | 1 | 85 |
2 | 2 | 95 |
2 | 3 | 80 |
3 | 1 | 75 |
3 | 2 | 65 |
3 | 3 | 90 |
学生表中的每个学生都有一个唯一的学生ID。课程表中的每个课程都有一个唯一的课程ID。成绩表中的每条记录都包含一个学生ID和一个课程ID。
成绩表中的学生ID和课程ID是外键,它们引用学生表和课程表中的主键。通过这些外键,我们可以将学生表、课程表和成绩表关联起来。
例如,我们可以查询所有学生的成绩。为此,我们可以将学生表和成绩表连接起来。连接条件是学生表中的学生ID和成绩表中的学生ID相等。
1 | SELECT |
这个查询将返回以下结果:
1 | | 学生姓名 | 课程名称 | 成绩 | |
关系数据库这种结构的好处在于它类似于电子表格,因此易于理解和使用。并且可以确保数据的完整性和一致性。但相对的,它的结构是固定的,灵活性和可拓展性不如其他数据库。
关系数据库的特点
- 数据结构化:数据存储在表中。每个表都包含行和列。行代表数据中的记录,列代表记录的属性。
- 数据独立性:数据独立于应用程序。应用程序可以通过SQL语句来访问和操作数据,而无需更改应用程序代码。
- 数据共享性:数据可以在多个应用程序之间共享。这可以提高数据的利用率和效率。
- 数据完整性:关系型数据库可以通过完整性约束来确保数据的完整性。完整性约束可以确保数据准确、一致和可靠。
- 事务性:支持事务。事务是一组操作,要么全部成功,要么全部失败。这可以确保数据的一致性。
- 安全性:可以通过权限控制来确保数据的安全性。权限控制可以限制用户对数据的访问和操作权限。
- 易用性:提供了SQL语言来访问和操作数据。SQL语言是一种简单易学的语言。
数据库管理系统 DBMS(Database Management System)
Database 是存储数据的集合。通常由多个表组成,每个表包含一个或多个字段。
而DBMS 是用于管理数据库的软件系统。提供一系列功能来创建、维护和访问数据库。它可以管理多个数据库,一个数据库可以由多个用户使用。
简而言之,Database是数据集合,可以使用DBMS来管理Database。
但是,DBMS是一种服务器应用程序,通常在服务器上运行,它没有图形界面,所以我们一般使用为管理DBMS而设计的客户端应用程序与DBMS通信。除此之外,还有其他的客户端应用程序,它们使用DBMS提供服务,比如说网络游戏、酒店预订网站以及ATM上的软件。
一些术语
- 关系(Relation):是一个数学概念,其物理形式是一个有列和行的表。
- 属性(Attribute):是关系中的有命名的一列。
- 域(Domain):是允许属性值的集合。
- 元组(Tuple):是关系的一行。(元组的顺序并不重要)
- 程度(Dgree):关系的程度就是它所包含的属性的数量。
- 基数(Cardinality):关系中元组的数量。
对于某些术语,我们有其他的叫法:
正式的术语 | 允许的叫法 | 允许的叫法 |
---|---|---|
关系(Relation) | 表格(Table) | 文件(File) |
元组(Tuple) | 行(Raw) | 记录(Record) |
属性(Attribute) | 列(Column) | 字段(Field) |
关系的键
- 关系中不允许重复的元组。
- 因此,我们需要能够识别一个或多个属性(称为关系键),唯一地标识关系中的每个元组。
- 超级键(Superkey):在关系中唯一标识元组的一个属性或一组属性。
- 其可能包含唯一标识所不需要的额外属性。
- 候选键(Candidate key):在关系中没有一个真子集是超级键的一种超级键。
- 一个关系可能有多个候选键。
- 主键(Primary key):被选中的候选键,用于在关系中唯一地标识元组。
- 未被选作主键的候选键称为备用键。
- 一个关系只能有一个主键。
- 复合键(Composite key):当一个键由多个属性组成时,我们称之为复合键。
- 外键(Foreign key):一个关系中的一个或多个属性,必须匹配某个(可能是同一个)关系的候选键。
数据库语言
数据库有自己的“编程语言”,称为结构化查询语言 SQL (Structured Query Language)。
SQL有三个重要部分:
- 数据定义语言(DDL):允许用户指定要存储在数据库中的数据的数据类型和结构以及约束。
- 数据操作语言(DML):允许用户从数据库中插入、更新、删除和检索数据
- 数据控制语言(Data Control Language, DCL):处理数据库系统的权限、权限和其他控制。
此外还有流控制(if, else, loops),这些内容包含在PL/SQL和Transact-SQL等扩展中。
SQL启动!
第一步:创建数据库(数据定义语言)
数据库的创建十分简单,在console中输入:
1 | CREATE SCHEMA name; |
这两种写法均可创建数据库。
进入新建的数据库,我们可以新建表格,表格的建立也十分简单:
1 | CREATE TABLE [IF NOT EXISTS] tablename ( |
这段DDL中,”[]”中的内容是选加的,表示如果数据库中不存在则建立。
“tablename”为表格的名称。如果需要两个单词相连接,建议使用”word1_word2”的形式。也可以使用word1 word2
的这种写法,但是这不是标准写法。
“column1”, “column2”是属性的名称,后面跟着的是数据类型。在数据类型后面,可以添加”NOT NULL“,表示输入时这一列不能填入NULL值。除此之外,还可以添加”PRIMARY KEY“来设定主键。
第二步:插入数据(数据操作语言)
我们使用INSERT
指令来插入数据,对于刚刚创建的表格,我们可以:
1 | INSERT INTO tablename VALUES |
默认来说,你输入数据的顺序,需要与表中的数据顺序相一致。但是也可以这么做:
1 | INSERT INTO tablename (column2, column1) VALUES |
这样定义了输入数据的顺序,就可以在底下按照自己的想法输入了。
如果想要删除数据,我们可以这样做:
1 | DELETE FROM tablename WHERE column2 = '企鹅'; |
选定表,并使用WHERE
来确定需要删除的元素。
除此之外,我们可以使用UPDATE
来对表进行更改:
1 | UPDATE tablename set column1 = 19 WHERE column2 = '小马'; |
如果想添加主键或者是添加一列怎么办?使用ALTER
就行啦:
1 | ALTER TABLE tablename ADD PRIMARY KEY (column2); |
第三步:未完待续…
SQL中的数据类型
数值类型:
- 整数类型:
TINYINT
:- 存储 1 个字节的整数
- 范围为 -128 到 127
SMALLINT
:- 存储 2 个字节的整数
- 范围为 -32,768 到 32,767
MEDIUMINT
:- 存储 3 个字节的整数
- 范围为 -8,388,608 到 8,388,607
INT
:- 存储 4 个字节的整数
- 范围为 -2,147,483,648 到 2,147,483,647
BIGINT
:- 存储 8 个字节的整数
- 范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 小数类型:
FLOAT
:- 存储 4 个字节的浮点数
- 精度为 7 位小数
DOUBLE
:- 存储 8 个字节的浮点数
- 精度为 15 位小数
DECIMAL
:- 存储定点数
- 可以指定精度和小数位数
字符类型:
- 固定长度字符串类型:
CHAR(n)
:存储 n 个字符的固定长度字符串,不足 n 个字符时用空格填充。
- 可变长度字符串类型:
VARCHAR(n)
:存储最多 n 个字符的可变长度字符串,实际存储空间取决于字符串的实际长度。TEXT
:存储长文本数据,最大长度为 65,535 个字节。
日期和时间类型:
DATE
:存储日期数据,格式为 YYYY-MM-DD。TIME
:存储时间数据,格式为 HH:MM:SS。DATETIME
:存储日期和时间数据,格式为 YYYY-MM-DD HH:MM:SS。TIMESTAMP
:存储日期和时间数据,并带有时间戳,可以精确到微秒。
二进制类型:
BLOB
:存储二进制数据,最大长度为 65,535 个字节。TEXTBLOB
:存储长二进制数据,最大长度为 2 GB。