MySQL基础
MySQL
什么是MySQL?
MySQL它是一个关系型数据库管理系统,Oracle旗下产品;是最流行的关系型数据库管理系统之一,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,以此增加了速度并提高了灵活性;其次它使用SQL语言用于操作数据库的标准语言,以其体积小、速度快、成本低广受个人及企业的喜爱;
SQL语句分类
**DDL:**数据定义语言,用来定义数据库、表、列等
**DML:**数据操作语言,用来对数据库表中的数据进行增删改查
**DQL:**数据查询语言,用来查询数据库表中的数据
**DCL:**数据控制语言,用来定义数据库的访问权限和安全级别,以及创建用户
MySQL常用数据类型
数值
1 | int:标准的整数,4个字节 |
字符串
1 | char:固定字符串 |
时间日期
1 | date:年月日,YYYY-MM-DD |
安装
1、配置MySQL软件仓库,具体配置获取;清华大学软件源官网:https://mirrors.tuna.tsinghua.edu.cn/help/mysql/
1 | #创建mysql.repo |
2、清理缓存、更新数据源
1 | dnf clean all |
3、安装、启动、开机自启MySQL
1 | dnf -y install mysql-community-server |
4、修改密码
1 | #获取临时密码 |
5、运行安全配置,交互模式
1 | mysql_secure_installation |
6、查看
1 | #运行状态 |
7、新建用户提供远程登陆,root已被禁止远程登陆
1 | #登入mysql,新建用户 |
8、配置防火墙
1 | #放行MySQL默认端口 |
9、使用Navicat测试
1 | 用户名:viper |
DDL
数据定义语言,用来定义数据库、表、列等操作;
操作数据库
1、创建数据库
1 | #可选项 if not exists 如果数据库不存在才创建 |
2、使用数据库
1 | user 数据库名; |
3、查看当前使用的数据
1 | select database(); |
4、查看所有数据库
1 | show database; |
5、删除数据库
1 | #可选项 if not exists 如果数据库存在才删除 |
操作表
====== 创建表 ======
1 | #可选项 if not exists 检查该表不存在才会创建 |
====== 查询表 ======
1 | #查看当前数据库下所有表名称 |
====== 修改表 ======
1、修改表名
1 | alter table 表名 rename to 新表名; |
2、添加一列
1 | alter table 表名 add 列名 数据类型; |
3、修改数据类型
1 | alter table 表名 modify 列名 新数据类型; |
4、修改列名和数据类型
1 | alter table 表名 change 新列名 新数据类型; |
5、删除列
1 | alter table 表名 drop 列名; |
====== 删除表 ======
1 | #可选项 if not exists 检查表是否存在才会删除 |
DML
数据操作语言,用来对数据库表中的数据进行增删改查;
添加数据
1 | #给指定列添加数据 |
修改数据
1 | #注意:不加添加条件则会删除所有数据!!! |
删除数据
1 | #注意:不加where条件将删除所有数据 |
DQL
数据查询语言,用来查询数据库表中的数据;
基础查询
1 | #查询表中所有数据 |
条件查询
1 | select 字段列表 from 表名 where 条件列表; |
模糊查询
通配符:_代表任意单个字符,%代表任意多个字符
1 | select 字段列表 from 表名 where 字段名 like '匹配项'; |
排序查询
排序方式:asc代表升序排序(默认),desc代表降序排序
1 | select 字段列表 from 表名 order by 排序字段名 排序方式; |
聚合函数
将一列数据作为一个整体,纵向计算,null值不参加所有聚合函数运算;
====== 分类 ======
函数名 | 功能 |
---|---|
count(列名) | 统计数量 |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
====== 聚合函数语法格式 ======
1 | select 聚合函数名(列名) from 表; |
分组查询
1 | select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤]; |
where和having的区别
1、执行时机不同,where是分组前限定,不符合的不参与分组,having则是分组后对结果进行过滤,不符合的不会显示结果;
2、可判断的条件不一样,where条件不能对聚合函数进行判断,having可以。
分页查询
起始索引计算公式:当前页码-1 * 每页显示的条目
1 | select 字段列表 from 表名 limit 起始索引 , 查询条目数; |
DCL
数据控制语言,用来定义数据库的访问权限和安全级别,以及创建用户;
用户管理
创建用户
1 | # %允许所有主机访问,localhost表示仅本地访问 |
修改用户名
1 | rename user '旧用户名'@'host' to '新用户名'@'host'; |
修改密码
1 | alter user '用户名'@'host' identified by '新密码'; |
删除用户
1 | drop user '用户名'@'host'; |
权限管理
常用权限
关键字 | 含义 |
---|---|
select | 允许查询数据 |
insert | 允许插入数据 |
update | 允许修改数据 |
delete | 允许删除数据 |
create | 允许创建库/表 |
alter | 允许修改表结构 |
drop | 允许删除库/表 |
index | 允许创建/删除索引 |
execute | 允许执行存储过程 |
all | 所有权限 |
授于权限
1 | grant 权限类型 on 数据库名.表名 to '用户名'@'host'; |
查看权限
1 | show grant for '用户名'@'host'; |
撤销权限
1 | revoke 权限类型 on 数据库名.表名 to '用户名'@'host'; |
角色管理(8.0及以上版本才支持)
除了直接赋予用户权限外,还可以通过角色的形式赋予用户权限。
创建角色
1 | create role '角色名称'; |
授于角色权限
1 | grant 权限类型 on 数据库名.表名 to '角色名称'; |
将角色授予用户
1 | grant '角色名称' to '用户名'@'host'; |
激活角色
1 | set default role all to '用户名'@'host'; |
约束
约束作用于表中列上的规则,用于限制加入表的数据,保证了数据的正确性、有效性和完整性。
约束分类
名称 | 关键字 | 功能 |
---|---|---|
非空约束 | not null | 保证列中所有数据不能有null值 |
唯一约束 | unique | 保证列中所有数据各不相同 |
主键约束 | primary key | 一行数据唯一标识符,要求非空且唯一 |
默认约束 | default | 保存数据时,未指定值则采用默认值 |
外键约束 | foreign key | 用来让两个表的数据之间建立连接,保证数据的一致性和完整性 |
外键约束
1、建表时添加
1 | constraint 外键名称 foreign key(外键列名) references 主表名(主表列名); |
2、建完表后添加
1 | alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表名称(主表列名); |
3、删除外键
1 | alter table 表名 drop foreign key 外键名称; |
多表查询
多表查询分类
内连接:查询两表交集部分的数据
左外连接:查询左边表和交集所有的数据
右外连接:查询右边表和交集所有的数据
子查询:查询中嵌套查询
连接示意图
内连接
语法格式
1 | #隐式内连接 |
左外连接
语法格式
1 | select 字段列表 from 表1 left join 表2 on 条件; |
右外连接
1 | select 字段列表 from 表1 right join 表2 on 条件; |
子查询
语法格式
1 | #单行单列,作为条件值 |
事务
事务是一种机制、一个操作序列,包含了一组数据库操作命令,事务会将这些操作命令作为一个整体一起向系统提交或撤销操作请求,这时这一组命令要们全部成功,要们全部失败。
语法格式
1 | #开启事务 |
事务四大特征(ACID)
原子性:要们同时成功,要们同时失败
一致性:事务完成时,必须保证所有数据都保持一致
隔离性:多个事务之间相互隔离,当一个事务在操作时不应被另一个事务干扰
持久性:事务一旦提交或回滚,它的数据的修改就是永久的
事务的隔离级别
===== 读未提交 ======
特点:事务可以读取到其它事务未提交的数据
问题:会出现脏读,事务A读取了事务B未提交的修改,如果B回滚了事务,那么A事务读取到的数据就是无效的。
===== 读已提交 ======
特点:事务只能读取到其他事务已提交的数据
问题:会出现不可重复读,事务A两次读取同一数据,中间事务B修改并提交了事务A读取的数据,导致A事务两次读取到的数据不一致。
===== 可重复读======
特点:事务执行期间,多次读取同一数据结果一致,是MySQL默认隔离级别
问题:会出现幻读,事务A读取某个范围的数据,事务B插入了新数据并提交,事务A再次查询时发现凭空出现的数据。
===== 序列化======
特点:最高隔离级别,所有事务串行执行(类似单线程),完全避免并发问题
问题:性能极低,可能会导致大量锁等待或死锁
索引
什么是索引?
索引时数据库中用于快速查找数据的数据结构,类似书籍的目录,使用索引可以快速定位到需要查找的数据,减少数据库需要扫描的数据量。
索引分类
普通索引:最基本的索引,无特殊限制,关键字 inde/key
唯一索引:索引列值必须唯一,允许null值,关键字 unique key
主键索引:特殊的唯一索引,不允许null值,关键字 primary key
全文索引:用于全文搜索 FullText
创建索引
1 | #创建表时 |
查看索引
1 | show index from 表名; |
删除索引
1 | drop index 索引名称 on 表名; |
索引使用场景
====== 适合作为索引的字段 ======
1、主键
2、频繁作为查询条件的字段
3、查询中排序的字段
4、查询中统计或分组的字段
====== 不合适作为索引的字段 ======
1、频繁更新的字段
2、数据量小的表
3、数据量重复且分布均与的字段
备份与导入
备份
1 | mysqldump -h主机 -u用户名 -p 数据库 表 > 存储路径/备份文件名.sql |
导入
1 | #登陆后 |