目录
[数据库存储引擎-MyISAM 和InnoDB区别](#数据库存储引擎-MyISAM 和InnoDB区别)
[非空约束(not null)](#非空约束(not null))
[主键约束(primary key)PK](#主键约束(primary key)PK)
[外键约束(foreign key)FK](#外键约束(foreign key)FK)
[删除not null约束](#删除not null约束)
[删除primary key约束](#删除primary key约束)
[删除foreign key约束](#删除foreign key约束)
SQL语句介绍:
SQL语句,即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。
|-------------|-------------------------|-----------------------|
| 名词 | 解释 | 命令 |
| DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | CREATE、DROP、ALTER |
| DML(数据操作语言) | 用于操作数据库对象中所包含的数据 | INSERT、UPDATE、DELETE |
| DQL(数据查询语言) | 用于查询数据库数据 | SELECT |
| DCL(数据控制语言) | 用来管理数据库的语言,包括管理权 限及数据更改 | GRANT、COMMIT、ROLLBACK |
DDL创建数据库:
语法:
CREATE TABLE[IF NOT EXISTS] `表名`(
`字段名1` 字段类型[属性][索引][注释],
`字段名2` 字段类型[属性][索引][注释],
......
`字段名n` 字段类型[属性][索引][注释],
)[表类型][表字符集]
其中'[]'包含的内容可以省略围
|----------------|----------------------------------|-------------------|----------------|
| 类型 | 说明 | 取值范围 | 存储需求 |
| 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 |
char和varchar比较
数值类型
|---------------------|-----------|-----------------------------------------|------|
| 类型 | 说明 | 取值范围 | 存储需求 |
| tinyint【taɪni】 | 非常小的数据 | 有符值:-2 ^7 ~ 2^7-1,无符号值: 0 ~ 28-1 | 1字节 |
| smallint | 较小的数据 | 有符值:-2 15 ~ 215 -1 ,无符号值: 0 ~ 216 -1 | 2字节 |
| mediumint 【miːdiəm】 | 中等大小的数据 | 有符值:-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(钱) 【desɪml】 | 字符串形式的浮点数 | decimal(m, d) | m个字节 |
数据库存储引擎
查看当前数据库支持的存储引擎:show engines;
数据库存储引擎------InnoDB
MySQL从3.23.34a开始就包含InnoDB存储引擎。大于等于5.5之后,默认采用InnoDB引擎。
• InnoDB是MysQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
• 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。
• 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
• 数据文件结构:
• 表名.frm存储表结构(MySQL8.0时,合并在表名.ibd中)。
• 表名.ibd存储数据和索引
• InnoDB是为处理巨大数据量的最大性能设计。
• 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比如: .frm,.par , .trn ,.isl, .db.opt等都在MySQL8.0中不存在了。
• 对比MylISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保存数据和索引。
• MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。
数据库存储引擎------MyISAM
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
• 5.5之前默认的存储引擎
• 优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用
• 针对数据统计有额外的常数存储。故而count(*)的查询效率很高
• 数据文件结构:
• 表名.frm存储表结构。
• 表名.MYD存储数据(MYData)。
• 表名.MYI存储索引 (MYIndex)
• 应用场景:只读应用或者以读为主的业务
数据库存储引擎-MyISAM 和InnoDB区别
|------|------------------------------|------------------------------------------|
| 对比项 | MyISAM | InnoDB |
| 外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 行表锁 | 表锁,即使操作一条记录也会锁住整 个表,不适合高并发操作 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发操作 |
| 缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存 要求较高,而且内存大小对性能有决定性的影响 |
| 默认安装 | Y | Y |
| 默认使用 | N | Y |
| 关注点 | 性能:节省资源、消耗少、简单业务 | 事务:并发写,事务、更大资源 |
修改和删除数据库表
修改表名:AITER TABLE 旧表名 RENAME AS 新表名
修改字段:ALTER TABLE 表名 MODIFY 字段名 列类型[属性] ALTER TABLE 表名 CHANGE 旧段名 列类型[属性]
删除字段:ALTER TABLE 表名 DROP 字段名
添加字段:ALTER TABLE 表名 ADD 字段名 列类型[属性]
删除表:DROP TABLE [IF EXISTS] 表名
数据库设计三大范式
一、什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就叫做范式。
二、约束作用
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
三、三范式
第一范式:确保每列保持原子性
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关,而不是间接相关
第一范式(1NF)确保每列保持原子性
第二范式(2NF)属性完全依赖于主键
第三范式(3NF)属性不依赖于其他非主属性 属性直接依赖于主键
注:数据不能存在传递关系,即每个属性都跟主键右直接关系而不是间接关系
约束?
实际上就是表中数据的限制条件
作用?
表在设计时加入约束就是为了保证表中的记录完整和有效
约束种类?
非空约束(not null)
用not null约束的字段不能为null值,必须给定具体的数据
create table test1(
name varchar(20) not null,
age int
);
Insert into test1(age) values(16) //这里只给age字段名存值,并没有给不
//为空的name存值,mysql会报错
唯一性约束(unique)
unique约束的字段,具有唯一性,不可重复,但可以为null
表级约束:
- 在建表时,单独用unique(字段)来设置字段的约束
- 使用表级约束,给多个字段联合约束
- 表级约束可以给约束起名字
create table test1(
id int(10),
name varchar(20) not null,
email varchar(128),
unique(name,email)
);
主键约束(primary key)PK
主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录
表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
复合主键(表级定义)
create table test1(
id int(10),
name varchar(20) not null,
email varchar(128),
primary key(id,name)
);
外键约束(foreign key)FK
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键
A为基本表或父标,主表,B为信息表,子表,副表
创建外键:
foreign key(表的字段名) references 父表表名(父表的字段名)
按外键约束的字段数量分类
单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束
注意:
一张表可以有多个外键字段(与主键不同)
外键值可以为null
外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束
有了外键引用之后,表分为父表和子表
班级表:父表
学生表:子表
创建先创建父表
删除先删除子表数据
插入先插入父表数据
检查约束(目前MySQL不支持,Oracle支持)
约束的添加:
添加非空约束
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 外键名;