MySQL第三讲
昨日内容回顾
公钥私钥
数据库存储引擎
MyISAM
是5.5版本之前默认的存储引擎
存取数据的速度较快、但是安全性偏差
三个文件
结构、索引、数据
InnoDB
5.5版本及之后默认的存储引擎
存取数据的速度较MyISAM偏慢、但是安全性更高、能够支持更多的功能
两个文件
结构、数据
BlackHole
黑洞
存什么就消失什么
一个文件
结构
memory
内存
所有的数据都是直接保存在内存中的断电立刻丢失
一个文件
结构
创建表的完整语法
create table 表名(
字段名1 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
字段名2 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
字段名3 字段类型(宽度) 约束条件1 约束条件2 约束条件3,
字段名4 字段类型(宽度) 约束条件1 约束条件2 约束条件3
);
"""
注意事项
1.宽度、约束条件不是必须的可写可不写
2.最后一个不能加逗号
3.约束条件可以有多个 空格隔开即可
"""
严格模式
能让数据库少干活就尽可能的少干活
show variables like ‘%mode%‘
sql_mode严格模式
5.6版本及以前的默认没有任何的严格模式
往后的版本默认都有严格模式
STRICT_TRANS_TABLES
set global sql_mode = ‘STRICT_TRANS_TABLES‘
设置完成后只需要退出客户端重新进入即可
整型
tinyint 1个字节(bytes)
smallint 2个字节(bytes)
int 4个字节(bytes)
bigint 8个字节(bytes)
"""
单位换算
8bit >>> 00000000
8bit = 1bytes
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
"""
针对整型字段类型无序添加宽度
因为它自带的宽度已经足够使用了,并且也不是用来限制存储长度的
浮点型
float(255,30)
double(255,30)
decimal(65,30)
第一个数字表示的是总共多少位、第二个数字表示的小数部分占多少位
精确度
float < double < decimal
"""
有时候如果遇到了某个数据类型精确度的问题
那么你可以尝试着用其他数据类型来存储
在工作中我们开发会经常使用字符串来存储看似是数字的数据
"""
字符类型
char(4) # 定长最大只能存储四个字符、超出直接报错、不超默认用空格补全
varchar(4) # 变长最大只能存储四个字符、超出直接报错、不超有几个存几个
"""
5.6版本及之前如果你不设置严格模式,插入数据的时候是不会报错的
name char(4)
values(‘jason‘) 1.没有设置只会存储jaso 2.设置之后才会报错
"""
char(4)
存取数据的速度都很快(暴力)
浪费存储空间
varchar(4)
节省存储空间
存取数据的速度较于char都很慢
char与varchar在后面创建表的时候都可以使用、具体还可以结合业务逻辑来
日期类型
date 年月日
time 时分秒
datetime 年月日时分秒
year 年
...
枚举与集合类型
枚举类似于多选一
enum(‘male‘,‘female‘,‘others‘)
集合类似于多选多(也可以只选一个)
set(‘read‘,‘study‘,‘music‘,‘running‘)
约束条件
"""
在插入数据的时候有两种插入方式
1.insert into t1 values()
t1表里面有几个字段你括号里面就要对应给几个数据
2.insert into t1(name,password) values() 按照括号内书写的字段添加数据
"""
1.not null 非空
id int not null
2.default 默认值
name char(16) default ‘jason‘
id int default 666
该字段你给值的情况就用默认的如果你给了就用你的
3.unique 唯一
1.单列唯一
id int unique
id字段的数据不能重复
2.联合唯一 host char(16) port int unique(host,port)
4.primary key 主键
"""
在InnoDB存储引擎下
1.规定了一张表有且必须要有一个主键
2.如果你没有指定主键那么会有两种补救措施
2.1 会从上往下寻找一个not null unique的字段自动升级为主键
2.2 就会用一个内部隐藏的字段(迫不得已)
"""
约束效果等价于not null unique
但是还有额外的功能 提高查询数据的速度
id int primary key
一般情况下一张表中都会有一个id字段并且该字段一般就是主键字段
5.auto_increment 自增
"""
auto_increment不能单独使用
必须配合
primary key
unique一起使用
错误案例
id int auto_increment
"""
id int primary key auto_increment
name char(16)
insert into t1(name) values(‘jason‘)
如果你没有写括号说明需要填写的字段 那么默认需要你自己给
今日内容概要
表与表之间的关系
如何确定
如何建立
操作表的其他命令
表与表之间关系
"""
表与表之间的关系只有四种
一对多
多对多
一对一
没有关系
"""
我们的员工表有哪些不足之处
1.表结构不清晰(侧重点不清晰)
2.录入的数据有很多是重复的(浪费存储空间)
3.在修改数据的时候扩展性很差(修改的数据条目非常多)
如果将员工表一分为二到底是优化了还是复杂了
上述的三个问题都解决了
如何限制字段输入的值
create table emp(
id int primary key auto_increment,
name char(16),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
# 将本表中的dep_id字段跟dep表中的id字段建立关系
);
create table dep(
id int primary key auto_increment,
dep_name char(32),
dep_desc char(64)
);
一对多关系判断
"""
在判断表关系的时候一定要
换位思考(要站在双方的角度思考问题)
"""
一对多的表关系判断
以员工表为例
1.先站在员工表的基础之上
问一个员工能否对应多个部门 不可以
2.再站在部门表的基础之上 问一个部门能否对应多个员工 可以 下结论 员工跟部门是单向的 只要是单向的那么表关系就是 一对多
"""
只要有一个是可以的就是一对多的关系
"""
一旦确立了表关系之后 关系字段应该放在哪张表???
表关系如果是一对多的话 那么外键字段建在多的一方
员工表是多的一方 所有外键字段放在员工表里面 dep_id
dep_id就是外键字段(用来表示表与表之间关系的)
create table emp(
id int primary key auto_increment,
name char(16),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
# 将本表中的dep_id字段跟dep表中的id字段建立关系
);
create table dep(
id int primary key auto_increment,
dep_name char(32),
dep_desc char(64)
);
创建外键字段注意事项
1.要创建被关联表(没有外键字段的表)
2.插入数据要先录入被关联表的数据才能录入关联表的数据(没有外键字段的表)
insert into dep(dep_name,dep_desc) values
(‘外交部‘,‘搞外交‘),
(‘讲师部‘,‘教书育人‘),
(‘技术部‘,‘技术能力有限部门‘);
insert into emp(name,age,dep_id) values
(‘jason‘,18,1),
(‘tony‘,32,2),
(‘jack‘,30,2),
(‘tom‘,45,2),
(‘kevin‘,18,3);
3.关系表之间数据的同步更新同步删除
外键创建好了之后 被关联表的id字段无法修改
update dep set id=200 where id=1;
外键创建好了之后 被关联表的数据无法删除
delete from dep where id=1;
create table emp(
id int primary key auto_increment,
name char(16),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
create table dep(
id int primary key auto_increment,
dep_name char(32),
dep_desc char(64)
);
多对多关系
以图书跟作者表为例
判断表关系查看群内截图即可
create table book(
id int primary key auto_increment,
title varchar(16),
price float(10,2),
author_id int,
foreign key(author_id) references author(id)
on update cascade # 同步更新
on delete cascade # 同步删除
)
create table author(
id int primary key auto_increment,
name char(16),
gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘,
book_id int,
foreign key(book_id) references book(id)
on update cascade # 同步更新
on delete cascade # 同步删除
)
"""针对多对多的表关系,需要你创建一个第三张表来专门存储"""
create table book(
id int primary key auto_increment,
title varchar(16),
price float(10,2)
);
create table author(
id int primary key auto_increment,
name char(16),
gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘
);
create table book2author(
id int primary key auto_increment,
book_id int, foreign key(book_id) references book(id) on update cascade # 同步更新 on delete cascade, # 同步删除 author_id int, foreign key(author_id) references author(id) on update cascade # 同步更新 on delete cascade # 同步删除
);
图书表和作者表里面的数据随意的插入都没有问题
只要确保在插入图书和作者的第三张关系表的时候得注意
insert into book(title,price) values
(‘阿甘正传‘,666.66),
(‘三体‘,999.66),
(‘曾国藩‘,789.66),
(‘西游记‘,123.66),
(‘聊斋‘,456.66);
insert into author(name) values
(‘jason‘),
(‘tony‘),
(‘tom‘);
insert into book2author(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(2,1),
(2,4),
(2,5),
(3,1),
(3,2);
第三张表分别跟另外两张表是有删除和更新关系的 两张表之间现在没有任何影响
delete from author where name=‘tom‘;
多对多表关系的维护只需要第三张表来维护即可
一对一关系
实际案例
1.qq用户信息展示
一张表中用户的信息非常多,但是并不是所有的信息都是需要经常使用的
那么这种情况下就可以将一张表拆分成两张表 然后做一对一的表关系
create table authordetail1(
id int primary key auto_increment,
phone int,
addr char(255)
);
create table author(
id int primary key auto_increment,
name char(4),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail1(id)
on update cascade
on delete cascade
);
外键字段总结
一对多外键字段建在多的那一方
多对多外键字段建在第三方表中
一对一外键字段建在任何一方都可以,但是推荐你建在查询频率较高的那张表中
修改表操作
mysql对大小写不敏感!!!
语法:
- 修改表名
ALTER TABLE 表名
RENAME 新表名; - 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; - 删除字段
ALTER TABLE 表名
DROP 字段名; - 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];