一、什么是数据库?
数据库(Database,简称DB)概念: 长期存放在计算机内,有组织、可共享的大量数据的集合,是一个 数据“仓库”。
二、数据库的特点:
1.结构化:数据在数据库中的存储可以依靠二维表结构来逻辑的存储数据,可以参考数据原有的依赖关系和结构关系去存储数据。
2.共享性:多个用户可以共同分享计算机数据 库中的数据资源,同一数据可以同 时被多人使用,从而实现了数据的 高效共享性。
3.独立性:存储在数据库的数据和应用程序之 间相互独立, 互不影响。数据在磁盘 上怎样存储由数据库管理而不依赖 于应用程序,这样当数据的物理存 储改变了,应用程序不用改变。
4.安全性:数据库在安全性的控制上也有很多 措施,比如访问数据库时对用户的 口令,用户的权限进行限制,再比 如对数据的存储进行限制。
三、数据库的作用:
数据库的作用是: 存放、管理数据
四、数据库的分类
数据库分为 ①关系型数据据②NoSQL数据库
五、常见的数据库有哪些?
关系型数据库:MySQL、ORACLE
NoSQL数据库:redis、mogongDB
五、为什么使用MySQL?
MySQL数据库的特点:①操作便捷、小巧但功能齐全②免费、开源的数据库③可运行于windows或linux系统。④操作方便,适合于中小型甚至大型网站应用
六、数据库结构
数据库(Database) | 以文件的形式存放在磁盘上,即 对应于一个或多个物理文件。 |
数据表(Table) | 简称表,由一组数据记录组成, 数据库中的数据是以表为单位进 行组织的。一个表是一组相关的 按行排列的数据;每个表中都含 有相同类型的信息。 |
字段(Field) | 也称域。表中的每一列称为一个 字段。每个字段都有相应的描述 信息。 |
记录(Record) | 表中的每一行称为一个记录,它 由若干个字段组成。实体 |
索引(Index) | 索引实际上是一种特殊类型的表, 其中含有关键字段的值和指向实 际记录位置的指针,可以提高访 问数据库的效率。 |
SQL语句 | 结构化查询语句命令,用来从一 个或多个表中获取一组指定的记 录,或者对某个表执行指定的操 作。 |
七、SQL语句分类
SQL语句,即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一 种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
名词 | 解释 | 命令 |
DDL (数据定义语言) | 定义和管理数据对象, 如数据库,数据表等 | CREATE、DROP、ALTER |
DML (数据操作语言) | 用于操作数据库对象中所包含的数据 | INSERT、UPDATE、DELETE |
DQL (数据查询语言) | 用于查询数据库数据 | SELECT |
DCL (数据控制语言) | 用来管理数据库的语言,包括管理权 限及数据更改 | GRANT、COMMIT、ROLLBACK |
八、DDL语句操作数据库
创建数据库 | CREATE DATABASE [IF NOT EXISTS] dbname
|
删除数据库 | DROP DATEBASE [IF EXISTS] dbname
|
查看数据库 | SHOW DATABASES
|
选择数据库 | USE dbname
|
九、DDL创建数据表
语法:
CREAT TABLE [ IF NOT EXISTS ] `表名` (
`字段名1` 字段类型 [ 属性 ] [ 索引 ] [ 注释],
`字段名2` 字段类型 [ 属性 ] [ 索引 ] [ 注释],
... ...
`字段名n` 字段类型 [ 属性 ] [ 索引 ] [ 注释]
)[ 表类型 ] [ 表字符集 ];
- “[]” 包含的内容可以省略;
- “`” 当前符号为反引号,用于区别MySQL保留字与普通字符而引入的。
十、数据库表的字段类型
1.字符串类型
类型 | 说明 | 取值范围 | 存储需求 |
char[(M)] | 固定长字符串,检索快但费空间, 0 <= M <= 255 | M字符 | char[(M)] |
varchar[(M)] | 可变字符串 0 <= M <= 65535 | 变长度 | varchar[(M)] |
tinytext | 微型文本串 | 16777215长度+3个字节 | tinytext |
text | 文本串(4个G左右) | 4294967295长度+4个字节 | text |
2.数值类型
类型 | 说明 | 取值范围 | 储存需求 |
tinyint | 非常小的数据 | 有符值: -2 ^7 ~ 2^7-1,无符号值:0 ~ 28-1 | 1字节 |
smallint | 较小的数据 | 有符值: -2 15 ~ 215 -1 ,无符号值: 0 ~ 216 -1 | 2字节 |
mediumint | 中等大小的数据 | 有符值: -2 23 ~ 223 -1 ,无符号值: 0 ~ 224 -1 | 3字节 |
int | 标准整数 | 有符值: -2^31 ~ 2^31-1,无符号值:0 ~ 2^32-1 | 4字节 |
bigint | 较大的整数 | 有符值: -2^63 ~2^63-1,无符号值:0 ~2^64-1 | 8字节 |
float | 单精度浮点数 | ±1.1754351e -38 | 4字节 |
double | 双精度浮点数 | ±2.2250738585072014e -308 | 8字节 |
Decimal(钱) | 字符串形式的浮点数 | 点数 decimal(m, d) | m个字节 |
3.日期和时间类型
类型 | 说明 | 取值范围 | 储存需求 |
DATE | YYYY-MM-DD,日期格式 | 1000-01-01~ 9999-12-31 | DATE |
TIME | Hh:mm:ss ,时间格式 | -838:59:59~838:59:59 | TIME |
DATETIME | YY-MM-DD hh:mm:ss | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | DATETIME |
TIMESTAMP | YYYYMMDDhhmmss格式表示的时间戳 | 197010101000000 ~2037年 的某个时刻 | TIMESTAMP |
YEAR | YYYY格式的年份值 | 1901~2155 | YEAR |
设置当前 创建时间,或者是更新时间时给TIMESTAMP或者DATETIME字段 设置 DEFAULT CURRENT_TIMESTAMP 添加当前默认时间
NULL类型:
- 理解为“没有值”或“未知值”;
- 不要用NULL进行算术运算,结果仍为NULL;
- MySQL中,0或NULL都意味着为假,1为真。
十一、数据库表的字段注释
CREATE TABLE [ IF NOT EXISTS ] `表名` (
`字段名1` 字段类型 [ 属性 ] [ 索引 ] [注释] ,
`字段名2` 字段类型 [ 属性 ] [ 索引 ] [注释] ,
… …
`字段名n` 字段类型 [ 属性 ] [ 索引 ] [注释]
) [ 表类型 ] [ 表字符集 ] ;
注释:可以给字段增加注释,即给字段增加描述,方便后续修改和维护字段。
十一、数据库表的字段注释
查询创建的数据库结构:
方式一:
describe 表名
或
desc 表名
方式二:
show create table 表名
十二、数据库存储引擎
查看当前数据库支持的存储引擎: show engines;
查询结果显示,MySQL 8支持9种存储引擎,分别为MEMORY、MRG_ MYISAM、CSV、 FEDERATED 、PERFORMANCE_ SCHEMA、 MyISAM、 InnoDB 、BLACKHOLE 和ARCHIVE。
- Engine参数 表示存储引擎名称。
- Support参 数表示MySQL数据库管理系统是否支持该存储引擎: YES表示支持,NO表示不支持。
- DEFAULT表示系统默认支持的存储引擎。
- Comment 参数表示对存储引擎的评论。
- Transactions参数表示存储引擎是否支持事务: YES表示支持,NO表示不支持。
- XA参数表示存储引擎所支持的分布式是否符合XA规范: YES表示支持,NO表示不支持。代表着该存储引擎是否支持分布式事务。
- Savepoints参数表示存储引擎是否支持事务处理的保存点: YES表示支持,NO表示不支持。也就是说,该存储引擎是否支持部分事务回滚。
十四、 数据库存储引擎-MyISAM 和InnoDB区别(重点)
对比项 | MyISAM | InnoDB |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发操作 | 行锁,操作时只锁某一行,不对其它行有 影响,适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存 要求较高,而且内存大小对性能有决定性 的影响 |
默认安装 | Y | Y |
默认使用 | N | Y |
关注点 | 性能:节省资源、消耗少、简单业务 | 事务:并发写,事务、更大资源 |
两种存储引擎各有特点,当然你也可以在MySQL中,针对不同的数据表,可以选择不同的存储引擎
十五、修改和删除数据表
修改表名 | ALTER【ɔːltə(r)】 TABLE 旧表名 RENAME AS 新表名 |
修改字段 | ALTER TABLE 表名 MODIFY 【mɒdɪfaɪ】 字段名 列类型 [ 属性 ] ALTER TABLE 表名 CHANGE 旧字段 名 新字段名 列类型 [ 属性 ] |
删除字段 | ALTER TABLE 表名 DROP 字 段名 |
添加字段 | ALTER TABLE 表名 ADD 字段 名 列类型 [ 属性 ] |
删除表 | DROP TABLE [ IF EXISTS ] 表名 |
十六、三范式
一、什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。 在关系型数据库中这种规则就叫做范式。
二、约束作用
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
三、三范式
第一范式:确保每列保持原子性
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关,而不是间接相关。
四、第一范式(1NF) 确保每列保持原子性
- 每一列属性都是不可再分的属性值,确保每一列的原子性
- 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
五、第二范式(2NF)属性完全依赖于主键
- 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的。即满足第二范式必须先满足第一范式。
- 第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。
每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
一个人同时订几个房间,就会出来一个订单号多条数据,这样子联系人都是重复的,就会造成数据冗余。我们应该把他拆开来。
六、第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话) 这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。 如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结 构。所以不能一味的去追求范式建立数据库。
十七、表约束
一、什么是约束
约束实际上就是表中数据的限制条件
二、约束作用
表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
三、约束种类
- 非空约束(not null)
- 唯一性约束(unique)
- 主键约束(primary key) PK
- 外键约束(foreign key) FK
- 检查约束(目前MySQL不支持、Oracle支持)
四、非空约束
用not null约束的字段不能为null值,必须给定具体的数据
- 默认,所有的类型的值都可以是NULL,包括INT. FLOAT等数据类型
- 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
- 一个表可以有很多列都分别限定了非空
- 空字符串不等于NULL,0也不等于NULL
五、唯一约束
unique约束的字段,具有唯一性,不可重复,但可以为null
- 同一个表可以有多个唯一约束。
- 唯一约束可以是某一个列的值唯一, 也可以多个列组合的值唯一。
- 唯一性约束允许列值为空。
- 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
- MySQL会给唯一约束的列上默认创建一个唯一索引。
五-1、唯一约束 --- 表级约束(1)
在建表的时候,单独的用unique(字段) 来设置字段的约束
五-2、唯一约束 --- 表级约束(2)
使用表级约束,给多个字段联合约束
五-3、唯一约束 --- 表级约束(3)
表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
constraint是约束关键字,t_user_email_unique 自己取的名字
六、主键约束(primary key)PK
主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录
表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
主键约束与“not null unique”区别
- 作为Primary Key的域/域组不能为null,而Unique Key可以。
- 在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的, 具体到某一列可能会重复。
- 更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。
一张表应该有主键字段,如果没有,表示该表无效
主键值:是当前行数据的唯一标识、是当前行数据的身份证号 即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
六-1、主键约束---分类
1.按主键约束的字段数量分类
无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好 几个字段)
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)
- 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。!
- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
- 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识, 如果修改了主键的值,就有可能会破坏数据的完整性。
六-2、主键约束-复合主键(表级定义)
在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动 生成,自增数从1开始,以1递增(auto_increment)
(1) 一个表最多只能有一个自增长列
(2)当需要产生唯一标识符或顺序值时,可设置自增长
(3)自增长列约束的列必须是键列(主键列,唯一键列)
(4)自增约束的列的数据类型必须是整数类型
(5)如果自增列指定了0和null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。!
七、外键约束(foreign key)FK
什么是外键?
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键
A为基本表或父表,主表;B为信息表,子表,副表
只能是表级定义
foreign key(表的字段名) references 父表表名(父表的字段名)!
某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
按外键约束的字段数量分类
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
注意:
一张表可以有多个外键字段(与主键不同)
外键值可以为null
外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束 有了外键引用之后,表分为父表和子表
班级表:父表
学生表:子表
创建先创建父表
删除先删除子表数据
插入先插入父表数据
班级表👇
学生表👇
八、约束的添加
添加非空约束:
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 父表(父表字段名);
九、 约束的删除
删除not null约束:
alter table 表名 modify 列名 类型;
删除unique约束:
alter table 表名 drop index 唯一约束名;
删除primary key约束:
alter table 表名 drop primary key;
删除foreign key约束:
alter table 表名 drop foreign key 外键名;
#下一篇:DML数据操作语句和基本的DQL语句