Mysql
1.数据库基本操作
mysql -uroot -p123456;--连接数据库
show databases; --显示所有的数据库
use mybatis; --使用mybatis数据库
show tables; --显示所有的表
describe blog; --显示Blog表结构
create database student; --创建学生数据库
drop database if not exists student; --删除数据库
exit; --退出数据库
show create table student; --查看创建表的sql语句
show create database mybatis; --查看创建数据库的sql语句
数据库语言:
-
DDL:定义语言
-
DML:操作
-
DQL:查询语言
-
DCL:控制语言
2.数据库数据类型
2.1.数据库的列类型
数值:
-
tinyint 十分小的数据 1字节
-
smallint 较小的数据 2字节
-
mediumint 中等大小的数据 3字节
-
int 标准的整数 4字节
-
bigint 较大的数据 8字节
-
float 单精度浮点类型 4字节
-
double 双精度的浮点数 8字节
-
decimal 字符串形式的浮点数 金融
字符串
- char 字符
- varchar 可变字符串 0-65535
- tinytext 微型文本 2^8-1
- text 保存大文本 2^16-1
时间日期
-
date YYYY-MM-DD 日期
-
time HH:mm:ss 时间格式
-
datetime YYYY-MM-DD HH:mm:ss 日期时间
-
timestamp 时间戳 1970.1.1到现在的毫秒数
-
year 年份表示
null
- 没有值,未知类型,不要使用NULL进行运算,结果返回NULL
2.2.数据库的字段属性
Unsigned:
- 无符号数
- 不能为负数
zerofill:
- 零填充
- 位数不足0来凑
自增auto_increment:
- 列值自增
- 可以保证主键的唯一行
默认default:
- 如果输入,默认使用指定的值
comment:
- 介绍
primary key:
- 主键索引
unique:
- 唯一索引
engine:
- 数据库引擎
charset:
- 默认字符集
2.3标准的表中应该包含的数据
id 主键
version 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
3.数据库引擎
--数据库引擎
/*
INNODB
MYISAM
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | N | Y |
数据行锁定 | N | Y |
外键约束 | N | Y |
全文索引 | Y | N |
表空间大小 | 较小 | 较大,约为MYISAM2倍 |
- MYISAM 占用空间小,速度块
- INNODB 支持事务,支持多用户操作
在物理空间中的位置
所有数据库文件都存在于data目录下,
实际上还是以文件存储的方式。
MYSQL引擎在物理文件上的区别:
-
InnoDB 在数据库表中只有*.frm文件,以及上级目录中的一些文件
-
MyISAM 对应的文件
*.frm文件 表结构的文件
*.MYD 数据文件
*.MYI 索引文件
4.修改数据库的表
修改表
- 修改表名 alter table 旧表名 rename as 新表名
- 添加字段 alter table 表名 add 字段名 属性值
- 修改约束 alter table 表命 modify 字段名 属性值
- 修改字段名 alter table 表命 change 旧字段名 新字段名 属性值
- 删除表中的字段 alter table 表名 drop 字段名
- 删除表 drop table if exists 表名
5.Mysql数据管理
5.1外键
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
方式一:在创建表的时候,添加外键约束
方式二:使用Alter添加外键
alter table student add constraint (外键别名) foreign key (列名) references `表名`(列名);
删除时需要级联删除。
外键不推荐使用,一般情况下使用逻辑外键,在程序中体现。
5.2DML语言
数据操作语言:修改表中书的的信息。
5.21 添加
insert into 表名 (字段名1,字段2,字段3)values (值1,值2,值3);
5.22 修改
update 表名 set 字段1=值1,字段2=值2…where 字段3=值3;
操作符 :
/>, < , >= ,<= ,
between 值1 and 值2
in(值1,值2,值3) 效率要低于多个or组合
5.23 删除
delete 表名 where 字段=值;
清空表中的数据:
-
delete from 表名;
-
trancate 表名;
相同点:
- 都会删除表中的数据,并且保留表结构;
不同点:
-
delete 会保留自增数。
-
trancate 会使自增数恢复初始值,并且不会受事务影响。
delete删除的问题:
-
InnoDB:的自增列的值存储在内存中,断电即失
-
MyISAM:自增列存在文件中,断电后不会重置
6.DQL
DQL数据库查询语言
6.1查询指定字段
select * from 表名 where 字段=值;
字段别名
- 字段名 as 别名
函数Concat(a,b) 将a,b拼接输出
- select concat(‘姓名:’,name) as 新名字 from student;
6.2查询去重
distinct()去重
作用:取出select查询中的重复数据
6.3数据库中的列(表达式)
-
select version(); 查询系统版本(函数)
-
select 100*3-1 as 计算结果结果 (用来计算结果)
-
select @@auto_increment_increment :查询 自增的步长
查询考试成绩+1
select studentName,studentResult+1 from result;
数据库中的表达式:
文本值,列,Null,函数,计算表达式,系统变量
6.4where介绍
where 后面跟判断表达式(结果为boolean类型的表达式)
逻辑运算符:and,or,not,between and, in…
6.5模糊查询
本质为比较运算符;
运算符 | 语法 | 描述 |
---|---|---|
is not null | a is not null | a不为空返回ture |
is null | a is null | a为空返回为true |
between and | a between c and d | a在c和d之间返回为true |
like | a like b | a匹配到b,返回结果为true |
in | a in (c,d,e) | a 在范围中中返回true |
_ : 下划线代表一个字符;
%: 百分数代表0到n个字符
6.6联表查询
join on
select * from student as s inner join teacher as t on s.id=t.id;
连接类型:
left join , right join, inner join, full outer join.
6.7自连接
自己的表和自己的表连接,核心:一张表分为两张表使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OnQPO93X-1584704147753)(C:\Users\67229\AppData\Roaming\Typora\typora-user-images\image-20200227182547784.png)]
这张表实现按主类型和附属类型分类的方式显示。
实现原理就是将一张表当作两张表,然后连接查询。
select a.categoryName,b.categoryName
from category as a,category as b
where b.pid=a.categoryid;
执行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wyJtPj6P-1584704147753)(C:\Users\67229\AppData\Roaming\Typora\typora-user-images\image-20200227183250840.png)]
6.7分页查询和排序
排序:order by
asc 按正序排序
desc 按倒序排序
例子
select * from user order by id asc;
分页查询limit
作用:缓解数据库压力,使用户得到更好的体验
例子:
select * from user limit 1,4;
第一个参数为初始开始位置,
pageSize:第二个参数为一页存放的数据的多少。
6.8 查询多个表中的内容
查询多个表中的内容的时候根据实际情况,可以分为两种方式:
联表查询:使用7种连接方式进行查询
子查询:将子查询的结果作为where中的判断
6.9分组查询
group by …having
按字段值进行分组,对分组的数据进行过滤的时候需要使用having
7.Mysql函数
7.1常用函数
select ABS(-8); --取绝对值
select ceiling(9.4) --向上取整
select floor(9.4) --向下取整
select rand(); --返回0-1的随机数
select sign(10); --判断一个数的符号,负数返回-1,整数返回1
--字符串
select char_length('') --返回字符串的长度
select concat('a','b','v') --拼接字符串
select insert('1234',1,2,'xiao') --替换字符串,在第1的后面的两个位置插入‘xiao’
select lower('str') --转大写
select upper('str') --转小写
select instr('uiwe','u') --在字符串中查找指定字符串
select replace('勤劳的砖瓦匠','砖瓦匠','程序员') --提花指定字符串
select substr('udialfu',2,4) --截取指定长度字符串
select reverse("勤劳的砖瓦匠") --反转
select current_date(); --获取当前时间
--获取系统用户
select user();
7.2聚合函数
函数名称 | |
---|---|
count() | 数量 |
sum() | 求和 |
avg() | 求平均值 |
max() | 求最大值 |
min() | 最小值 |
count需要注意的操作
count(字段) 会忽略null值
count(*) 不会忽略null值
count(1) 不会忽略null值
7.3MD5加密
md5:主要增强算法复杂度,不可逆。
原理:相同的数据,加密后是相同的。
用法:MD5(‘str’);
校验:将用户传入的值进行加密后和数据库中的内容进行比对。
select 完整语法:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]
8.事务
8.1 事务介绍
要么都成功,要么都失败。
事务的ACID原则:
- 原子性:同一个事务要么都完成,要么都不完成。
- 一致性:最终一致性,事务前后数据完整性保持一制。
- 隔离性:针对多用户,多个事务相互之间隔离,相互之间不会干扰。
- 持久性:事务提交后,数据不会再随着环境修改。
事务隔离产生的一些问题
- 脏读:一个事务读取了另一个事务未提交的数据
- 不可重复读:在同一个事务中,多次读取结果不同。(修改)
- 幻读:在读取数据的时候,读到其他事务添加的数据。
事务隔离级别
- 读未提交
- 读提交
- 可重复读
- 序列化
8.2 事务sql实际操作
进行事务操作的实际工程
--首先关闭自动提交
set autocommit=0; --关闭自动提交
--事务开启
start transaction; --标记一个事务,之后的sql将在这个事务中执行
--响应的sql操作
--设置保存点(可选项)
savepoint;
--提交事务后回滚事务
commit/rollback;
--回滚到保存点
rollback to savepoint;
--释放保存点
release savepoint
--最后开启自动提交
set autocommit=1; //开启自动提交
9.索引
索引介绍比较详细的一篇博客https://www.cnblogs.com/tgycoder/p/5410057.html
锁的介绍:https://www.cnblogs.com/tgycoder/p/5410537.html
索引:(Index)是帮助MySQL高效获取数据的数据结构。
9.1索引分类
- 主键索引
- 唯一标识,主键不可重复,只能有一列作为主键索引
- 唯一索引
- 避免重复的列,唯一索引中的数据可以重复
- 常规索引
- 默认的,index , key关键字
- 全文索引
- 在特定数据库引擎下
- 快速定位数据
- fulltext
显示所有的索引信息
show index from 表名;
alter table 表名 add index 索引名(列名);
create index 索引名 on 表名(列名);
explain +sql语句
--全文索引的使用sql
select * from student where match(name)against('str');
--在数据量较少的情况下不会使用全文索引
9.2测试索引
explain
9.3索引原则
- 索引并不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的数据不要加索引
- 索引一般添加在经常查询的字段上
10 用户管理
sql命令
实际上就是对mysql.user表进行增删改查
--创建用户操作
create user wangyc identified by '123456';
--修改当前用户密码
set password =password('新密码');
--修改密码
set password for 用户=password('新密码');
--修改用户名
rename user 旧用户名=新用户名
--为用户设定权限
grant all privileges on *.*;
--查看用户权限
show grant for 用户名;
show grant for root@localhost;
mysql备份
为什么要备份:
- 保证数据不丢失
- 数据转移
备份方式:
- 直接拷贝物理文件
- 可视化工具
- 使用命令行导出,mysqldump
--数据库导出
--mysqldump -hlocalhost -uroot -p123456 数据库名 表名>磁盘位置;
--数据库导入
--source 备份文件
source D:/1.sql
11.数据库设计
为什么要进行数据库设计
- 数据库比较复杂时,就需要设计
糟糕的数据库设计
- 数据冗余,浪费空间
- 插入和删除复杂
- 开发困难
好的数据库设计
-
节省空间
-
保证数据完整性
-
方便开发
数据库开发
- 需求分析
- 概要设计:设计关系图E-R图
前端:ant design
11.1三大范式
为什么需要规范?
- 防止数据重复
- 防止修改错误
第一范式(1NF)
原子性: 所有的字段都不能再分
第二范式(2NF)
每张表中只描述一件事情
第三范式(3NF)
确保每一列数据都和主键相关,不能间接相关
规范性和性能问题
关联查询的表不超过三张
- 考虑商业化的需求和目标
- 首先考虑性能问题
- 在某些表中添加冗余性
host;
> mysql备份
为什么要备份:
- 保证数据不丢失
- 数据转移
备份方式:
- 直接拷贝物理文件
- 可视化工具
- 使用命令行导出,mysqldump
```sql
--数据库导出
--mysqldump -hlocalhost -uroot -p123456 数据库名 表名>磁盘位置;
--数据库导入
--source 备份文件
source D:/1.sql
11.数据库设计
为什么要进行数据库设计
- 数据库比较复杂时,就需要设计
糟糕的数据库设计
- 数据冗余,浪费空间
- 插入和删除复杂
- 开发困难
好的数据库设计
-
节省空间
-
保证数据完整性
-
方便开发
数据库开发
- 需求分析
- 概要设计:设计关系图E-R图
前端:ant design
11.1三大范式
为什么需要规范?
- 防止数据重复
- 防止修改错误
第一范式(1NF)
原子性: 所有的字段都不能再分
第二范式(2NF)
每张表中只描述一件事情
第三范式(3NF)
确保每一列数据都和主键相关,不能间接相关
规范性和性能问题
关联查询的表不超过三张
- 考虑商业化的需求和目标
- 首先考虑性能问题
- 在某些表中添加冗余性
- 故意添加一些计算列