玩儿转MySQL
数据库的特点:
- 持久化存储数据,数据库就是一个文件系统
- 方便存储并管理数据
- 提供了方式统一操作数据
常见的数据库软件:
- 数据库软件是对数据库的不同实现
- 常见的有:
- Oracle
- MySQL
- Microsoft SQL Server
- DB2
- MongoDB
- SQLite
- Redis
MySQL准备
安装:推荐5.7版本
-
Windows直接官网下载安装包,然后根据提示选择并下一步,如果要删除除了在控制面板卸载,还需要在C盘的ProgramData的目录下的mysql目录卸载
-
Linux下的安装/卸载参考博客另一篇博文《我的linux工作平台搭建》
启动
|
|
SQL语句
- SQL: Structured Qurey Language,结构化查询语言实际上就是定义了操作所有关系型数据库的规则
|
|
SQL语句分类
DDL(操作数据库、表)
- 数据定义语言
- drop,create,alter
Create
数据库:
|
|
数据库类型:
- int(位数):整数类型
- double(位数):小数类型
- date:日期(yyyy-MM-dd)
- datetime:日期(yyyy-MM-dd HH:mm:ss)
- timestamp:时间戳类型,默认是当前系统的时间
- varchar(位数):字符串类型
表:
|
|
Retrieve
数据库:
|
|
表:
|
|
Update
数据库
|
|
表
|
|
Delete
数据库
|
|
表
|
|
使用数据库
|
|
DML(增删改表中的数据)
- 数据操作语言
- insert,delete,update
基础查询
|
|
add
- 如果不写表名,表示所有字段
|
|
delete
|
|
modify
|
|
DQL(查询表中的数据)
- 数据查询语言
- select,where
排序查询
|
|
聚合函数
- 将一列数据作为一个整体进行纵向计算
- count,max,min,sum,avg
- 聚合函数的计算会排除null值
- 解决方案1:选择非空列(主键 or *)
- 解决方案2:IFNULL函数
|
|
分组查询
- 查询显示列只能是当前分组字段 或者 纵向处理后的聚合函数
- where是分组之前的条件限制,having是分组之后的条件限制
- where后筛选出条目—>group分组—>having分组后筛选
- where后不能跟聚合函数,having后可以跟聚合函数,因为聚合函数是对where后的结果进行计算的
|
|
分页查询
- 当前索引 = (当前页码 - 1) * 每页条数
- limit语句是mysql的“方言”
|
|
DCL(授权)
- 数据控制语言
- GRANT,REVOKE
|
|
|
|
约束
- 对表中的数据进行限定,保证数据的正确性,有效性和完整性
- mysql中约束分类:
- 主键约束:primary key
- 主键:非空 且 唯一
- 一张表只能有一个字段是主键
- 主键是表中每条记录的唯一标识
- 自增长:如果某一列是数值类型,使用auto_increment可以来完成自动增长,一般配合主键一起使用
- 非空约束:not null
- 唯一约束:unique
- mysql中多个null不算重复
- 外键约束:foreign key
- 如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键
- 主键约束:primary key
|
|
多表之间的关系
一对一
- 人和身份证
- 可以在任意一方添加外键指向另一方的主键,然后将外键设置为unique
一对多
- 部门和员工
- 在多的一方建立外键,指向一的一方的主键
多对多
- 学生和课程
- 需要借助第三张中间表,中间表中的两个字段作为中间表两个外键,分别指向两个表的主键
范式
-
设计关系型数据库时需要遵循的一些规范
-
各种范式成递次规范,越高的范式数据库冗余越小
-
目前关系型数据库有6中范式:
- **第一范式(1NF):**每一列都是不可分割的原子项
- **第二范式(2NF):**在1NF的基础上消除了非主属性对主码的部分函数依赖
- ** 通过A可以 确定唯一B,则B依赖于A
- 完全函数依赖: 如果A是一个属性组,则B的确定需要依赖于A属性组中所有属性,此时B完全依赖于A属性组
- 部分函数依赖: B属性的确定只需要依赖于A属性组中某一些值,则B部分依赖于A属性组
- 传递函数依赖: A—>B,B—>C,C传递函数依赖于A
- 码: 一个表中,如果一个属性或属性组被其他所有属性所完全依赖,则这个属性或属性组为该表的码。(也称为候选码,同一张表中可以有多个候选码)
- 主属性: 候选码中的所有属性
- 非主属性: 一张表中,除了主属性以外的其他所有属性
- 第三范式(3NF): 在2NF的基础上消除了传递依赖
-
巴斯-科德范式(BCNF):需要消除“表中的主属性部分依赖于某个候选码“这种情况,也就是主属性内部不能有部分或传递依赖
-
第四范式(4NF)
-
第五范式(5NF)
数据库备份和还原
- 也就是把目前的数据库所有状态写进sql文件中持久化保存
-
命令行:
-
语法:
- 备份:
1
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
- 还原:
- 登录数据库
- 创建数据库
- 使用数据库
- 执行备份文件
1
source 文件路径
-
-
图形化工具备份
多表查询
|
|
不同where加条件就会得到笛卡尔积,多表查询要做的就是消除笛卡尔积的无用内容
内连接查询
隐式内连接
|
|
显式内连接
|
|
外连接查询
左外连接
- 查询的左表所有信息以及和右表的交集部分
|
|
右外连接
- 查询的右表所有信息以及和左表的交集部分
|
|
子查询
- 查询中嵌套查询,称嵌套查询为子查询。
|
|
- 子查询结果的几种情况:
- **单行单列:**子查询结果可以作为条件(用比较运算符)
- **多行单列:**子查询结果可以作为集合条件(用 in)
- **多行多列:**子查询结果集可以作为一张虚拟表继续进行查询
事务
事务的基本介绍
-
如果一个包含多个步骤的业务操作,被食物管理,那么这些操作要么同时成功,要么同事失效
-
操作:
- 开启事务:
start transactoin
- 回滚:
rollback
- 提交:
commit
- 开启事务:
-
mysql数据库中事务默认自动提交
1 2 3
#查看默认事务提交方式 select @@autocommit; #1自动,0手动 set @@autocommit = 0;
事务的四大特征
- 原子性:不可分割最小操作单位
- 持久性:当事务提交或回滚后,数据库会持久化保存数据
- 隔离性:多个事务之间应该相互独立
- 一致性:事务 操作前后,数据总量保持不变
事务的隔离级别
-
概念:多个事务之间是隔离的,相互隔离的。但是如果多个事务(线程)操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
-
脏读: 读取到另一个事务没有提交的数据
-
不可重复读(虚读): 同一个事务中,两次读到的数据不一样
-
幻读: 一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
-
4中隔离级别:级别从小到大安全性越高,效率越低
-
**read uncommitted:**读未提交
产生的问题:脏读,虚读,幻读
-
**read committed:**读已提交(Oracle默认)
产生的问题:虚读,幻读
-
**repeatable read:**可重复读(MySQL默认)
产生的问题:幻读
-
**Serializable:**串行化
产生的问题:无
1 2 3 4
#查询隔离级别 select @@tx_isolation #数据库设置级别 set global transaction isolation level 级别字符串;
-
接下来是MySQL高级部分
索引
- 索引是帮助MySQL高效获取数据的数据结构
- 优势:
- 快速查询
- 降低数据排序成本,降低CPU消耗
- 劣势
- 索引占用磁盘控件
- 降低了更新表速率
索引结构
- MySQL目前有以下4种索引
- BTREE索引
- HASH索引
- R-tree索引
- Full-text索引
- MySQL默认支持的InnoDB引擎主要就是支持BTREE索引,主要也是介绍BTREE引擎
BTREE索引
- MySQL中的BTREE索引默认是用的B+树
锁
从一个错误引申出Mysql的锁
Lock wait timeout exceeded; try restarting transaction
- 原因:后提交的事务等待前面的事务释放锁,但是等待的时候超过了mysql锁等待时间
- 解决:
- information_schema/performance_schema表保存了MySQL服务器所有数据库信息
- mysql8之前的版本:
1 2 3
innodb_trx:当前运行的所有事务 innodb_locks:当前出现的锁 innodb_lock_waits:锁等待的对应关系
- mysql8之后的版本:
1 2 3
innodb_trx:当前运行的所有事务 innodb_locks:当前出现的锁 innodb_lock_waits:锁等待的对应关系
- 查询数据库中有的锁:
1 2
select * from information_schema.innodb_trx; # trx_mysql_thread_id就是事务对应的线程id,直接kill掉即可
- 显示正在运行的线程,辅助定位问题:
1
show full processlist;