-
数据的存储方式
- 数据存储在内存中,也就是说数据断电消失 1个文件:memory
- 数据存储在硬盘上,也就是说数据持久化存储:innodb,myisam
- 数据和索引一张表,表结构一张表:innodb(5.6以后mysql的默认存储引擎)
- 数据和索引不存在一起(索引1个文件,数据1个文件,表结构1个文件):myisam(5.5以前MySQL的默认存储引擎)
-
存储引擎介绍:存储数据的方式
-
Innodb存储引擎(2个文件);**MySQL5.6版本后的默认引擎
- 支持事物:为了保证事物的完整性,把多个操作变成原子性操作。
- 支持行级锁:修改的行少的时候使用,在修改数据频繁的时候是具有效率优势的
- 表级锁:批量修改多行的时候使用,对于大量数据同时修改是有好处的
- 支持外键:约束两张表中的关联字段不能随意的添加或删除,能够极大降低数据增删改的出错率。
-
myisam存储引擎(3个文件),5.5之前默认的,支持表级锁.
-
memory 存储引擎,只存表结构,断电消失
-
面试题:
- 你了解MySQL的存储引擎么?你的项目用了什么存储引擎,为什么?
- 了解一些
- innodb
- 多个用户操作的过程中对同一张表的数据同时修改
- innodb支持行级锁,所有我们使用了这个存储引擎
- 为了适应程序未来的扩展性,扩展新功能的时候可能会用到。。。。涉及到要维护数据的完整性
- 项目中有一两张***表,之间的外键关系是什么,一张表的修改或者删除比较频繁,怕出错所有选择了innodb
- 你了解MySQL的存储引擎么?你的项目用了什么存储引擎,为什么?
-
show engines;简单地显示存储引擎
-
查看引擎:show variables like '%engin%';
-
查看当前数据库:Select database()
-
显示表的创建信息:Show create table 表名
-
-
表介绍:
-
创建表:
create table 表名( id int primary key auto_increment, name char(18), ....... )
-
插入数据的方式
- insert into student values (2,'wusir'),(3,'hqq'); 插入多条数据
- insert into student values(值1,值2,值3) 插入单条数据
- 指定字段名写入:
- insert into student(字段1,字段2,字段3) values (值1,值2,值3) 指定要插入的字段 插入;
-
查看表中数据
- select * from 表
-
查看表结构:
- desc 表名;(describe)
- 能够看到有多少个字段,类型,长度,看不到编码,引擎,具体约束信息
- show create table 表名G
- 啥都能看
- desc 表名;(describe)
-
表的完整性约束
-
约束某一个字段
-
无符号:unsigned
-
不能为空:not null
-
默认值是什么:default
-
唯一约束:unique,值不能重复,但是null可以写入多个。
-
联合唯一:unique (字段1,字段2)
-
自增id:auto_increment
- 至少是unique的约束之后才能自增约束
- id int primary key auto_increment
-
主键:primary key
- 一张表只有一个
- 如果不指定,默认是第一个非空并且唯一
- 联合主键 primary key(字段1,字段2)
-
外键:
-
学生表
create table student( id int primary key auto_increment, name char(12) not null, gender enum('male','female') default 'male', class_id int, foreign key (class_id) references 班级 (cid) on update cascade on delete cascade )
-
-
班级表
~~~ create table 班级( cid int primary key auto_increment, cname char(12) not null, start_time date )
-
-
非空+唯一约束:
- 第一个被定义为非空+唯一的那一列会成为这张表的primary key。
-
设置主键:primary key id
-
联合主键;
- primary key(ip,port) # 自动会给ip,port设置一个默认default ' '
-
-
修改表结构
-
删除表:
- drop 表名
-
多表结构的关系分析:
-
多对一
-
学生,班级
-
多个学生是一个班级
-
学生表有一个外键 关联班级表
-
-
书籍 作者
- 多本书可以是一个作者写的
- 书籍有一个外键 关联作者表
-
商品 订单
- 多个商品可以在一个订单中
- 商品表有一个外键 关联订单表
-
书籍 出版社
- 多本书可以同一个出版社出版的
- 书籍表有一个外键 关联出版社表
-
-
多对多:
- 学生 班级 多对一
- 多个学生是一个班级的
- 班级 学生 多对一
- 多个班级对应一个学生
- 出现第三张表
- 学生 班级 多对一
-
一对一
- 客户 -- 学生
- unique foreign key
-
-
MySQL中的数据类型:
-
数字
-
Tinyint 1个字节(256种情况) (-128,127) (0,255) 小正数 ,如果年龄(要unsigned约束)
-
smallint 2个字节
-
mediumint 3字节
-
Int 4个字节 最多表示十位数
-
bigint 8字节
-
float 4 字节
- float(总位数,小数部分位数)
-
double
- double(总位数,小数部分位数)
create table t1( id int,# 默认有符号的,如果需要定义无符号,用unsigned age tinyint unsigned ) desc t1 inser into t1 values(1,100)
-
decimal :精确到小数后20位,总共30位,默认10,0。
-
-
字符串
- char 0-255 定长字符串
- char(字符个数) 最多只能表示255个字符
- 定长存储 'hqq' —》'hqq ',节省时间,浪费空间。
- varchar 0-65535个字符
- varchar(字符个数)
- 变长存储 'hqq' —》'hqq4',节省空间,效率低,存取速度慢
- 什么时候用char 或者varchar?
- char :
- 省份证号,手机号,QQ号,username(12-18),password(10-16或32),银行卡号
- varchar:
- 评论,朋友圈,微博
- char :
- char 0-255 定长字符串
-
时间: 常用的 date time datetime
- datetime:8字节
- 20190620121900
- year:1900-2155 1个字节
- Date:1000-01-01/9999-12-31 3个字节
- 20190620
- time:'-838:59:59'/'838:59:59' 3个字节
- 121900
- timestamp 4个字节
- 1970-01-01 00:00pass
- datetime:8字节
-
enum/set:
- Enum :单选行为
- set : 多选行为
-
-
修改表的操作进阶:
- 修改表名:alter table 表名 rename 新表名
- 增加字段:alter table 表名 add 字段名 数据类型 [约束条件]
- alter table 表名 add 字段名 数据类型 after 字段名
- pass
- 修改字段:
- alter table 表名 modify name 要改的类型;
-
例子
create table publish(id int auto_increment primary key,title char(32),addr char(32)); create table test(title char(32),addr char(32));