1、初识MySQL
javaEE:企业级java开发,web
后台(连接点:连接数据库jdbc,连接前段(控制,控制视图跳转,给钱地暖传数据))
数据库(存数据,Txt,Excel,word)
操作系统、数据结构与算法
离散数学、数字电路、体系结构、编译原理
1.1、数据库分类
关系型数据库:
- MySQL、Oracle、SqlServer、DB2
- 通过表和表之间,行和列之间的关系进行数据的存储
非关系型数据库:
- Redis、mongdb
- 非关系型数据库,对象存储,通过对象的自身的属性来决定
DBMS:
- 数据库的管理软件
- MySQL、数据库管理系统
2、列类型
2.1、数值
- tinyint 十分小得数据 1字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准的整数 4个字节 常用的int
- bigint 较大的数据 8个字节
- float 浮点数 4个字节
- double 浮点数 8个字节
- decimal 字符串形式的浮点数,金融计算的时候,一般使用
2.2、字符串
- char 字符串固定的大小 0-255
- varchar 可变字符串 0-65535 常用的变量 string
- tingtext 微型文本 2^8-1
- text 文本串 2^16-1 保存大文本
2.3、事件日期
- date YYYY-MM-DD 日期格式
- time HH:MM:SS 时间格式
- datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
- timestamp **时间戳 1970.1.1 到现在的毫秒数!**也较为常用
- year 年份表示
3、字段属性
Unsigned:
- 无符号的整数
- 声明了该列不能声明为负数(否则报错)
zerofill:
- 0填充的
- 不足的位数,使用0来填充
4、表操作
- show create database school;查看创建数据库的语句
- show create table student;查看数据表的定义语句
- desc student;显示表的结构
- id int(4) default not null comment ‘注释’;注释
4.1、字符集编码
charset=utf8
4.2、修改表结构
4.3、清除表
truncate table xxx
作用:完全清空一个数据库表,表的结构和索引约束不变
- 自增会归 0
5、DQL查询数据(最重点)
5.1、DQL
- 所有的查询操作都用
- 简单的查询,复杂的查询
- 数据库最核心的语言,最重要的查询
- 使用频率最高的语句
5.2、查询去重
distinct
select distinct id from student;
5.3、数据库的表达式
select version(); 查询系统版本(函数)
select 100*3-1 as 结果;用来计算
select @@auto_increment_increment;查询自增的步长(变量)
5.4、模糊查询
比较运算符
5.5、连表查询
5.6、分页和排序
limit 和 order by
排序
升序:ASC 降序:DESC
**select 分数 from 表 order by 分数 ASC;**按成绩升序排序
分页
瀑布流
每页只显示五条数据
select 分数 from 表
order by 分数 ASC
limit 0, 5;
语法:
- limit 起始值, 页面的大小
- 网页应用:当前,总的页数,页面大小
pageSize:页面大小
(n-1)*pageSize:起始值
n:当前页
数据总数/页面大小=总页数
6、函数
https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html
6.1、常用函数
abs() 绝对值
ceiling() 向上取整
floor() 向下取整
rand() 返回0-1之间的随机数
sign() 判断一个数的符号 负数返回-1,整数返回1
==字符串函数
char_length() 返回字符串的长度
concat() 拼接字符串
lower() 转小写
upper() 转大写
instr('abc', 'b') 返回第一次出现的字串的索引
replace(a,b,c) 把a中的b字符串替换为c字符串
substr('adf',2,4) 返回指定的字符串(源字符串,截取位置,截取长度)
reverse() 反转
==时间和日期==
current_date() 获取当前日期
curdate() 获取当前日期
now() 获取当前时间
localtime() 获取本地时间
system() 获取系统时间
year(now()) 获取年
month(now()) 获取月
day(now()) 获取日
hour(now()) 获取时
6.2、聚合函数
count() 函数
count(字段) 会忽略null值
count(*) 不会忽略null值,计算行数
count(1) 计算行数
sum() 求和
avg() 平均值
6.3、分组和过滤
group by 字段; :指定结果按照哪几个字段来分组
having 分数>80; :记录分组的记录必须满足的次要条件
6.4、数据库级别的MD5加密(扩展)
不可逆
7、事务
7.1、什么是事务
要么都成功,要么都失败
将一组SQL放在一个批次中去执行
事务原则:ACID原则 原子性、一致性、隔离性、持久性
**原子性:**要么都成功,要么都失败
一致性:事务前后的数据完整性要保证一致
隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务所操作的事务之间要相互隔离
持久性:事务一旦提交则不可逆,被持久话到数据库中
隔离所导致的一些问题
- 脏读:指一个事务读取了另外一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(这个不一定是错误,只是某些场所不对)
- 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
7.2、测试事务实现转账
set autocommit = 0 //关闭事务
set autocommit = 1 //开启事务(mysql默认开启)
手动处理事务
--事务开启
start transaction --标记一个事务的开始,从这个之后的SQL都在同一个事务内
insert xx
insert xx
--提交,持久化(成功)
commit
--回滚:回到原来的样子(失败)
rollback
--事务结束
set autocommit = 1 --开启自动提交
--了解
savepoint 保存点名 --设置一个事务的保存点
rollback to savepoint 保存点名; --回滚到保存点
release savepoint 保存点名;--撤销保存点名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBrNS0FP-1654158069839)(C:\Users\15751083927\AppData\Roaming\Typora\typora-user-images\image-20220508152439832.png)]
8、索引
8.1、索引的分类
高效获取数据的数据结构
索引的本质是数据结构
- 主键索引(primary key)
- 唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(unique key)
- 避免重复的列出现,可以重复出现,多个列都可以标识位 唯一索引
- 常规索引(key/index)
- 默认的,index key关键字来设置
- 全文索引(fulltext)
- 在特定的数据库引擎下才有,mylsam
- 快速定位数据
8.2、创建索引
查询速度快(在大数据的时候)
8.3、索引原则
- 索引不是越多越好
- 不要对经常变动的表加索引
- 小数据量不需要加索引
- 索引一般加在常用来查询的字段上!
https://blog.youkuaiyun.com/qq_44129924/article/details/115333658
9、权限管理和备份
用户表:mysql.user
本质:对这张表进行增删改查
备份
为什么要备份:
- 保证重要的数据不丢失
- 数据转移
mysql数据库备份的方式
-
直接拷贝物理文件
-
在sqlyog这种可视化工具中手动导出
- 右键,导出
-
使用命令行导出mysqldump 命令行使用
-
==导出 mysqldump -h主机 -u用户名 -p密码 数据库 表明 >物理磁盘位置/文件名 mysqldump -h主机 -u用户名 -p密码 数据库 表1,表2 >物理磁盘位置/文件名 ==导入 #登录的情况下,切换到指定的数据库 #source 备份文件
-
-
防止数据丢失,发送数据库
10、规范数据库设计
10.1、为什么需要设计
-
当数据库比较复杂时
-
节省内存空间
-
保证数据库的完整性
-
方便我们开发系统
软件开发中,关于数据库的设计
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图ER图
设计数据库的步骤:(个人博客)
-
收集信息:分析需求
- 用户表(用户登录注销、用户的个人信息、写博客、创建分类)
- 分类表(文章分类、谁创建的)
- 文章表(文章的信息)
- 友链表(友链信息)
- 自定义表 (系统信息,某个关键字,或者一些主字段)key:value (个人)
-
标识实体(把需求落地到每个字段)
-
标识实体之间的关系
10.2、数据库设计三大范式
为什么需要信息规范化
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效的信息
三大范式
**第一范式(1NF)😗*列不可再分
1.每一列属性都是不可再分的属性值,确保每一列的原子性
2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
第二范式(2NF)属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键
每张表只描述一件事
**第三范式(3NF)**属性不依赖于其它非主属性 属性直接依赖于主键
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)
总结:[三大范式]只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
规范性 和 性能的问题
关联查询的表不得超过三张表
- 考虑商业化的需求和目标,(成本,用户体验)数据库的性能更加重要
- 在规范性能的问题的时候,需要是适当考虑一下规范性
- 故意给某些表增加一些冗余字段(从多表查询变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询)
11、JDBC
介绍:https://blog.youkuaiyun.com/weixin_43883917/article/details/112378784
实操:https://blog.youkuaiyun.com/Mr_Gaojinchao/article/details/108927711
11.1、数据库连接池
池化技术:准备一些预先的资源,过来就连接预先准备好的
最小连接数:10
最大连接数:100 业务最高重载上限
等待超时:100ms
编写连接池,实现一个接口DataSource
DBCP:https://blog.youkuaiyun.com/brushli/article/details/80413461
C3P0:https://www.jianshu.com/p/7858bdef4de5
Druid :阿里巴巴
算列(从大数据量降低为小数据量的查询)
11、JDBC
介绍:https://blog.youkuaiyun.com/weixin_43883917/article/details/112378784
实操:https://blog.youkuaiyun.com/Mr_Gaojinchao/article/details/108927711
11.1、数据库连接池
池化技术:准备一些预先的资源,过来就连接预先准备好的
最小连接数:10
最大连接数:100 业务最高重载上限
等待超时:100ms
编写连接池,实现一个接口DataSource
DBCP:https://blog.youkuaiyun.com/brushli/article/details/80413461
C3P0:https://www.jianshu.com/p/7858bdef4de5
Druid :阿里巴巴