文章目录
一、 数据库前戏
# 存储数据
1.文件
文件地址与数据格式随意
2.软件开发目录规范
规定数据存储位置
单机游戏
3.联网游戏
数据共享
二、 数据库分类
数据库本质就是一款cs架构软件
数据库相关软件:
关系型数据库:
固定表结构并且表与表之间可以建关系
常见软件:MySQL、PostgreSQL、sqlite,db2,oracle,access,sql server
非关系型数据库:
没有固定表结构并且存储数据以kv键值对形式
常见软件:mongodb,redis,memcache
"""
常见软件最好能记住默认端口号
MySQL 3306
redis 6379
mongodb 27017
django 8000
flask 5000
tomcat 8080
...
"""
三、 MySQL简介
"""
本质也是一款基于网络通信的应用程序
也就是说 如果你比较牛逼 你完全可以开发一个自己的数据库软件
"""
任何基于网络通信的软件底层肯定都是socket
-服务端
-基于socket通信
-本地文件操作
-解析指令(SQL语句)
-客户端
-基于socket通信
-发送指令
-解析指令(SQL语句)
SQL语句的由来
"""
MySQL不单单支持MySQL客户端操作,也支持其他编程语言来操作
python、java、php、c++、go语法都不一样 那MySQL如何做到兼容的呢
两种解决语言障碍的思路
1.自己精通多国语言 轻松自如的切换
2.采用统一的语言(SQL语句)
"""
四、 重要概念介绍
"""
库 >>> 文件夹
表 >>> 文件夹里面的文件
记录 >>> 文件内一行行的数据
表头 表格的第一行数据
字段 字段名+字段类型
"""
五、 下载与安装
1.版本问题
5.6
5.7
8.0
# IT领域不会轻易采取最新版本软件
2.下载
官网下载压缩包
解压到固定地址
简单启动
mysql.exe 客户端
mysqld.exe 服务端
- 点击downloads
- 点击MySQL Community(GPL) Downloads
- 点击Mysql Community Server
- 点击Archives
- 选择需要的版本,按自己的操作系统选择下载(推荐5.6、5.7版本,一般系统都是64位,所有下载64位的)
六、 系统服务
1.解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.6.47-winx64
2.环境变量添加
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,C:\mysql-5.6.47-winx64\bin】 如下图:
3.系统服务制作(全部在管理员身份下操作)
# 查看系统服务
1.右键选择任务管理器
2.Windows+R输入services.msc
1.将Mysql添加到系统服务中
# 添加到系统服务
mysqld --install
# 取消系统服务(一定要先停止服务)
mysqld --remove
2.第一次制作之后默认是未启动状态,需要我们启动一次
1.右键启动
2.命令启动服务
net start mysql
3.命令停止服务
net stop mysql
七、 用户登录
1. 在没有做任何配置的情况下输入mysql
其实是以游客模式在访问
拥有的操作权限很少
2. MySQL其实也需要做用户管理
mysql -u用户名 -p密码 # 管理员初次登录无需密码
八、 密码相关
1. 修改管理员密码
mysqladmin -u用户名 -p原密码 password 新密码
2. 忘记密码
1.停止MySQL服务
net stop mysql
2.跳过授权表重新启动MySQL(如下图)
mysqld --skip-grant-tables
3.新建cmd
4.无密码登录
mysql -uroot -p
5.修改用户密码
update mysql.user set password=password(123) where user="root" and host="localhost"; # 修改对应用户的密码
6.退出客户端并以正常的重新启动服务端
九、 配置文件
1. MySQL默认配置文件my-default.ini不能修改
拷贝并重命名my.ini
# \s查看基本信息
my.ini文件内容
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
2. 修改完配置文件一定要重启服务端才能生效
net stop mysql
net start mysql
十、 系统数据库
- information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
- performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
- mysql: 授权库,主要存储系统用户的权限信息
- test: MySQL数据库系统自动创建的测试数据库
十一、 基本SQL语句
1、 库操作
##########################库###############################
use 数据库名称; # 切换数据库(文件夹)
select database(); # 查看当前所在的库
# 查
show databases; #查看整体
show create database 数据库名称; #查看指定数据库
# 增
create database 数据库名称 charset='utf8';
# 改
alter database 数据库名称 charset='gbk';
# 删
drop database 数据库名称;
2、 表操作
##########################表###############################
# 查
show tables;
show create table t1; # 查看表的详细信息
describe t1; == desc t1; # 查看表结构
# 增
create table t1(id int,name char(4)); # 创建出来的可能是多个文件,解耦管理
# 改
alter table t1 modify name char(16);
alter table t1 rename userinfo;
# 删
drop table t1;
3、 记录操作
##########################记录###############################
# 查
select id,name from db1.t1; # db1可不指定,默认当前库下
select * from t1;
# 增
insert into db1.t1 values (1,'tom'); # 单
insert into db1.t1 values (2,'tom'),(3,'tony'),(4,'jason'); # 多
# 改
update db1.t1 set name='DSB' where id > 1;
update db1.t1 set name='DSB' where id = 2 or id = 3;
# 删
delete from db1.t1 where id >3;
delete from db1.t1 where name='jason';
delete from db1.t1; # 将t1表所有的数据都删除
4、 添加数据的两种方式
insert into t1 values(...); # 按照字段顺序一一传值
insert into t1(name) values(...); # 指名道姓的传值
5、 注意事项!!!
1.SQL语句是以分号作为结束
2.取消SQL命令
\c
3.选择服务端的命令
mysql -h 127.0.0.1 -P 3306 -uroot -p
4.客户端退出,退出命令加不加分号都可以执行
quit
exit
5、删库跑路😏😏😏
rm-rf/*
十二、 存储引擎
存储数据的方式不一样
# 查看所有的存储引擎
show engines;
# 需要知道的有四个
MyISAM
MySQL5.5及之前版本默认的存储引擎
存取数据的速度都非常快 但是功能较少安全性较低
InnoDB
MySQL5.6及之后版本默认的存储引擎
存取数据速度没有MyISAM快 但是功能更多 安全性更高
事务 行锁 外键
BlackHole
往里面写入的任何数据都会直接消失
Memory
内存存储数据
# 存储数据的特点
create table t1(id int) engine=InnoDB;
create table t2(id int) engine=MyISAM;
create table t3(id int) engine=BlackHole;
create table t4(id int) engine=Memory;
# 文件个数不一致
InnoDB
.frm 表结构
.ibd 表数据和索引(类似于书的目录)
MyISAM
.frm 表结构
.MYD 表数据
.MYI 索引(类似于书的目录)
BlackHole
.frm 表结构
Memory
.frm 表结构
# 验证
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
"""乐观锁与悲观锁"""
十三、 创建表的完整语法
create table 表名(
字段名1 字段类型(宽度) 约束条件,
字段名2 字段类型(宽度) 约束条件,
字段名3 字段类型(宽度) 约束条件
)
"""
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可以有多个
字段名1 字段类型(宽度) 约束条件1 约束条件2 约束条件3
3.最后一个字段结尾不能加逗号
"""
十四、 MySQL基本数据类型
1、整型
tinyint smallint int bigint
1.不同的类型能够存储的数字范围不一样
2.验证是否自带符号
create table t5(id tinyint);
insert into t5 values(-129),(256);
结论:所有的整型都是自带符号
3.如果不想让整型有符号(unsigned)
create table t6(id tinyint unsigned);
insert into t6 values(-129),(256);
特例:
'''
针对整型字段 括号里面的数字不是用来限制存储长度而是用来控制展示长度
id int(8)
如果数字没有超出8位,那么默认用空格填充至8位
如果数字超过了8位,那么有几位存几位(但还是要遵循最大范围)
ps:如果不理解 直接记结论
定义整型字段无需自己写括号和数字
'''
4.用0填充至8位(zerofill)
create table t12(id int(4) zerofill);
insert into t12 values(1),(11111111);
2.浮点型
float(255,30)
总共255位小数占30位
double(255,30)
总共255位小数占30位
decimal(65,30)
总共65位小数占30位
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
insert into t7 values(1.111111111111111111111111111111);
insert into t8 values(1.111111111111111111111111111111);
insert into t9 values(1.111111111111111111111111111111);
"""
精确度不一样
float < double < decimal
在实际开发中 很多时候看似需要用数字存储的数据
其实我们可能都是使用的字符串存储
"""
3.字符类型
1、 字符类型对比
char(4)
定长
最大存储四个字符 超出了直接报错 不超过空格填充至四位
varchar(4)
变长
最大存储四个字符 超出了直接报错 不超过有几位存几位
create table t10(id int,name char(4));
create table t11(id int,name varchar(4));
insert into t10 values(1,'jason');
insert into t11 values(1,'jason');
char(5)
优点:整存整取 速度快
缺点:浪费硬盘空间
jason kevin tony egon jack tom
存按照五个字符存,取按照5个字符取
varchar(5)
优点:节省硬盘空间 精准
缺点:速度没有char快
1bytes+jason 1bytes+kevin 1bytes+tony 1bytes+egon 1bytes+jack 1bytes+tom
存的时候需要制作报头
取的时候也需要先读取报头,之后才能读取真实数据
# 到底用char还是varchar?
各有优缺点 具体结合实际情况
# 由于我们修改了配置并且没有指定sql_mode
"""
1.拷贝sql_mode到自己的配置文件
2.修改
"""
2、 严格模式
针对不同版本有不同的效果
5.6版本默认没有开启严格模式,如果超出规定范围就会自动截取
5.7及以上版本默认开启严格模式,如果超出规定范围就会报错
# 查看sql_mode
show variables like '%mode%';
# 修改
set global sql_mode='strict_trans_tables';
# 退出客户端重新进入即可
# 验证是否自动填充
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
4.日期类型
datetime 年月日 时分秒
time 时分秒
date 年月日
year 年
create table t13(
id int,
name varchar(32),
reg_time datetime,
study_time time,
birth date,
r_time year
);
insert into t13 values(1,'jason','2000-11-11 11:11:11','11:11:11','2000-01-21','1995');
5.枚举与集合
枚举 多选一
create table t14(
id int,
name char(16),
gender enum('male','female','others')
);
集合 多选多(多选一)
create table t15(
id int,
name char(32),
hobby set('read','study','music','tea')
);