Mysql温习 | 青训营笔记

103 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

Mysql温习

2023.1.27

由于笔者在大二的时期学习了数据库设计这门课程,但是在如今忘记地差不多了,并且当时学校教学的是orcale数据库,使用的sql-develop,比mysql数据库更加高级,今日开发项目之前,温习一下mysql数据库的遗忘的知识。

参考视频

【黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括】 www.bilibili.com/video/BV1Kr…

分类

  • DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
  • DML: 数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: 数据查询语言,用来查询数据库中表的记录
  • DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限

DDL(数据定义语言)

数据库

创建数据库:(学校没教学) CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];

注意事项
  • UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集

这里我看默认的navicat创建表和数据库都是使用utf8mb4的编码格式

DML(数据操作语言)

更新和删除数据

修改数据: UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ]; 例: UPDATE emp SET name = 'Jack' WHERE id = 1;

删除数据一般开发用不上,一般都是软删除

DQL(数据查询语言)

SELECT
    字段列表
FROM
    表名字段
WHERE
    条件列表
GROUP BY
    分组字段列表
HAVING
    分组后的条件列表
ORDER BY
    排序字段列表
LIMIT
    分页参数

分组查询

这里学校没有教学,学习一下分组

语法: SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];

where 和 having 的区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤
  • 判断条件不同:where不能对聚合函数进行判断,而having可以

个人理解:将一列的数据安装不同进行分组,然后将分成的组查询

注意事项
  • 执行顺序:where > 聚合函数 > having
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义 比如某个字段的字段名

排序

排序方式:

  • ASC: 升序(默认)
  • DESC: 降序

Order by xxx Asc (Desc)

分页查询

注意是从0开始,使用limit关键字

起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数

如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10

DQL执行顺序

FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT

DCL

一般用不上,这种是管理用户的用法

,用的时候查询互联网即可

注意:orcale数据库有角色的概率,mysql好像没有角色的概率?

函数

流程函数

常用函数:

函数功能
IF(value, t, f)如果value为true,则返回t,否则返回f
IFNULL(value1, value2)如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END如果val1为true,返回res1,... 否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END如果expr的值等于val1,返回res1,... 否则返回default默认值

一般使用流程函数,字符串函数使用较少

日期函数

常用函数:

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1, date2)返回起始时间date1和结束时间date2之间的天数

这里,我感觉一般是后端的语言提取处理再进行处理,一般不用在sql方面

约束

删除/更新行为

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与RESTRICT一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录
SET NULL当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为null)
SET DEFAULT父表有变更时,子表将外键设为一个默认值(Innodb不支持)

默认为前两者

实际开发一般用不上,在阿里巴巴java开发手册中不需要使用外键约束

事务

四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

开启事务: START TRANSACTION 或 BEGIN TRANSACTION; 提交事务: COMMIT; 回滚事务: ROLLBACK;

一般在框架上使用事务

并发事务 (非常重要)

问题描述
脏读一个事务读到另一个事务还没提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同
幻读一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在

这三个问题的详细演示:www.bilibili.com/video/BV1Kr…

并发事务隔离级别:

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××
  • √表示在当前隔离级别下该问题会出现
  • Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差

查看事务隔离级别: SELECT @@TRANSACTION_ISOLATION; 设置事务隔离级别: SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }; SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效