Mysql基础教程
一、mysql概述
MySQL是一款开源的关系型数据库管理系统,使用SQL语言进行数据管理,因其性能优异、成本低廉和社区活跃,成为LAMP/LEMP技术栈的核心组件,支撑着全球大多数网站和应用。 默认端口: 3306
- 关系型:数据像 Excel表格,有严格的结构
- 非关系型:数据像 JSON对象,结构灵活
二、sql基本操作
启动mysql: net start mysql 需要配置环境变量
停止mysql: net stop mysql
登录mysql: mysql -u 用户名 -p [数据库名];
查看版本: mysql version();
退出: exit;
注意事项:
sql可以单行或多行书写,以分号结尾;
sql可以使用空格、缩进来增强语句的可读性。 注释: 单行:– 或 # 多行 /* */
mysql数据库不区分大小写,关键字建议大写。
三、DDL操作
1.库操作
(1)创建库
| 指令 | 完整语法 | 作用 | 是否检查存在 | 设置字符集 | 示例 |
|---|---|---|---|---|---|
| 基本创建 | CREATE DATABASE 数据库名; |
创建数据库 | ❌ 不检查 | ❌ 默认 | CREATE DATABASE school; |
| 检查存在 | CREATE DATABASE IF NOT EXISTS 数据库名; |
安全创建(不存在才创建) | ✅ 检查 | ❌ 默认 | CREATE DATABASE IF NOT EXISTS school; |
| 指定字符集 | CREATE DATABASE 数据库名 CHARACTER SET 字符集; |
创建并指定字符编码 | ❌ 不检查 | ✅ 指定 | CREATE DATABASE school CHARACTER SET utf8mb4; |
| 指定排序规则 | CREATE DATABASE 数据库名 COLLATE 排序规则; |
创建并指定排序规则 | ❌ 不检查 | ✅ 影响 | CREATE DATABASE school COLLATE utf8mb4_general_ci; |
| 完整创建 | CREATE DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序规则; |
完整配置创建 | ❌ 不检查 | ✅ 都指定 | CREATE DATABASE school CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; |
(3)查看和切换库
| 指令 | 作用 |
|---|---|
show databases |
查看当前所有库 |
select database() |
查看当前库 |
SHOW CREATE DATABASE 数据库名; |
显示数据库创建语句 |
user 数据库名 |
使用库 |
(4)修改和删除库
| 指令 | 完整语法 | 作用 | 适用版本 | 示例 | 注意事项 |
|---|---|---|---|---|---|
| 修改字符集 | ALTER DATABASE 数据库名 CHARACTER SET 字符集; |
修改数据库默认字符集 | 所有版本 | ALTER DATABASE school CHARACTER SET utf8mb4; |
不影响已有表,仅影响新表 |
| 修改排序规则 | ALTER DATABASE 数据库名 COLLATE 排序规则; |
修改数据库默认排序规则 | 所有版本 | ALTER DATABASE school COLLATE utf8mb4_unicode_ci; |
同上 |
| 修改字符集和排序规则 | ALTER DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序规则; |
同时修改字符集和排序规则 | 所有版本 | ALTER DATABASE school CHARSET=utf8mb4 COLLATE=utf8mb4_bin; |
常用组合修改 |
| 删除库 | drop database 数据库名 |
删除 | |||
| 判断并删除库 | drop database is exists 数据库名 |
删除 |
1 | #创建数据库 characrer set 设置字符 默认就是utf8mb4 collate 整理 |
(5)备份和还原库
| 指令 | 作用 |
|---|---|
mysqldump -u用户名 -p密码 数据库名 > d:\\backup.sql |
将数据库备份到d盘下的backup.sql |
mysqldump -u用户名 -p密码 --all-databases > all_backup.sql |
备份所有数据库 |
mysqldump -u用户名 -p密码 数据库名 表1 表2 > tables_backup.sql |
备份数据库的表数据 |
mysql -u用户名 -p密码 数据库名 < 备份表 |
将备份的数据转到数据库 |
2.表操作
(1)基本格式:
1 | CREATE TABLE [IF NOT EXISTS] 表名 ( |
(2)表增删改
| 操作 | SQL 命令 | 说明 |
|---|---|---|
| 添加字段名 | `ALTER TABLE 表名 ADD 列名 类型 [约束] [first | after 其他字段名];` |
| 删除字段 | ALTER TABLE 表名 DROP 列名; |
删除字段 |
| 修改字段类型 | `ALTER TABLE 表名 MODIFY 列名 新类型 [约束] [first | after 其他字段名];` |
| 重命名字段 | `ALTER TABLE 表名 CHANGE 旧列名 新列名 类型 [约束] [first | after 其他字段名];` |
| 重命名表 | ALTER TABLE 旧表名 rename 新表名; |
修改表名 |
| 清空表 | TRUNCATE TABLE 表名; |
清空表数据(不可回滚) |
| 删除表 | DROP TABLE [if exists] 表名; |
删除表(包括数据) |
| 查看结构 | DESC 表名; |
查看表结构 |
| 添加主键 | ALTER TABLE 表名 ADD PRIMARY KEY (列名); |
设置主键 |
| 删除主键 | ALTER TABLE 表名 DROP PRIMARY KEY; |
删除主键 |
| 添加索引 | CREATE INDEX 索引名 ON 表名 (列名); |
创建索引 |
| 删除索引 | DROP INDEX 索引名 ON 表名; |
删除索引 |
1 | #练习 |
四、数据类型
1.mysql也有数据类型,用于表示每个字段的类型是什么和占用多大空间.
2.整数类型
| 数据类型 | 字节 | 有符号范围 | 无符号范围 | 描述 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 极小整数 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 小整数 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等整数 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 常用整数 |
| BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 大整数 |
注:在整数类型后面再加: unsigned表示无符号范围; 如: book_price int unsigned;
3.定点和浮点类型
| 数据类型 | 字节 | 范围 | 描述 |
|---|---|---|---|
| FLOAT | 4 | ±1.175e-38 ~ ±3.402e38 | 单精度浮点数,约7位精度 |
| DOUBLE | 8 | ±2.225e-308 ~ ±1.798e308 | 双精度浮点数,约15位精度 |
| DECIMAL(M,D) | 变长 | 取决于M和D | 精确小数,M为总位数,D为小数位 |
4.字符串类型
| 数据类型 | 最大长度 | 描述 | 存储特点 |
|---|---|---|---|
| CHAR(n) | 255字符 | 固定长度字符串 | 长度不足用空格填充,检索快 |
| VARCHAR(n) | 65535字节 | 可变长度字符串 | 只存储实际长度,节省空间 |
| TINYTEXT | 255字节 | 短文本 | 最大255字符 |
| TEXT | 64KB | 长文本 | 最大65535字符 |
| MEDIUMTEXT | 16MB | 中等文本 | 最大约1600万字符 |
| LONGTEXT | 4GB | 超长文本 | 最大约43亿字符 |
5.二进制数据
| 数据类型 | 最大长度 | 描述 |
|---|---|---|
| BINARY(n) | 255字节 | 固定长度二进制 |
| VARBINARY(n) | 65535字节 | 可变长度二进制 |
| TINYBLOB | 255字节 | 小二进制对象 |
| BLOB | 64KB | 二进制大对象 |
| MEDIUMBLOB | 16MB | 中等二进制对象 |
| LONGBLOB | 4GB | 超大二进制对象 |
6.特殊类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| ENUM(‘v1’,’v2’,…) | 枚举类型 | ENUM(‘男’,’女’) |
| SET(‘v1’,’v2’,…) | 集合类型 | SET(‘阅读’,’音乐’,’运动’) |
| JSON | JSON数据 | {"name": "John"} |
7.日期类型
| 数据类型 | 格式 | 范围 | 描述 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 日期 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 时间 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 日期时间 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 时间戳,带时区 |
| YEAR | YYYY | 1901 ~ 2155 | 年份 |
注:日期类型后面可以带入 default, 参数:
1 | CURRENT_TIMESTAMP 如果没有给时间,自动添加当前时间; |
五、约束
| 约束类型 | 关键字 | 核心作用 | 适用场景 |
|---|---|---|---|
| 非空约束 | NOT NULL |
强制字段不能存储 NULL 值 | 姓名、手机号、员工编号等必填字段 |
| 主键约束 | PRIMARY KEY |
唯一标识表中的每行数据(非空 + 唯一),一张表只能有一个主键 | 员工编号、用户 ID、订单 ID 等唯一标识 |
| 自增约束 | AUTO_INCREMENT |
自动生成唯一递增值 | 如id等自动递增 |
| 唯一约束 | UNIQUE |
强制字段值唯一(可包含 NULL,多张唯一约束) | 手机号、邮箱、身份证号等不能重复的字段 |
| 默认约束 | DEFAULT |
字段未赋值时,自动填充默认值 | 性别默认「男」、状态默认「启用」 |
| 外键约束 | FOREIGN KEY |
建立两张表的关联,保证子表数据依赖于父表的有效性(维护参照完整性) | 员工表的部门 ID 关联部门表的 ID |
| 检查约束 | CHECK |
强制字段值满足指定条件(MySQL 8.0.16+ 才真正支持) | 性别只能是「男 / 女」、年龄≥18 等 |
1 | #主表 |
六、DML操作
| 操作 | SQL 语句 | 说明 |
|---|---|---|
| 插入数据 | INSERT INTO 表 (列1,列2) VALUES (值1,值2); |
插入单行 |
| 批量插入 | INSERT INTO 表 VALUES (行1值),(行2值); |
插入多行 |
| 更新数据 | UPDATE 表 SET 列=值,列=值 [WHERE 条件]; |
更新记录 |
| 删除数据 | DELETE FROM 表 [WHERE 条件]; |
删除记录 |
| 插入查询结果 | INSERT INTO 表1 SELECT * FROM 表2; |
从查询插入 |
| 替换数据 | REPLACE INTO 表 VALUES (...); |
存在则更新,否则插入 |
| 合并数据 | MERGE INTO 表 USING ... |
合并操作(Oracle/SQL Server) |
1 | create table if not exists books( |
七、DQL操作
1.条件语句(where)
| 条件类型 | 运算符 | 示例 | 说明 |
|---|---|---|---|
| 比较条件 | =, <>, !=, >, <, >=, <= |
WHERE age >= 18 |
比较大小 |
| 逻辑条件 | `AND &&, OR | , NOT !, XOR` | |
| 范围条件 | BETWEEN ... AND ... |
WHERE age BETWEEN 18 AND 60 |
范围查询 |
| 列表条件 | IN (...) NO IN(...) |
WHERE id IN (1, 2, 3) |
在列表中 |
| 模糊匹配 | LIKE %匹配0-n个字符 _匹配1个字符 |
WHERE name LIKE '张%' |
模式匹配 |
| 空值判断 | IS NULL, IS NOT NULL |
WHERE email IS NOT NULL |
空值判断 |
1 | #条件语句 |
2.基础查询
| 查询功能 | SQL 命令示例 | 说明 |
|---|---|---|
| 查询所有列 | SELECT * FROM 表名; |
返回所有字段 |
| 查询指定列 | SELECT 列1, 列2 FROM 表名; |
返回指定字段 |
| 使用别名 | SELECT 列名 AS 别名 FROM 表名; |
给列起别名 |
| 去重查询 | SELECT distinct 列名 FROM 表名; |
去除重复值 |
| 条件查询 | SELECT * FROM 表名 WHERE 条件; |
按条件筛选 |
| 常数查询 | SELECT *,"字符串" as 自定义列名 from 表名; |
仅此次查询增加一列 |
1 | create table if not exists employees( |
3.分组查询
| 查询类型 | SQL 语句 | 说明 | 结果示例 |
|---|---|---|---|
| 基础分组 | SELECT 列, COUNT(*) FROM 表 GROUP BY 列; |
按单列分组统计 | 各部门人数 |
| 多列分组 | SELECT 列1,列2,COUNT(*) FROM 表 GROUP BY 列1,列2; |
多列组合分组 | 各部门各职位人数 |
注: 分组查询最基本条件是group by 后面的列 必须在查询列有,并且必须使用至少一个聚合函数!!!!
1 | #分组查询 |
4.排序查询
| 排序类型 | SQL 语句 | 说明 | 示例结果 |
|---|---|---|---|
| 单列升序/降序 | `ORDER BY 列 ASC | DESC 默认ASC` | 从小到大排序 |
| 多列排序 | ORDER BY 列1, 列2 DESC |
先按列1排,相同再按列2 | (A,100), (A,90), (B,100) |
| 按表达式排序 | ORDER BY 列1+列2 |
按计算结果排序 | 按总分、总价等 |
5.分页查询
| 语法格式 | 说明 | 示例 | 结果 |
|---|---|---|---|
LIMIT n |
只限制数量,不偏移 | LIMIT 10 |
前10条 |
LIMIT m, n |
偏移m条,取n条 | LIMIT 20, 10 |
第21-30条 |
1 | #分页查询 查询从第四条数据开始后四条数据 |
1 | 执行顺序: FORM > WHERE > GROUP BY...HAVING > ORDER BY > LIMIT |
6.多表查询
| 多表查询类型 | 核心语法 | 作用说明 | 极简实操案例(基于 student/score/classes 表) | 适用场景 |
|---|---|---|---|---|
| 内连接(INNER JOIN) | SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段=表2.字段; (可省略INNER,直接写JOIN) |
只返回两张表中「关联条件匹配」的行(最常用) | SELECT s.sname, sc.score FROM student s JOIN score sc ON s.sid = sc.sid;(查询有成绩的学生姓名+分数) |
需同时获取多张表的关联数据 |
| 多表联查(3张及以上 | SELECT * FROM 表1 JOIN 表2 ON 条件1 JOIN 表3 ON 条件2; |
依次关联多张表,关联条件需匹配表之间的外键关系 | SELECT s.sname, c.cname, sc.score FROM student s JOIN classes c ON s.cid = c.cid JOIN score sc ON s.sid = sc.sid;(查询学生姓名+班级名称+分数) |
需跨多张表获取关联数据 |
| 左外连接(LEFT JOIN | SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.字段=表2.字段; |
返回「左表所有行」+「右表关联匹配的行」,右表无匹配则补NULL | SELECT s.sname, sc.score FROM student s LEFT JOIN score sc ON s.sid = sc.sid;(查询所有学生,无成绩则score为NULL) |
需保留左表全部数据 |
| 右外连接(RIGHT JOIN) | SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.字段=表2.字段; |
返回「右表所有行」+「左表关联匹配的行」,左表无匹配则补NULL | SELECT s.sname, sc.score FROM student s RIGHT JOIN score sc ON s.sid = sc.sid;(查询所有成绩,无对应学生则sname为NULL) |
需保留右表全部数据 |
| 全外连接(FULL JOIN) | MySQL无原生FULL JOIN,需用LEFT JOIN UNION RIGHT JOIN模拟 |
返回「左表+右表所有行」,无匹配则补NULL | SELECT s.sname, sc.score FROM student s LEFT JOIN score sc ON s.sid=sc.sid UNION SELECT s.sname, sc.score FROM student s RIGHT JOIN score sc ON s.sid=sc.sid; |
需保留两张表的全部数据 |
| 自连接(SELF JOIN) | SELECT * FROM 表1 t1 JOIN 表1 t2 ON t1.字段=t2.字段; |
同一张表当作两张表关联查询(给表起不同别名) | SELECT t1.sname 学生, t2.sname 同班同学 FROM student t1 JOIN student t2 ON t1.cid = t2.cid AND t1.sid != t2.sid WHERE t1.sname = '张三';(查询张三的同班同学) |
表内数据有层级/关联关系 |
| 子查询(嵌套查询) | SELECT * FROM 表1 WHERE 字段 IN (SELECT 字段 FROM 表2 WHERE 条件); |
把一个查询结果作为另一个查询的条件/数据源 | SELECT sname FROM student WHERE sid IN (SELECT sid FROM score WHERE score > 90);(查询分数>90的学生姓名) |
关联条件复杂、需先筛选再查询 |
| 联合查询(UNION/UNION ALL) | SELECT 字段 FROM 表1 UNION SELECT 字段 FROM 表2;(去重) SELECT 字段 FROM 表1 UNION ALL SELECT 字段 FROM 表2;(不去重) |
合并多个查询结果,垂直拼接数据 | SELECT sid, sname FROM student WHERE cid=1 UNION SELECT sid, sname FROM student WHERE cid=2;(合并1班和2班学生) |
合并结构相同的查询结果 |
1 | #多表查询 |
八、函数
1.聚合函数
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| COUNT | COUNT(expr) |
统计行数 | SELECT COUNT(*) FROM users; |
| SUM | SUM(expr) |
求和 | SELECT SUM(salary) FROM employees; |
| AVG | AVG(expr) |
平均值 | SELECT AVG(score) FROM students; |
| MAX | MAX(expr) |
最大值 | SELECT MAX(price) FROM products; |
| MIN | MIN(expr) |
最小值 | SELECT MIN(age) FROM users; |
| GROUP_CONCAT | GROUP_CONCAT(expr) |
合并字符串 | SELECT GROUP_CONCAT(name) FROM users; |
2.字符串函数
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| CONCAT | CONCAT(str1, str2, ...) |
连接字符串 | SELECT CONCAT(first, ' ', last); |
| SUBSTRING | SUBSTR(str, start, len) |
截取子串 | SELECT SUBSTR('Hello', 2, 3); → ‘ell’ |
| LENGTH | LENGTH(str) |
字符串长度 | SELECT LENGTH('Hello'); → 5 |
| UPPER/LOWER | UPPER(str), LOWER(str) |
大小写转换 | SELECT UPPER(name); |
| TRIM | TRIM(str) |
去除首尾空格 | SELECT TRIM(' hello '); |
| REPLACE | REPLACE(str, from, to) |
替换字符串 | REPLACE('A-B-C', '-', '/') → ‘A/B/C’ |
| LEFT/RIGHT | LEFT(str, n), RIGHT(str, n) |
左右截取 | SELECT LEFT('2024-01-21', 4); → ‘2024’ |
| INSTR | INSTR(str, substr) |
查找位置 | SELECT INSTR('hello', 'e'); → 2 |
| LPAD/RPAD | LPAD(str, len, padstr) |
左右填充 | SELECT LPAD('5', 3, '0'); → ‘005’ |
3.数值函数
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ROUND | ROUND(num, decimals) |
四舍五入 | SELECT ROUND(3.14159, 2); → 3.14 |
| CEIL/FLOOR | CEIL(num), FLOOR(num) |
向上/向下取整 | SELECT CEIL(3.2); → 4 |
| ABS | ABS(num) |
绝对值 | SELECT ABS(-10); → 10 |
| MOD | MOD(dividend, divisor) |
取余数 | SELECT MOD(10, 3); → 1 |
| POW | POW(base, exponent) |
幂运算 | SELECT POW(2, 3); → 8 |
| SQRT | SQRT(num) |
平方根 | SELECT SQRT(16); → 4 |
| RAND | RAND() |
随机数(0-1) | SELECT RAND(); |
| FORMAT | FORMAT(num, decimals) |
格式化数字 | SELECT FORMAT(1234567.89, 2); → ‘1,234,567.89’ |
4.日期函数
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| NOW/CURDATE/CURTIME | NOW(), CURDATE(), CURTIME() |
当前日期时间 | SELECT NOW(); → ‘2024-01-21 10:30:00’ |
| DATE_FORMAT | DATE_FORMAT(date, format) |
格式化日期 | SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); |
| DATE_ADD/DATE_SUB | DATE_ADD(date, INTERVAL expr unit) |
日期加减 | SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); |
| DATEDIFF | DATEDIFF(date1, date2) |
日期差(天) | SELECT DATEDIFF('2024-01-31', '2024-01-01'); → 30 |
| YEAR/MONTH/DAY | YEAR(date), MONTH(date), DAY(date) |
提取年月日 | SELECT YEAR('2024-01-21'); → 2024 |
| HOUR/MINUTE/SECOND | HOUR(time), MINUTE(time), SECOND(time) |
提取时分秒 | SELECT HOUR('10:30:45'); → 10 |
| WEEK/DAYOFWEEK | WEEK(date), DAYOFWEEK(date) |
周数/星期几 | SELECT DAYOFWEEK('2024-01-21'); → 1(周日) |
| LAST_DAY | LAST_DAY(date) |
月最后一天 | SELECT LAST_DAY('2024-02-15'); → ‘2024-02-29’ |
5.条件判断函数
| 函数 | 语法 | 说明 | 示例 |
|---|---|---|---|
| IF | IF(expr, true_value, false_value) |
简单条件判断 | SELECT IF(score>=60, '及格', '不及格'); |
| CASE WHEN | CASE WHEN ... THEN ... END |
多条件判断 | 见详细示例 |
| IFNULL | IFNULL(expr, value) |
NULL替换 | SELECT IFNULL(name, '未知'); |
| COALESCE | COALESCE(expr1, expr2, ...) |
返回第一个非NULL值 | SELECT COALESCE(middle, first, '无名'); |
1 | #函数 |
6.加密函数
| 函数 | 算法 | 输出长度 | 是否可逆 | 用途 |
|---|---|---|---|---|
| MD5() | MD5 | 32字符 | ❌ 不可逆 | 简单哈希,已不推荐安全用途 |
| SHA2() | SHA-256/512 | 64/128字符 | ❌ 不可逆 | 目前推荐的安全哈希 |
| AES_ENCRYPT() | AES | 变长 | ✅ 可逆 | 对称加密,需要密钥 |
| AES_DECRYPT() | AES | 变长 | ✅ 可逆 | AES解密 |
7.窗口函数
| 函数 | 作用 | 案例 |
|---|---|---|
| `over() | (partition by 字段)分组 | (order by)` |
row_number() |
将返回数据进行标序号 | select name,dept,salary,row_number() over(order by salary) from employee; 和over搭配使用 |
1 | #单表查询综合实战 |
九、事务
1.ACID 原则:
| 特性 | 说明 | 示例 |
|---|---|---|
| Atomicity(原子性) | 事务是不可分割的最小单位 | 转账:A扣款和B加款必须同时成功或失败 |
| Consistency(一致性) | 事务前后数据状态一致 | 转账前后总金额不变 |
| Isolation(隔离性) | 并发事务互不干扰 | 两个转账操作互不影响 |
| Durability(持久性) | 事务提交后永久保存 | 转账成功后数据不会丢失 |
2.开始事务方式1:
| 指令 | 作用 |
|---|---|
select @@autocommit |
当为1时表示自动提交(默认),当为0的时候手动提交 |
| `set @@autocommit = 0 | 1` |
commit |
手动提交当前执行的所有指令 |
rollback |
回滚操作,不执行所有指令 |
1 | #事务 |
2.开始事务方式2:
| 指令 | 作用 |
|---|---|
方式1:START TRANSACTION; 方式2:BEGIN;(简写) |
显式开启手动事务,临时将当前会话的 AUTOCOMMIT 设为 0(自动提交关闭) |
COMMIT; |
将事务内所有 SQL 操作的修改持久化到数据库,结束事务 |
ROLLBACK; |
撤销事务内所有未提交的修改,恢复到事务开启前的状态,结束事务 |
SAVEPOINT 保存点名; (如 SAVEPOINT sp1;) |
在事务内创建「局部回滚标记」,可回滚到该标记处,而非全部回滚 |
ROLLBACK TO 保存点名; (如 ROLLBACK TO sp1;) |
仅撤销「保存点之后」的操作,保留「保存点之前」的操作 |
RELEASE SAVEPOINT 保存点名; (如 RELEASE SAVEPOINT sp1;) |
删除事务内指定的保存点,释放资源 |
1 | begin; -- 或者 start transaction |
3.事务隔离级别
| 隔离级别名称 | 关键字 | 核心定义 | 能解决的并发问题 | 存在的并发问题 | 性能排序 | 典型适用场景 |
|---|---|---|---|---|---|---|
| 读未提交 (Read Uncommitted) | READ UNCOMMITTED |
一个事务能读取到其他事务未提交的修改(最低级别) | 无(仅解决了最基础的操作原子性) | 脏读、不可重复读、幻读 | 最高 | 极少使用(仅临时测试 / 对数据一致性无要求的场景) |
| 读已提交 (Read Committed) | READ COMMITTED |
一个事务只能读取到其他事务已提交的修改 | 脏读 | 不可重复读、幻读 | 次高 | 大多数互联网业务(如电商、社交,平衡一致性和性能) |
| 可重复读 (Repeatable Read) | REPEATABLE READ |
MySQL 默认级别,一个事务内多次读取同一数据,结果始终一致(不受其他事务提交影响) | 脏读、不可重复读 | 幻读(MySQL 已通过 MVCC 解决) | 次低 | 金融 / 财务类业务(需保证事务内数据一致性) |
| 串行化 (Serializable) | SERIALIZABLE |
最高级别,事务串行执行(加锁),完全隔离,无并发问题 | 脏读、不可重复读、幻读 | 无 | 最低 | 对数据一致性要求极高的场景(如银行核心交易) |
| 操作类型 | 语法/命令 | 作用描述 | 生效范围 | 权限要求 | 注意事项 |
|---|---|---|---|---|---|
| 1. 查看全局隔离级别 | SELECT @@GLOBAL.transaction_isolation; (8.0+) |
查看全局 | 全局设置 | SELECT权限 | MySQL 8.0+ 使用新变量名 |
| 2 查看当前隔离级别 | SELECT @@transaction_isolation; (8.0+) |
查看当前事务 | 当前会话 | SELECT权限 | 简化写法,返回会话级别 |
| 4. SHOW VARIABLES查看 | SHOW VARIABLES LIKE 'transaction_isolation'; (8.0+) |
显示隔离级别系统变量值 | 系统变量 | SELECT权限 | 显示变量名和值 |
| 5. 设置当前会话 | SET TRANSACTION = "级别"; |
设置当前会话的隔离级别 | 当前会话后续所有事务 | 无特殊权限 | 立即生效,不影响其他会话 |
1 | 脏读: 一个事务读取到另一个事务未提交的数据; 错误 |
十、用户管理
| 操作类别_______________________________ | 操作命令 | 语法格式 | 作用说明_______________________________________________________________________________ | 权限要求__________________________ |
|---|---|---|---|---|
| 1. 查看用户 | 查看所有用户 | SELECT User, Host FROM mysql.user; |
查看MySQL所有用户及允许登录的主机 | SELECT权限 |
| 查看当前用户 | SELECT CURRENT_USER(); SELECT USER(); |
查看当前登录用户信息 | 无 | |
| 2. 创建用户 | 创建新用户 | `CREATE USER ‘用户名‘@’主机’ [IDENTIFIED BY ‘密码’] 主机:localhost | ip | % ;` |
| 3. 删除用户 | 删除用户 | DROP USER '用户名'@'主机', ...; |
删除指定用户,或多个用户 | CREATE USER权限 |
| 4. 修改用户 | 修改用户名 | RENAME USER '旧用户'@'主机' TO '新用户'@'主机'; |
修改用户名 | CREATE USER权限 |
| 修改主机限制 | 先删除再创建或使用RENAME | 修改用户允许登录的主机 | CREATE USER权限 | |
| 5. 修改密码 | 修改自己密码 | ALTER USER USER() IDENTIFIED BY '新密码'; |
修改当前登录用户密码 | 无 |
| 修改他人密码 | ALTER USER '用户'@'主机' IDENTIFIED BY '新密码'; |
修改指定用户密码 | CREATE USER权限 | |
| 6. 用户授权 | 授予权限 | GRANT 权限列表 ON 数据库.表 TO '用户'@'主机'; |
授予用户特定权限 | GRANT权限 |
| 授予所有权限 | GRANT ALL PRIVILEGES ON *.* TO '用户'@'主机'; |
授予用户所有权限(超级用户) | 超级用户权限 | |
| 授予GRANT权限 | GRANT 权限列表 ON 数据库.表 TO '用户'@'主机' WITH GRANT OPTION; |
允许用户将权限授予他人 | 超级用户权限 | |
| 7. 查看权限 | 查看用户权限 | SHOW GRANTS FOR '用户'@'主机'; |
查看指定用户权限 | SELECT权限 |
| 查看自己权限 | SHOW GRANTS; |
查看当前用户权限 | 无 | |
| 8. 撤销权限 | 撤销权限 | REVOKE 权限列表 ON 数据库.表 FROM '用户'@'主机'; |
撤销用户特定权限 | GRANT权限 |
| 撤销所有权限 | REVOKE ALL PRIVILEGES ON *.* FROM '用户'@'主机'; |
撤销用户所有权限 | 超级用户权限 | |
| 撤销GRANT权限 | REVOKE GRANT OPTION ON 数据库.表 FROM '用户'@'主机'; |
撤销用户授权给别人的权限 | 超级用户权限 | |
| 9. 刷新权限 | 刷新权限 | FLUSH peivileges; |
刷新权限缓存,使修改立即生效 | RELOAD权限 |
| 10. 锁定/解锁 | 锁定用户 | ALTER USER '用户'@'主机' ACCOUNT LOCK; |
锁定用户禁止登录 | CREATE USER权限 |
| 解锁用户 | ALTER USER '用户'@'主机' ACCOUNT UNLOCK; |
解锁允许用户登录 | CREATE USER权限 |
权限大全:
| 权限类别 | 权限名称 | 关键字 | 核心作用 |
|---|---|---|---|
| 数据权限 | 查询权限 | SELECT | 读取表中的数据 |
| 插入权限 | INSERT | 向表中插入新数据 | |
| 更新权限 | UPDATE | 修改表中的数据 | |
| 删除权限 | DELETE | 删除表中的数据 | |
| 结构权限 | 创建权限 | CREATE | 创建数据库、表、视图等 |
| 删除权限 | DROP | 删除数据库、表等 | |
| 修改权限 | ALTER | 修改表结构(添加/删除列等) | |
| 索引权限 | INDEX | 创建和删除索引 | |
| 视图权限 | CREATE VIEW | 创建视图 | |
| 触发器权限 | TRIGGER | 创建/删除触发器 | |
| 临时表权限 | CREATE TEMPORARY TABLES | 创建临时表 | |
| 存储过程权限 | CREATE ROUTINE | 创建存储过程/函数 | |
| 修改存储过程 | ALTER ROUTINE | 修改存储过程/函数 | |
| 执行存储过程 | EXECUTE | 执行存储过程/函数 | |
| 事件权限 | EVENT | 创建/修改/删除事件 | |
| 管理权限 | 全部权限 | ALL PRIVILEGES | 所有权限(最高权限) |
| 授权权限 | GRANT OPTION | 允许用户将自己的权限授予他人 | |
| 超级权限 | SUPER | 执行管理命令,绕过权限限制 | |
| 进程权限 | PROCESS | 查看所有进程(SHOW PROCESSLIST) | |
| 文件权限 | FILE | 读写服务器文件(危险) | |
| 关闭权限 | SHUTDOWN | 关闭MySQL服务器 | |
| 刷新权限 | RELOAD | 执行FLUSH操作(如刷新权限) | |
| 显示数据库 | SHOW DATABASES | 查看所有数据库列表 | |
| 锁表权限 | LOCK TABLES | 锁定表 | |
| 复制客户端 | REPLICATION CLIENT | 查看主从复制状态 | |
| 复制从库 | REPLICATION SLAVE | 作为从库复制数据 | |
| 创建用户 | CREATE USER | 创建新用户 | |
| 其他权限 | 引用权限 | REFERENCES | 创建外键约束(基本无用) |
| 代理权限 | PROXY | 代理其他用户(企业版) | |
| 使用权限 | USAGE | 无实际权限,仅用于连接 |
1 | #查看用户和当前用户 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Ulen!
评论



ch02090071
3559561470
https://github.com/Xcww824/Ulen_Bloy




