目录
[1. 数据库](#1. 数据库)
[2. 内部4特征](#2. 内部4特征)
[3. 外部4特征](#3. 外部4特征)
[4. 数据库结构](#4. 数据库结构)
[5. SQL语句分类(重点)](#5. SQL语句分类(重点))
[6. 注意](#6. 注意)
[7. 数据库表的字段类型](#7. 数据库表的字段类型)
[8. 存储引擎](#8. 存储引擎)
[9. 数据库表的操作](#9. 数据库表的操作)
[1. 什么是范式](#1. 什么是范式)
[2. 约束作用](#2. 约束作用)
[3. 三范式](#3. 三范式)
[4. 第一范式(1NF)确保每列保持原子性](#4. 第一范式(1NF)确保每列保持原子性)
[5. 第二范式(2NF)属性完全依赖于主键](#5. 第二范式(2NF)属性完全依赖于主键)
[6. 第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键](#6. 第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键)
[1. 什么是约束](#1. 什么是约束)
[2. 约束作用](#2. 约束作用)
[3. 约束种类](#3. 约束种类)
[6.1 主键约束与"not null unique"区别](#6.1 主键约束与“not null unique”区别)
[6.2 一般主键的建立方式](#6.2 一般主键的建立方式)
[7. 外键约束](#7. 外键约束)
[8. 约束的添加](#8. 约束的添加)
[9. 约束的删除](#9. 约束的删除)
[1. 使用工具](#1. 使用工具)
[2. 控制台](#2. 控制台)
一、DDL建库建表
1. 数据库
概念:长期存放在计算机内,有组织、可共享的大量数据的集合,是一个 数据"仓库"。
(1)作用:存放、管理数据
(2)分类:关系型数据库、NoSQL数据库
关系型数据库: MySQL、orcale、postgreSQl
NoSQL数据库(非关系型数据库): redis、mongoDB
(3)MySQL特点:
操作便捷
小巧,功能齐全
免费、开源的数据库
可运行于windows或linux系统
2. 内部4特征
(1)数据的保存
(2)数据的完整性
(3)数据的读取
(4)数据的安全性
3. 外部4特征
(1)结构化
(2)共享性
(3)独立性
(4)安全性
4. 数据库结构
(1)数据库(Database)
以文件的形式存放在磁盘上,即对应于一个或多个物理文件。
(2)数据表(Table)
简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是一组相关的按行排列的数据;每个表中都含有相同类型的信息。
(3)字段(Field)
也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息。
(4)记录(Record)
表中的每一行称为一个记录,它由若干个字段组成。实体
(5)索引(Index)
索引实际上是一种特殊类型的表,其中含有关键字段的值和指向实际记录位置的指针,可以提高访问数据库的效率。
(6)SQL语句
结构化查询语句命令,用来从一个或多个表中获取一组指定的记录,或者对某个表执行指定的操作。
5. SQL 语句分类(重点)
(1)DDL(数据定义语言) CREATE、DROP、ALTER
(2)DML(数据操作语言) INSERT、UPDATE、DELETE
(3)DQL(数据查询语言) SELECT
(4)DCL(数据控制语言) GRANT、COMMIT、ROLLBACK
6. 注意
-
注释
- -- 注释
- /*
多行注释
*/
(1)sql不区分大小写
(2)_(下划线)进行名字的分割,不适用驼峰命名法
(3);语句sql结尾处写一个;来表示结束
(4)一般关键词建议用大写
(5)所有名称不允许使用中文
7. 数据库表的字段类型
(1)字符串类型
char 和varchar区别(重点)
都是字符串
char(字符串长度) 固定长度字符串
varchar(字符串长度) 可变长度字符串
char(5) 'abcdef' 存不下 'abc '不够补空格 可能浪费空间
varchar(5) 'abcdef' 存不下 'abc'
deimal(m,d) m总长度 n小数位数
例:0-100,小数1位 deimal(4,1) 100三位+小数1位
(2)数值类型
(3)日期和事件类型
null是一种类型,本身没值,表示空无一物
8. 存储引擎
查看当前数据库支持的存储引擎:show engines;
(1)数据库存储引擎-InnoDB
InnoDB是MysQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)
除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。
除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
数据文件结构:
• 表名.frm存储表结构(MySQL8.0时,合并在表名.ibd中)。
• 表名.ibd存储数据和索引
InnoDB是为处理巨大数据量的最大性能设计。
对比MylISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保存数据和索引。
MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。
(2)数据库存储引擎-MyISAM
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
优势 是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用,MyISAM查询快,对增删改不友好
针对数据统计有额外的常数存储。故而count(*)的查询效率很高
数据文件结构:
• 表名.frm存储表结构。
• 表名.MYD存储数据(MYData)。
• 表名.MYI存储索引 (MYIndex)
应用场景 :只读应用或者以读为主的业务
(3)数据库存储引擎-MyISAM 和InnoDB区别(重点)
9. 数据库表的操作
(1)创建表
create table 表名(
字段名 类型 属性,
字段名 类型 属性,
...
字段名 类型 属性
);
(2)查看表结构
方式一:desc 表名
方式二:show create table 表名;
`反引号 -- 取消关键性
DEFAULT NULL 该字段的值可以为空
DEFAULT CHARSET=utf8mb4 字符集
COLLATE-utf8mb4_0900_ai_ci 字符排序
ENGINE=InnoDB 非常重要 存储引擎 规则(InnoDB)
(3)表结构修改
alter table 表名 关键词 数据;
关键词:rename as、add、drop、modify、change。
修改表名 :alter table 旧表名 rename as 新表名;
添加字段 (重点):alter table 表名 add 新字段名 类型 属性;
alter table xuesheng add stu_qq varchar(20) comment '这是学生的qq号';
comment 相当于备注
(4)删除字段(危险操作)
alter table 表名 drop 字段名;
(5)修改字段
覆盖式
- 一定的默认值
- 如果有已经存在具体数据,数据是可以做隐式转换的
方式一:modify 只能修改数据类型和属性
alter table 表名 modify 字段名 要修改的类型 要修改的属性;
方式二:change
alter table 表名 change 旧字段名 新字段名 要修改类型 要修改属性
(6)删除表(危险操作)
drop table [if exists] 表名
二、三范式
1.什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。
在关系型数据库中这种规则就叫做范式。
2.约束作用
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
3.三范式
第一范式:确保每列保持原子性
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关,而不是间接相关
第一范式 (拆字段 ):原子性(不可再分),拆到不可再拆为止,减少冗余和歧义。
第二范式(拆表):在第一范式基础上建立 ,数据库表中的每个实例或行必须可以被惟一地区分,主键(标识数据),属性完全依赖于主键。
第三范式(拆表):每个属性都跟主键有直接关系而不是间接关系。
4. 第一范式(1NF)确保每列保持原子性
(1)每一列属性都是不可再分的属性值,确保每一列的原子性。
(2)两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
5. 第二范式(2NF)属性完全依赖于主键
(1)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的。即满足第二范式必须先满足第一范式。
(2)第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。
6. 第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
三、表约束
1. 什么是约束
约束实际上就是表中数据的限制条件。
2. 约束作用
表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效。
3. 约束种类
- 非空约束(not null)
- 唯一性约束(unique)
- 主键约束(primary key) PK
- 外键约束(foreign key) FK
- 检查约束(目前MySQL不支持、Oracle支持)
4. 非空约束
用not null约束的字段不能为null值,必须给定具体的数据
create table tb2(
username varchar(10) not null, -- 非空约束
userage int
);
create table tb3(username varchar(10) not null default '无名', -- 非空约束
userage int
);
5. 唯一约束
是可以为null,并且可以有多个null,因为null是一个类型。
create table tb4(
username varchar(10) unique, -- 唯一约束,行级约束,只约束一个字段
userage int unique -- 每个字段都是各自的唯一约束
);
create table tb5(username varchar(10),
userage int,
unique(username,userage) -- 表级约束 / 联合唯一约束
-- 字段是有关联的,必须每个字段的值都相同才会触发唯一约束(两条记录username,userage完全一样时,数据无法存取)
);
6. 主键约束
主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。
- 每张表必须有且只有一个主键
- 主键的只是唯一的
- 主键是不能为null
- 用来做标识
- 一张表应该有主键字段,如果没有,表示该表无效
6.1 主键约束与"not null unique"区别
(1)作为Primary Key的域/域组不能为null,而Unique Key可以。
(2)在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。
(3)更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。
create table tb7(
username varchar(10) primary key,
userage int primary key -- 错误
);
create table tb8(username varchar(10),
userage int,
primary key(username,userage) -- 联合主键 / 联合约束
-- 多个字段完全相同时,才会触发
);
6.2 一般主键的建立方式
- int bitint 自增
- 主键的值不会回补
create table tb9(
tid int primary key auto_increment, -- 自增
username varchar(10),
userage int
);
7. 外键约束
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键 。A为基本表或父表,主表,B为信息表,子表,副表
只能是表级定义。
foreign key(表的字段名) references 父表表名(父表的字段名)
按外键约束的字段数量分类:
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
- 外键的值可以重复
- 外键的值可以为null
- 外键必须要写父表中有的数据
- 父表中的关联字段必须是一个具有唯一性的数据
- 父表的字段名和从表的字段名不一定要相同,但是数据类型必须一致
- 一个表中可以有多个外键,也可以有多个外键约束,但是只能有一个主键
- 外键约束和外键关系 不一样, 关系没有形成约束
- 先添加父表数据,再添加子表数据
- 先删子表数据,再删父表数据
- 使用外键关系,不去建立外键约束
create table a(
aid int primary key auto_increment,
aname varchar(10)
);
create table b(bid int primary key auto_increment,
bname varchar(10),
aid int,
foreign key(aid) references a(aid)
);
8. 约束的添加
添加非空约束
alter table 表名 modify test_student char(10) not null;
添加唯一约束
alter table 表名 add unique(表字段名,字段,字段,字段);
添加主键约束
alter table 表名 add primary key(表的字段名,字段,字段);
添加外键约束
alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);
9. 约束的删除
删除not null约束
alter table 表名 modify 列名 类型;
删除unique约束
alter table 表名 drop index 唯一约束名;
删除primary key约束
alter table 表名 drop primary key;
删除foreign key约束
alter table 表名 drop foreign key 外键名;
四、数据备份与还原
1. 使用工具
2. 控制台
在F:\MySQL\MySQL Server 5.7\bin -- cmd中(终端)
(1)数据备份
mysqldump.exe -h localhost -P 3306 -u root -p xiaozhao2 > F:/Task/myschool.sql
passward
-h 服务器 -P端口号
> 尖尖对应目标
< 开口对应数据
(2)数据还原
导入linux中数据库
阿里云mysql先建库
mysql.exe -h 121.41.85.102 -P 3306 -u root -p haha < F:/Task/myschool.sql
passward
121.41.85.102为shell 主机ip