数据库演变史
分为四个阶段
1.纯文件阶段 各自写各自的格式不统一
2.规定开发目录规范 还是各自写各自的
3.存储位置和格式确定,使用统一的
单机游戏 自己电脑存放自己电脑的
联机游戏 所有数据存在公用的一个数据库里
软件开发架构以及数据库本质
分为c/s架构和b/s架构
c/s:client 客户端 server:服务端
b/s:Browser 浏览器 server:服务端
数据库本质就是一款c/s架构的软件
数据库分类
关系型数据库 #固定表结构 采用
mysql、mariadb、Oracle、postgresql、sqlite、db2、sqlserver
非关系型数据库 #没有固定表结构 数据存储采用key、value形式
redis、mongodb
数据库下载与安装
官网 下载 5.5 5.6 5.7 8.0
点击downloads
点击GPL
选择社区版(community)
点击archives
# windows安装
1.解压文件夹
2.介绍:服务端(mysqld.exe) 客户端(mysql.exe)
3.先启动服务端 之后再使用客户端链接
系统服务制作
1.环境变量 # path 加上mysql文件夹bin的目录
2.以管理员的身份添加系统服务
mysqld --install #会发现服务多了一个mysql
3.启动就好
net start mysql
'''
停止服务
net stop mysql
移除服务
mysqld --remove
'''
基本操作命令
1.登录
mysql -u用户名 -p密码 -hIP地址 -P端口
mysql -uroot -p123 -h192.168.15.xxx -p 3306
2.数据库
查看:show databases
退出:exit
取消:\c
更改密码以及配置文件
# 修改密码的两种方式
mysqladmin -u用户名 -p原密码 -password 新密码
# mysqladmin -uroot -p -password 123 #默认密码改为123
set password=PASSWORD('新密码')
# 忘记密码操作
停止正常的mysql服务 然后以跳过授权表的方式重新启动
net stop mysql
mysqld --skip-grant-tables #跳过授权
以管理员身份登录修改指定表中的用户数据
update mysql.user set password=PASSWORD(123) where user='root' and host="localhost";
重启
数据库概念
库 文件夹
表 文件夹里面的文件
记录 文件夹里面的文件里面的一行行数据
基本SQL语句
针对库 针对表 针对记录
存储引擎
MySQL基本数据类型
整型 浮点型 字符类型 时间类型 枚举与集合类型
基本SQL语句操作之库
#增 create databse 数据库名称
create database db156; #创建数据库db156
#删 drop database 数据库名称
drop database db156; #删除数据库
#改 alter database 数据库名称 charset='字符编码';
alter database db156 charset='gbk'
改完可以查询一下看看 show create database db156;
#查 show create database 数据库名称
show databases;#查看所有数据库
show create database db156; #查看单个数据库 创建语句,字符编码等
基本SQL语句操作之表
#增加前需要进入到这个数据库 select database(); 查看当前所在数据库 use 数据库名称 切换数据库
use db156 #切换成功会出现下面这个语句
Database changed
-------------------------------------------------------------------------------------
#增 create table 表名称(字段 字段类型 )这个是不完整的 下面会有完整语法
create table edg(id int);
#删 drop table 表名;
drop table edg;
#改 alter table 表名 rename 新表名; charset :指定字符编码
alter table edg rename rng;
#查 show create table 数据表名称
show tables; #查看所有表
show create table edg; #查看单个数据表 以及他的创建语句 字符编码等
describe edg; #可以简写 desc edg; 查看单个表信息
基本SQL语句操作之记录
"""
操作记录之前必须要有库 表
"""
#增 insert into 表明 values(对应表设置的格式)
insert into edg values(1,'hahaha');
#删 delete from 表名 where 条件
delete from edg where id=2
#改 update 表名 set 字段名='新的字段值' where 条件 字段=具体的值
update edg set name='dijia' where id =2;#不加where条件修改整张表
#查 select * from 表名; *可以替换成字段名称
select * from edg;
select name from edg;
#查看存储引擎 show engines;
需要掌握以下四个
MyISAM #速度快不安全
是MySQL5.5版本之前默认的存储引擎
优点:该引擎存取数据的速度都很快
缺点:但是安全性较低 不支持很多额外的功能
InnoDB #安全 速度相对于myisam慢
是MySQL5.5版本之后默认的存储引擎
优点:该引擎支持事务、行级锁、外键
#简单了解下
事务:多条sql语句执行了一条 ,其他没执行,可以回退 时间回退
行级锁:表中的数据,锁住一行只能一人访问,还有表级锁 这个表只能一人操作,他操作完其他人才可以操作
外键:表与表之间的关系
缺点:存取数据的速度没有MyISAM快但是功能和安全性更高
memory #内存
数据全部存储在内存中 速度很快但是断电立刻丢失
blackhole #垃圾堆 回收站
黑洞 任何放入其中的数据都会消失(类似于垃圾处理站)
#创建四个表分别用 myisam InnoDB memory blackhole
create table a1 (id int) engine=myisam;
create table a2 (id int) engine=InnoDB;
create table a3 (id int) engine=memory;
create table a4 (id int) engine=blackhole;
# 不同存储引擎文件后缀名
MyISAM
三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引
InnoDB
两个文件 #所以速度比较慢
.frm 表结构
.ibd 数据与索引
memory #在内存里面存
.frm 表结构
blackhole #回收站不需要数据
.frm 表结构
#插入数据
insert into a1 values(1);
insert into a2 values(1);
insert into a3 values(1); #因为存在内存 重启后消失
insert into a4 values(1); #垃圾堆没有东西,扔进去文件相当于删除
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
);
# 注意事项
1.字段名和字段类型是必须的比如id int 数字和约束条件是可选 ,数字下面还会有详细说明
#数字在数字类型中并不是用来限制存储长度 而是用来控制展示长度,没什么作用,所以以后遇到数字类型不要指定数字 让他使用自带的即可
2.约束条件可以有多个,可以看作字段类型的额外约束,也可以说在一个条件 比如 unsigned (不要正负号,全存正数)zerofill(不足的0填充)
3.最后一个字段结尾不能有逗号(不容易发现) 因为复制的忘记删掉了
#整数型
tinyint 1bytes (-128,127) (0,255)
smallint 2bytes (-32768,32767) (0,65535)
int 4bytes 很多 十位 手机号不能用这个
bigint 8bytes 很多 手机号可以用这个或者存成字符串
#所有的int类型默认都是空出一位存储正负号 存的是负数和正数,超过最大值和最小值,默认存成支持的最大最小值
如果不想让他存负数那么就可以创建表时候加入一个约束条件unsigned
create table a6(id tinyint unsigned);
insert into a6 values(256),(-129);
select * from a6 #发现输出 255 0
-------------------------------------------------------------------------------------
# 浮点型
float(255,30) #精确到小数点后七位
总共255位小数位占30位
double(255,30) #精确到后14位
总共255位小数位占30位
decimal(65,30)
总共65位小数占30位
create table a8(id float(255,30));
create table a9(id double(255,30));
create table a10(id decimal(65,30));
insert into a8 values(1.1111111111111111111111111111);
insert into a9 values(1.1111111111111111111111111111);
insert into a10 values(1.1111111111111111111111111111);
'''三者精确度不同
decimal > double > float
具体使用结合实际情况
'''
-------------------------------------------------------------------------------------
# 字符串类型
char(4) # 定长
最多存储四个字符 超出了则报错 没超出则用空格填充
varchar(4) # 变长
最多存储四个字符 超出了则报错 没超出有几个存几个
create table a7(id int,name char(4));
create table a8(id int,name varchar(4));
insert into a7 values(1,'zhang');
insert into a8 values(1,'zhang');
#发现存的是zhan两个都是
#由于发现寸的数据不完整,数据丢失 是之前修改的my.ini配置文件 sql_mode删掉了
#如果是5.7版本以上的mysql 会报错 他已经设置了默认
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
5.7 版本不报错 因为他本身自带
-------------------------------------------------------------------------------------
#由上面引出sql_mode
1.模糊查询
show variables like '%mode%';
+----------------------------+------------------------+
| Variable_name | Value |
+----------------------------+------------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | NO_ENGINE_SUBSTITUTION |
+----------------------------+------------------------+
#发现 sql_mode只有一个NO_ENGINE_SUBSTITUTION 所以需要加上STRICT_TRANS_TABLES 严格模式
#两种修改方式
set session #临时修改
set global #永久修改 电脑不重启
直接修改配置文件 sql_mode='strict_trans_tables'
set global sql_mode='strict_trans_tables'
需要退出mysql 在重新登录生效
-------------------------------------------------------------------------------------
#数字在数字类型与字符类型中的区别
数字在字符类型里用来限制存储长度
数字在数字类型中并不是用来限制存储长度 而是用来控制展示长度,以后遇到数字类型不要指定数字 让他使用自带的即可(可能会用在订单号 商品编号 固定几位数) 使用zerofill约束条件,不足的用0补充,超出的有多少显示多少 最多11位
#统计字段数据的长度 char_length(字段名)
create table a9(id int,name char(5));#创建a9 设置char最多存储5位
insert into a9 values(1,vn); #添加数据name字段数据两位
insert into a9 values(2,'eza'); #添加数据name字段数据三位
select char_length(name) from a9; #查询a9 name字段数据长度 凡发现为2 3 和上面的char不足空格补充结论不一样
+-------------------+
| char_length(name) |
+-------------------+
| 2 |
| 3 |
+-------------------+
#是因为底层做了优化,如果想看见需要指定sql_mode
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
#之前的 #新加的
退出再从新进mysql
insert into a9 values (3,'aaa'); #重新添加数据
select char_length(name) from a9; #在查询一下a9 name 字段数据的长度
+-------------------+
| char_length(name) |
+-------------------+
| 5 |
| 5 |
| 5 |
+-------------------+
根据上面在验证一下varchar
create table a10 (id int ,name varchar(5));#先创建a10 name字段为varchar 限制长度为5
insert into a10 values (1,'vn'); #添加数据
insert into a10 values (2,'eza'); #添加数据
mysql> select char_length(name) from a10; #查询发现有几位存储了几位
+-------------------+
| char_length(name) |
+-------------------+
| 2 |
| 3 |
+-------------------+
char与varchar优缺点
char
优势:整存整取 速度快 ,不足空格补充
劣势:浪费存储空间
varchar
优势:节省存储空间
劣势:存取数据的时候都需要先考虑报头 速度较于char慢
char(6) varchar(6)
#每次读取一个bytes报头数据,报头里存储了后面字符长度
1bytes+jason1bytes+tony1bytes+jack1bytes+kevin