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 旧字段名 新字段名 新数据类型 [完整性约束条件…];
MySQL第三讲的更多相关文章
- MySQL第三讲 一一一一 视图、触发器、函数、存储过程
1. 视图 1.1 视图前戏 我们之前讲有,临时表的概念. 现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 1 ...
- python全栈开发教程目录
python入门到进阶 Python基础2——数据类型的操作 Python基础——函数入门 Python基础——函数进阶 Python基础——函数的装饰器 Python基础——函数的装饰器 Pytho ...
- MySQL实战45讲学习笔记:事务隔离级别(第三讲)
一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...
- MySQL实战45讲学习笔记:第四十三讲
一.本节概述 我经常被问到这样一个问题:分区表有什么问题,为什么公司规范不让使用分区表呢?今天,我们就来聊聊分区表的使用行为,然后再一起回答这个问题. 二.分区表是什么? 为了说明分区表的组织形式,我 ...
- MySQL实战45讲学习笔记:第三十三讲
一.引子 我经常会被问到这样一个问题:我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了? 这个问题确实值得担心,被系统 OOM(out of mem ...
- MySQL实战45讲学习笔记:第十三讲
一.引子 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题. 这里,我们还是针对 ...
- MySQL实战45讲学习笔记:第二十三讲
一.本节概要 今天这篇文章,我会继续和你介绍在业务高峰期临时提升性能的方法.从文章标题“MySQL 是怎么保证数据不丢的?”,你就可以看出来,今天我和你介绍的方法,跟数据的可靠性有关. 在专栏前面文章 ...
- 深挖计算机基础:MySQL实战45讲学习笔记
参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...
- MySQL锁(一)全局锁:如何做全库的逻辑备份?
数据库锁设计的初衷是处理并发问题,这也是数据库与文件系统的最大区别. 根据加锁的范围,MySQL里大致可以分为三种锁:全局锁.表锁和行锁.接下来我们会分三讲来介绍这三种锁,今天要讲的是全局锁. 全局锁 ...
随机推荐
- 火山引擎MARS-APM Plus x 飞书 |降低线上OOM,提高App性能稳定性
通过使用火山引擎MARS-APM Plus的memory graph功能,飞书研发团队有效分析定位问题线上case多达30例,线上OOM率降低到了0.8‰,降幅达到60%.大幅提升了用户体验,为飞书的 ...
- python02day
回顾 1.编译型和解释型 编译型:一次性编译成二进制,再执行 执行效率高,但不能跨平台,开发效率低 代表语言:C 解释型:逐行解释成二进制,再执行 可以跨平台,开发效率高,但执行效率低 代表语言:py ...
- 资本主义反抗指南精要(v0.1)
(1)充分预估工作时间,比如一小时的开发任务,你可以加上技术调研,API/数据库设计,单元测试,联调,集成测试等等,拖到一天,同理一天的任务可以拖到一星期. (2)简历上尽一切手段来美化,最好能包装成 ...
- 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二
AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...
- Swift中类的使用
主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是Swift中的 ...
- centos7 安装yum源
centos7的服务器,没有yum,没有wget命令真的寸步难行,经过总结和查询,现在算搞定了,把经验总结一下,以免大家再浪费时间去找原因: 安装yum需要wget安装yum的rpm包,所以前提是先有 ...
- java多线程编程(二)
1. wait 和 sleep 区别? 1.wait可以指定时间也可以不指定,sleep必须指定时间. 2.在同步中时,对cpu的执行权和锁的处理不同. wait:释放执行权,释放锁. sleep ...
- HEAAN库学习
本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...
- 对常用I/O模型进行比较说明
一.IO模型的四个特性 关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知. 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用 ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...