一、数据模型
1、数据模型应满足三方面的要求:
- 能比较真实的模拟现实世界
- 容易为人所理解
- 便于在计算机上实现
2、数据模型的组成要素 - 数据结构
- 数据操作
- 数据的约束条件
3、数据操作的类型:检索(查询)和更新(增加、删除、修改)
4、数据的约束条件 - 在关系模型中,任何关系必须满足实体完整性和参照完整性两个条件。
- 完整性规则是给定的数据模型中数据及其联系所具有的制约和储存规则,用来限定符合数据模型的数据库的状态以及状态的变化,以保证数据的正确、有效、相容。
- 一组完整性规则的集合。
5、关系模型中的完整性约束有: - 实体完整性
- 参照完整性
- 用户自定义完整性
二、关系模型关系模型
1、基本概念
-
关系:一个关系通常说是一张表。关系名是唯一的
-
属性:就是关系中的各列,一列即是一个属性,给每一个属性起一个名称即属性名。列是唯一的。
-
元组:除了关系的标题栏以外,其他各行统称为元组,元组的各分量分别对应各个属性在该元组上的取值;元组只能出现1次或0次。
关系是元组的集合,在给定的关系中,一个元组不可能出现一次以上。 -
关系的模式:关系名和关系的属性集称为关系的“模式”,
对关系的描述:关系名(属性1,属性2,……,属性n) -
分量:元组中的一个属性值。
-
域:每一个属性有一个允许的值的集合,称为该属性的‘域’,制定的域通常是一个特定的基本类型。关系的任何元组的每个分量都必须对应列的域中取值。
2、键码约束 -
超(键)码(super key):一个或者多个属性的集合,这些属性的组合可以使我们在一个关系中唯一的标识一个实体。
-
候选(键)码(candidate key):任意真子集都不能成为超码的最小超码,一个表中可能存在多个候选码。
注: 候选码也可能是属性的集合。
候选码一定是超码 -
主(键)码(primary key):数据库设计人员选定的,用于唯一标识该关系元组的一个候选码。
每一个关系有且只有一个主码。通常用较小的属性组合作为主键。
注:(1)每一个关系有且只有一个主码
(2)通常用较小的属性组合作为主键
(3)主码一定是超码
(4)一个关系可以有多个超码,多个候选码,但只能有一个主码。
(5)一个关系中各个元组的主码的分量值一定不同 -
外键:实际上是表中的一个(或多个)属性,它引用某个其他表(特殊情况下,也可以是外键所在的表)的主键,当然,也可以是候选键,但多数情况下是主键。
3、关系模型的完整性约束 -
实体完整性:实体完整性是指一个表中的每一行必须是唯一的,即实体是可以唯一区分的 。
若属性A是基本关系R的主键,则属性A不能取空值,另外不能存在属性A上分量相同的元组。 -
参照完整性:一个表中某列的取值受限于另一个表的取值范围约束的特点就称为参照完整性。在关系数据库中用外键(foreign key,有时也称为外部关键字或外码)来实现参照完整性。
-
用户自定义的完整性:用户定义的完整性规则是针对某一应用环境的完整性约束条件,他反映了某一具体应用所涉及的数据应满足的要求。在实际系统中,这类完整性规则一般在建立库表的同时进行定义。
4、关系模型的数据操纵 -
查询、插入、删除、更新
-
数据操作是集合操作,操作对象和操作结果都是关系,即若干个元组的集合。
-
存取路径对用户隐蔽,用户只需要去干就行了
5、关系模型的存储结构 -
表以文件形式存储
-
有的DBMS一个表对应一个操作系统文件
-
有的DBMS自己设计文件结构
7、关系模型优点和缺点 -
优点:A、建立在严格的数学概念的基础上
B、概念单一
C、关系模型的存取路径对用户透明 -
缺点:A、效率低
B、对用户的查询请求进行优化
C、增加了开发数据库管理系统的难度
##三、数据类型(MySQL)
1、整数
1)Tinyint 1字节
2)Smallint 2个字节
3)Mediumint 3个字节
4)Int 4个字节(常用)
5)Bigint 8个字节
2、浮点数
1)float:单精度4个字节
2)Double:双精度8个字节
3、十进制
Decimal(m,d)
例:amount DECIMAL(6,2);
表示名为amount的列最多可以存储6位数字,其中小数位数为2位;
4、日期
1)date 日期
2)Time 时间值
3)Year 年份值
4)Datetime 混合日期和时间值
5)Timestamp 时间戳
5、文本
1)char:定长字符串
2)varchar:变长字符串
3)tinytext:短文本字符串
4)text:长文本字符
5)mediumtext:中等长度文本数据
6)longtext:极大文本数据
注:char、varchar、text的比较
A、char长度固定,即每条数据占用等长字节空间
适合用在身份证号、手机号码等
B、Varchar可变长度,可以设置最大长度
适合用在长度可变的属性
C、Text当不知道属性的最大长度时,适合用text
D、按查询速度:char最快、varchar次之,text最慢
##四、创建数据库 create database
1、创建数据库
create database 数据库名
例如:CREATE DATABASE if not exists mytest ;
CHARACTER SET = utf8; 设置字符集
COLLATE = utf8_general_ci; 排序规则为 utf8_general_ci。
2、删除数据库
DROP DATABASE 数据库名
例如:DROP DATABASE IF EXISTS mytest;
##五、表的定义
1、简单表的定义
Create table 表名
(<列名1> <列数据类型> [列完整性约束],
<列名2> <列数据类型> [列完整性约束],
……
[表级完整性约束]);
2、学生数据库的创建完整示例
```sql
create table 专业(
专业编号 char(10) not null primary key,
专业名称 varchar(50),
级别 char(6),
学制 int default 4
);
create table 课程(
课程编号 char(10) not null primary key,
课程名称 varchar(50),
理论学时 int check(理论学时>=0),
实验学时 int check(实验学时>=0),
开课学期 int ,
课程性质课程介绍 varchar(200)
);
create table 班级(
班级编号 char(10) not null primary key,
班级名称 varchar(50) unique,
专业编号 char(10) references 专业(专业编号),
入学年份 int year(now()
);
create table 教师(
教师编号 char(10) not null primary key,
教师姓名 varchar(10),
性别 char(1) check(性别='女' or 性别='男' ),
职称 char(6),
政治面貌 varchar(10),
简介 varchar(200),
生日 datetime,
所在教研室 varchar(50)
);
create table 学生(
学号 char(10) not null primary key,
姓名 varchar(10),
性别 char(1) check(性别='女' or 性别='男' ),
生日 datetime,
班级 char(10) references 班级(班级编号),
政治面貌 varchar(10)
);
create table 开课计划(
开课计划编号 char(10) not null primary key,
课程编号 char(10) references 课程(课程编号),
教师编号 char(10) references 教师(教师编号),
学期 char(9) check(学期 regexp '^ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][1-2]%') ,
unique (课程编号,教师编号,学期)
);
create table 选课表(
学号 char(10) references 学生(学号),
开课计划编号 char(10) references 开课计划(开课计划编号),
成绩 int check(成绩>=0 and 成绩<=100) ,
constraint pkofxuanke primary key (学号,开课计划编号)
);
3、属性组做外码
4、自定义约束
5、修改、删除表
Alter table 表名
ADD 列名 列的类型 null(默认的);
Drop Column 列名
6、其他
```sql
```sql
CREATE TABLE users
(
uid INT AUTO_INCREMENT PRIMARY KEY,
username CHAR(10)
) [AUTO_INCREMENT=1000];
解释:
AUTO_INCREMENT:自增长,默认起始编号从1开始,步长为1。
AUTO_INCREMENT:设置默认的起始值。