一、MySQL
0、MySQL 前置内容铺垫
- MySQL 服务端只能 root 权限来 重启/启动/关闭,客户端可以普通用户链接
- my.cnf 是 MySQL 的配置文件,每次配置完必须重启一下 MySQL 服务才可以配置文件生效
my.cnf 文件内部基本设置
bash
[mysql]
#...
[mysqld]
skip-grant-tables #mysqld被连接时免密码登录
port=3306 #设置mysqld的端口号
datadir=/var/lib/mysql #设置mysqld操作数据库时把数据存在哪里
character-set-server=utf8 #设置mysqld采用哪个编码集
default-storage-engine=innodb #设置mysqld采用哪个存储引擎
- 磁盘里存在 mysql 目录里面存放的是卸载之前 mysql 的历史数据
- MySQL@5.7版本是常用的
- Linux 中 yum 下载软件 都需要去自己本地的
yum仓库目录获得该软件的 yum 源 才可以通过此源 下载此软件
1、MySQL 详细解释
- MySQL 是一个特定数据库的相关体系
mysql是 MySQL 这个体系的客户端软件mysqld是 MySQL 这个体系的服务端软件MySQL数据库是 MySQL 体系下的存储结构
- 数据库单指一套存储结构的意思
MySQL 数据库相关体系组成逻辑图
cpp
用户 --> mysql
|
V
mysqld--(CURD)-->数据库
1-1、数据库存储结构的体现
- 一般数据库这个存储结构 主要 通过 在内存/磁盘里 体现和表现出来
- OS 眼中数据库就是目录,表就是一组文件
1-2、数据库内部表的逻辑存储结构
- 表的逻辑存储结构是以一张表的形式存储的
2、MySQL 架构
cpp
_____________________________________________________________________________
|
|MYSQL CLIENT
|jdbc、php、C/C++、python、java、mysql、navicat
|_____________________________________________________________________________
^ ^ ^
| | |
V V V
_____________________________________________________________________________
|MYSQL SERVER(MySQL的应用层文件系统)
|「 [链接池:连接管理+身份认证]
| 」 [SQL语句词法语法分析并优化,通过协议分配给下一层]
| [存储引擎(驱动):提供存储解决方案(支持插件),用于接收上层指令并进行进一步解释交给下一层]
|_____________________________________________________________________________
^ ^ ^
| | |
V V V
_____________________________________________________________________________
|OS的系统层文件系统
|_____________________________________________________________________________
3、SQL 语句分类
- DDL:数据定义语言->操作属性的语句:对字段属性操作
- DML:数据操作语言->操作数据的语句:对实例化数据操作
- DCL:数据控制语言->操作 mysql 权限的语句
MySQL 表结构逻辑图
MySQL 表结构由 n 个字段构成,字段由字段名和字段属性构成,每个字段由可以实例化出多个数据
cpp
数据库表
____________________|_______________________
| | |
列1 ... 列n
[(字段1)] [(字段...)] [(字段n)]
| | |
V V V
_________ ________ _________
| (字段名) | | (字段名) | | (字段名) |
| Field | | Field | | Field |
|---------| |---------| |---------|
|(字段属性)| |(字段属性)| |(字段属性)|
| Type | | Type | | Type |
| Null | | Null | | Null |
| Key | | Key | | Key |
| Default | | Default | | Default|
|_________| |_________| |_________|
| | |
(实例化) (实例化) (实例化)
| | |
V V V
数据1 数据1 数据1
数据2 数据2 数据2
数据3 数据3 数据3
... ... ...
数据n 数据n 数据n
4、库的操作
4-1、创建数据库
- 语法:
sql
create database [if not exists] db_name [create_specification] [,create_specification ...]
create_specification:
[default] character set charset_name
[default] collate collation_name
- 说明
-
\]是可选项
- collate:指定数据库的校验集
-
- MySQL 中 创建/删除 数据库本质就是在 Linux 系统下 创建/删除 一个目录
4-2、数据库字符集
- 字符集是由对应的规则、二进制流和码点组成的
- 编码集的生产的二进制流可以被校验集认识,编码集和校验集要认识解码集生产的码点才能让程序正确的处理数据并交给用户
Server Client 客户端字符集编码 传输 使用连接字符集解码 存储字符集编码-数据库编码集 读解码集解码+数据库校验集校验 客户端字符集编码 客户端解码 解码集解码+连接校验集校验 缓冲区用于存放码点--如Unicode字符 磁盘二进制 二进制流 用户输入 返回二进制 用户显示
- 创建的数据库默认采用配置文件的,如果指定了就采用指定的
- 设置格式后一般就会校验规则也会默认自动同步设置
4-3、数据库相关指令
- 查看当前使用的是哪个数据库:
select database(); - 查看全部的数据库:
show databases; - 删除数据库:
drop database [if not exists] db_name; - 使用数据库:
use db_name;
sql
alter database db_name
[alter_spacification [,alter_spacification]...]
alter_spacification:
[default] character set charset_name
[default] collate collation_name
- 查看数据库对应的正规创建指令:
show create database db_name; - 查看当前有哪些人链接 mysqld 指令:
show processlist;
4-4、数据库的备份和恢复
- 备份
#:mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径/备份名.sql#:mysqldump -P3306 -u root -p 密码 数据库名 表名 > 数据库备份存储的文件路径/备份名.sql
- 还原
mysql>:source 数据库备份存储的文件路径/备份名.sql- 备份的本质是把创建数据库的历史操作指令备份起来,而不是备份数据库的数据
5、表的操作
5-1、创建表
- 语法
sql
create table table_name(
field1 datatype,
field2 datatype,
...
) character set 字符集 collate 检验规则 engine 存储引擎;
- 说明:
- field 表示列名(字段名)
- datatype 表示列的类型(字段类型)
- character set 字符集,如果没有指定字符集,则以所在的数据库的字符集为准
- collate 校验规则,如果没有指定校验规则,则以所在数据库的检验规则为准
5-2、表的相关指令
- 查看当前数据库的所有表:
show tables; - 查看表的结构:
desc 表名; - 查看表的详细信息:
show create table 表名\G; - 查看通过表结构的实例化的数据:
select * from table;
5-3、修改表
- 只要最终增删改列字段里的属性,那么就是修改表
- 语法
sql
alter table tablename add(column_name datatype [default expr][,column datatype]...); #新增字段
alter table tablename modify(column_name datatype [default expr][,column datatype]...); #覆盖式修改字段
alter table tablename drop(column_name); #删除字段中某个属性
alter table tablename rename to 新表名字; #修改表名
alter table tablename change 字段名(列名) 新名 该字段属性; #修改字段名和对应属性
5-4、删除表
- 语法:
drop table 表名;
6、属性--数据类型
- MySQL 的数据类型本身是一种约束,只要合法可以插入,不合法无法插入
- MySQL 的约束是约束用户的
6-1、数值类型
- 数值类型--整数类型
- 整数类型默认都是有符号的,如果想使用有符号的则需要在数值类型后加 unsigned 修饰
- 数值类型--位类型
- 根据位类型化的数据在
select*查询语句中,会根据 ascii 码值显示位数据的
- 根据位类型化的数据在
- 数值类型--浮点类型
- 浮点类型默认都是有符号的,如果想使用有符号的则需要在数值类型后加 unsigned 修饰
- 小数精度高于 d 则浮点类型数据可以四舍五入后,如果合法则进行插入
- 被插入的浮点数据,整数位数要
<= m-d个 - 低精度浮点数插入高精度数据时会损失数据,即使 m 和 d 满足高精度但依旧会损失,但高精度浮点数就很难损失精度
- 数值类型常用类型
- BIT(M):位类型。M 指定位数,不写 M 则默认值为 1,M 的范围
1~64 - TINYINT[(m)]:1 字节整数类型。m 默认宽度(不是显示时的宽度),有符号范围
-128~127,无符号范围0~255 - FLOAT[(m,d)]:低精度浮点数类型。m 指定最长显示长度,d 指定小数位数,占 4 字节
- DECIMAL[(m,d)]:高精度浮点数类型。m 指定最长显示长度,d 指定小数位数
- BIT(M):位类型。M 指定位数,不写 M 则默认值为 1,M 的范围
6-2、文本、二进制类型
- 文本类型
- 字符串类型
- char(L):固定长度字符串,L 是可以存储的最大长度,单位为字符,L 最大长度 255 字符,最大空间所占
sizeof(当前表编码)*255个字节 - varchar(L):可变长字符串,L 表示字符长度,varchar 最大空间所占
65535-n个字节- 65535-n:含义是表中一行实例化后的数据最大时 65535 个字节,n 是当前行除了当前
varchar类型字段的其他字段实例化后数据的大小的和空间
- 65535-n:含义是表中一行实例化后的数据最大时 65535 个字节,n 是当前行除了当前
- char(L):固定长度字符串,L 是可以存储的最大长度,单位为字符,L 最大长度 255 字符,最大空间所占
- 字符串类型
- 固定长度 VS 变长
- 固定长度类型,开的空间永远都是固定大小的
- 变长类型,开的空间永远都是根据数据大小开辟正好的,不过开辟的空间不可以超过 L 个字符大小的设定值
6-3、日期和时间类型
- 日期类型:data:
xxx-yyy-dd占 3 字节->年月日(固定) - 日期时间类型:datatime:
xxx-yyy-dd HH:ii:ss占 8 字节->年月日时分秒(固定) - 时间戳类型:timestamp:
xxx-yyy-dd HH:ii:ss占 4 字节->年月日时分秒(此字段无需插入实例化数据,表更新时会自增)
6-4、String 类型
- String 类型--聚合类型
- enum 枚举类型:多选一
gender enum('男','女')
- set 集合类型:多选多
hobby set('代码','运动','读书')
- enum 枚举类型:多选一
6-4-1、 聚合类型的插入
- 枚举类型的插入,插入 enum 枚举类型定义的数据时,可以用数字来插入,这个数字表示第 i 个枚举内部的数据
- 集合类型的插入,插入 set 集合类型定义的数据时,可以用位图来插入,位图中 1 代表插入的数据,0 代表不插入此数据
6-4-2、 聚合类型的查找
- 枚举类型的查找,查找 enum 枚举类型定义的数据时,可以用数字来查找
- 集合类型的查找,查找 set 集合类型定义的数据时,可以用位图来查找
- 集合数据查找为了防止出现严格匹配集合内部数据,就产生了集合查找函数
- find_in_set(数据,集合):数据如果在集合中则返回非 0 反之返回 0
- 集合数据查找为了防止出现严格匹配集合内部数据,就产生了集合查找函数
7、属性--约束
- 数据类型本身是一种约束,但这种约束实践中不太够用,因此就有了额外约束
7-1、属性--约束--非空约束
null是一个 MySQL 系统的特定含义的数据,这个数据表示没有用户数据default null表示允许该字段数据存在null数据- 如果用户没写
not null非空约束/主键约束,则系统会默认给字段添加default null默认值约束
- 如果用户没写
- 非空约束:
not null表示表中不允许插入null数据
7-2、属性--约束--默认值约束
- 默认值约束是当数据插入时,插入时不显示需要写字段,则采用
default约束对应的默认值,填写则采用填写的值 - 设置了
default则书写insert并省略对应字段插入时,就会触发default约束在插入数据时,会用default缺省值来插入字段数据
7-3、属性--comment
- 列描述:对表字段的一种说明,相当于程序员的注释
7-4、属性--zerofill
- 整数的格式化显示
- 当数值类型--整型相关类型显示时没有超过默认宽度,则用 0 补全到默认宽度并显示
7-5、属性--约束--主键约束
- 主键约束:是通过字段来实现的约束,用于标识表中每条数据的,每张表只有一个主键约束,主键约束默认就是
not null的id int primary key comment 'primary key 就是主键约束'- 被主键修饰的字段数据无法重复
7-5-1、主键约束--复合主键
- 主键可以由多个字段实现也可以由一个字段实现,多列实现的主键叫做复合主键,对于每条记录来讲,只有实现主键的字段数据全部重复才会主键冲突
primary key(id,classId)
7-5-2、主键约束--自增长属性--逻辑主键
auto_increment属性,必须用于修饰当作主键约束的字段,被auto_increment修饰的字段,当插入时不指定字段插入字段数据时,系统会自动为其分配在历史插入中最大数据+1的数据id int primary key auto_increment comment 'auto_increment 要搭配 primary key'- 被自增长修饰的主键也叫逻辑主键,一张表只能存在一个自增长
select last_insert_id();:获取在历史插入中被auto_increment修饰的最大数据
7-6、属性--约束--唯一键约束
- 由于一张表只能有一个主键,但往往表中的其他字段的数据也需要唯一性约束那么就产生了唯一键约束,需注意的是唯一键只允许插入 NULL 时可以重复,插入其他数据时不允许重复
id int unique comment 'unique 是唯一键约束'- 主键不允许插入 NULL,但唯一键允许插入 NULL
7-7、属性--约束--外键约束
- 当两张表在业务中相互依赖,那么就需要使用外键把
从表对应的字段和主表对应的字段关联起来,这样这两张表也就关联起来了- 在业务中往往需要通过查找从表的数据再根据从表的外键查找主表的数据,因此外键约束是建立在从表上的,主表只需要提供主键或唯一键修饰的列,来帮助从表建立外键约束
foreign key(从表字段) references 主表(主表字段)- 从表插入数据时看主表对应字段数据是否存在,存在则插入;主表删除数据看从表对应字段数据是否存在,不存在则删除