目标:
1. 理解什么是存储引擎,为什么需要存储引擎。
2. 掌握常见存储引擎Innodb和MyISAM的优缺点及适用场景。
3. 掌握DML语句的增加INSERT、删除DELETE和TRUNCATE、更新UPDATE。
4. 理解逻辑删除和物理删除及不同业务场景如何选择删除的方式。
一、数据库储存引擎
(1)MySQL支持很多储存引擎,其中InnoDB和BDB支持事务安全,详细查询如下:
按键盘的win+r键,输入cmd,在输入框输入mysql -uroot -p,之后输入密码,打开后再输入show engines;即可查看支持的引擎,或者直接在DataGrip中输入show engines;运行即可查看。如下图
注:InnoDB是MySQL默认的存储引擎
(2)储存引擎对比如下表:
特点 | InnoDB | MyISAM | Memory | Archive |
储存限制 | 64TB | 256TB | 有 | 无 |
事务安全 | 支持 | / | / | / |
支持索引 | 支持 | 支持 | 支持 | / |
锁颗粒 | 行锁 | 表锁 | 表锁 | 行锁 |
数据压缩 | / | 支持 | / | 支持 |
支持外键 | 支持 | / | / | / |
锁颗粒注释:
行锁:锁住一行的数据,即当你在编辑这一行的时候,其他人不能对此行进行编辑,只有等到编辑完成后其他人才可以进行编辑
表锁:锁住整张表格,即当你在进行编辑这张表的时候,其他人不能对此表进行编辑,当你完成编辑后才可以进行编辑
二、数据库DML操作 ★
MySQL中的大小写问题:1、在window系统下,不区分大小写(可以配置),在Linux系统下严格区分大小写 。其中列名是忽略大小写的。
代码部分
# 插入数据库
create database if not exists date; # datebase数据库,table数据表
use date; # 使用数据库
create table if not exists student(
uid int(5) zerofill primary key auto_increment, # id长度5,主键自增长,这里不懂看上一篇,zerofill表示零填充,即输入1变为00001在数据库中储存
name varchar(255),
telephone char(11) unique,
age int(3) not null,
sex tinyint # 0男 1女
);
# 上面代码在上一篇有介绍:https://blog.csdn.net/Timeers/article/details/120214491
# 插入数据的方式
insert into date.student values (0, 'June', 13921254893, 18, 0); # 全列插入
insert into date.student (name, age) values ('Anne', 18); # 缺省插入,即指插入date.student后面括号内容的数据(name和age)
insert into date.student (name, age) values ('Andy', 18), ('Joke', 17); # 插入多条信息,name和age依然是限制条件,插入的信息使用逗号分隔,即插入了Andy和Joke两条数据
# 插入多条全列数据同理,如下:
insert into date.student values (0, 'June', 13921254893, 18, 0),
(0, 'Ross', 15711235487, 15, 1),
(0, 'Fred', 14523832361, 17, 0); # 如再需要添加往后即可,最后分号结尾表示完成,此插入数据的方法效率高于第一种全列插入
# 关于更新数据表
update date.student set name='Karl' where name='Andy'; # 将数据表中的Andy全部改名为Karl 特别注意:不加入where将提醒,点击Execute将全部name列的数据替换为Karl(慎用)
# 显示/查询 数据 基础格式:select 要展示的列其中*表示全部 from 库名.表名
select * from date.student; # 显示出来数据,格式:select *(这个*表示全部,也可以指定,比如name,输入name则表示展示列名为name的全部数据) from 库名.表名
select s.name as Name, s.age as AGE from date.student as s;
# 查询date下名字为t_student的·数据表,并取名为s; s.name as Name 的含义是展示数据表student中的名字一列,并取名为Name显示
# 关于删除
delete from date.student where sex=0; # 删除性别为男的全部数据,即删除数据库中满足where后面条件的全部数据(整行), 特别注意:不加上where会警告,点击Execute确定会删除全部数据(慎用)
truncate table date.student; # 删除表格全部数据,不可以加上where,直接清空全部数据,不会警告,并且效率比delete高
drop table date.student; # 无论有无数据,都将删除整张表
导入导出; 利用工具实现表格数据的导入和导出功能 导出:在数据库或者表格上鼠标右键选择Dump Date to File,选择导出到的文件位置即可 导入:在库或者表格上鼠标右键Import Date from File,选择导入的数据库即可(如果表不存在,会自动创建,存在则会插入数据,注意数据格式) Alt + 鼠标左键 可以连选多行进行同时修改,再按esc键即可退出 位是计算机最小的计算单位,即0或者1,每一个二进制数字占1个位数,字节则是由8为构成的,即B,换算单位如下 8位(byte)=1字节(B) 1024B=1KB 1MB=1024KB 1GB=1024MB 1T=1024G 1PB=1024T 一般utf-8编码下,一个汉字字符占用3个字节;gbk编码下,一个汉字占2个字节。 utf-8和utf8mb4区别,utf-8最多储存3个字节长度,而utf8mb4可以储存4个字节,如emoji表情便是一种特殊的Unicode编码
三、物理删除和逻辑删除
(1)物理删除
将数据库彻底删除即叫物理删除,删除后将无法恢复,比如delete、truncate,对于一些重要的数据,建议采取逻辑删除的方式,以防找不到数据
(2)逻辑删除
逻辑删除本质是修改(UPDATE)操作,对于重要数据表,增加一个isDelete字段,一般默认为0(没有被删除的的意思),该字段逻辑上表示该条数据是否被删除,真实情况是在数据库中本条数据还存在。
代码如下
create table if not exists date.student(
id int not null auto_increment primary key ,
age int,
name char(20),
isDelete bit default 0 # bit二进制字节,isDelete相对于再加了一个数据类型,默认给值0表示没删除
)engine=innodb default charset=utf8;
补充:INT[(M)] [UNSIGNED] [ZEROFILL] M 默认为11,10 就是上述语句里的 M,指最大显示宽度,最大值为 255;int 类型在数据库里面存储占 4 个字节的长度
即int类型可以不给宽度,如age int,如果给了宽度,那么就会补充,如age int(5),当你输入1的时候储存将储存为00001,显示的时候不显示前面的0,但是vachar和char必须给宽度,即name char(20),如果不给宽度程序将会报错。