MySQL 作为最流行的关系型数据库之一,在开发和运维中应用广泛。本文将系统梳理 MySQL 的核心知识点,涵盖数据库与表操作、数据类型、约束、SQL 语句(DDL、DML、DQL)、查询技巧、多表关联、索引、事务、窗口函数、存储过程、视图、用户管理等内容,帮助读者构建完整的 MySQL 知识体系。
一、数据库与表操作(DDL)
数据定义语言(DDL)用于创建、修改和删除数据库对象(如数据库、表),是数据库操作的基础。
1. 数据库操作
(1)创建数据库
-- 基本创建(指定字符集和校验规则)
CREATE DATABASE [IF NOT EXISTS] <数据库名>
CHARACTER SET utf8
COLLATE utf8_general_ci;
(2)查看数据库信息
-- 显示所有数据库
SHOW DATABASES;
-- 查看数据库创建语句
SHOW CREATE DATABASE <数据库名>;
-- 查看系统默认字符集与校验规则
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';
(3)修改与删除数据库
-- 修改数据库字符集和校验规则
ALTER DATABASE <数据库名>
CHARACTER SET gbk
COLLATE gbk_chinese_ci;
-- 删除数据库(谨慎操作!)
DROP DATABASE [IF EXISTS] <数据库名>;
(4)数据库备份与恢复
# 备份(MySQL 外部执行)
mysqldump -u root -p -P 3306 -B <数据库名> > /backup/<数据库名>.sql
-- 恢复(MySQL 内部执行)
SOURCE /backup/<数据库名>.sql;
(5)查看连接情况
-- 查看当前数据库连接状态
SHOW PROCESSLIST;
2. 数据表操作
(1)创建表
CREATE TABLE 表名 (
字段名1 类型 约束 [COMMENT 字段描述],
字段名2 类型 约束 [COMMENT 字段描述],
...
[PRIMARY KEY(主键字段)] -- 主键约束
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
[COMMENT 表描述];
示例:创建学生表 tb_student
CREATE TABLE tb_student (
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
username VARCHAR(20) NOT NULL COMMENT '用户名',
age TINYINT UNSIGNED COMMENT '年龄',
gender ENUM('男','女','保密') COMMENT '性别',
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '学生信息表';
(2)查看表结构
-- 查看表基本结构
DESC <表名>;
-- 查看表详细创建语句(含注释、字符集等)
SHOW CREATE TABLE <表名>;
(3)修改表结构
-- 添加字段(指定位置)
ALTER TABLE <表名> ADD <字段名> CHAR(11) AFTER <跟在哪一个字段后边的字段名>;
-- 修改字段类型
ALTER TABLE <表名> MODIFY <字段名> VARCHAR(20);
-- 修改字段名和类型
ALTER TABLE <表名> CHANGE mobile <字段名> CHAR(11);
-- 删除字段
ALTER TABLE <表名> DROP <字段名>;
-- 修改表名
ALTER TABLE <表名> RENAME TO <新表名>;
(4)删除表
-- 删除表(谨慎操作!)
DROP TABLE [IF EXISTS] <表名>;
二、MySQL 数据类型详解
设计数据表时,选择合适的字段类型是基础,需根据业务场景合理选型。
1. 数值类型
用于存储整数、小数等数值,分为整数类型和小数类型。
(1)整数类型(精确值)
| 类型 | 字节数 | 范围(无符号) | 应用场景 |
|---|---|---|---|
| TINYINT | 1 | 0~255 | 年龄、状态(0/1) |
| SMALLINT | 2 | 0~65535 | 小范围计数(如订单状态) |
| MEDIUMINT | 3 | 0~16777215 | 中等规模 ID(如用户 ID) |
| INT | 4 | 0~4294967295 | 常用 ID、数量 |
| BIGINT | 8 | 0~18446744073709551615 | 大数据量计数(如日志 ID) |
| BIT(m) | 1~8 | 1~64 位 | 二进制数据(如权限标识) |
| BOOL | 1 | 0(假)、1(真) | 逻辑判断 |
选择原则:满足业务范围即可,避免浪费空间。例如,存储年龄用 TINYINT,存储用户 ID 用 INT 或 BIGINT(视用户规模而定)。
(2)小数类型(浮点 / 定点)
- FLOAT/DOUBLE(浮点型,近似值):适用于非精确计算(如温度、重量)。
FLOAT(M,D)表示总长度为 M,小数位为 D(如FLOAT(7,4)可存 999.0001)。 - DECIMAL/NUMERIC(定点型,精确值):适用于精确计算(如金额、薪资)。
DECIMAL(M,D)中 M 为总位数(最大 65),D 为小数位(最大 30),如DECIMAL(11,2)可存 999999999.99。
2. 字符串与二进制类型
用于存储文本、二进制数据,核心类型包括 CHAR、VARCHAR、TEXT 和 BLOB。
| 类型 | 特点 | 长度限制 | 应用场景 |
|---|---|---|---|
| CHAR(size) | 定长,不足补空格,查询时自动去空格 | 0~255 字符 | 手机号(11 位)、密码哈希 |
| VARCHAR(size) | 变长,仅占实际空间 + 1~2 字节长度标识 | 0~65535 字节 | 用户名、标题(长度不固定) |
| TEXT | 大文本存储,不支持全文索引和默认值 | 0~65535 字节(TEXT) | 文章内容、详细描述 |
| BLOB | 二进制类型,存储图片、音频等 | 0~65535 字节(BLOB) | 二进制文件(实际常用路径存储) |
选择建议:
- 长度固定(如手机号)用
CHAR,长度可变(如用户名)用VARCHAR; - 超过 255 字符(如文章内容)用
TEXT; - 二进制数据优先考虑存储路径,而非直接用
BLOB。
3. 日期时间类型
用于存储时间相关数据,常用类型如下:
| 类型 | 格式 | 范围 | 特点 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 仅日期 |
| 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 | 自动更新为当前时间(未指定时) |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 可表示时间间隔(如运行时长) |
| YEAR | YYYY | 1901 ~ 2155 | 仅年份 |
示例:存储文章发布时间用 DATETIME,存储用户注册时间且需自动记录用 TIMESTAMP。
4. 特殊字符串类型
- ENUM:枚举类型,只能从预定义值中选一个(如
gender ENUM('男','女','保密'))。 - SET:集合类型,可从预定义值中选多个(如
hobby SET('读书','运动','游戏')),查询用FIND_IN_SET(sub, str_list)函数。
三、数据约束
约束用于保证数据的完整性和一致性,常用约束包括以下类型:
1. 核心约束
| 约束类型 | 说明 | 示例 |
|---|---|---|
| NOT NULL | 字段不能为空 | username VARCHAR(20) NOT NULL |
| DEFAULT | 字段默认值 | status TINYINT DEFAULT 0 |
| PRIMARY KEY | 主键(非空且唯一,唯一标识记录) | id INT PRIMARY KEY |
| AUTO_INCREMENT | 自增长(需配合整数主键,一个表仅一个) | id INT AUTO_INCREMENT PRIMARY KEY |
| UNIQUE | 唯一键(值不重复,可为空) | mobile CHAR(11) UNIQUE |
| FOREIGN KEY | 外键(关联主表主键,保证关联完整性) | FOREIGN KEY(class_id) REFERENCES myclass(id) |
| ZEROFILL | 零填充(整数类型,不足位数补前导 0) | id INT(10) ZEROFILL |
| COMMENT | 字段 / 表描述(注释,仅开发者可见) | username VARCHAR(20) COMMENT '用户名' |
2. 外键约束详解
外键用于定义主表和从表的关联关系,主表需有主键或唯一键:
-- 先创建主表(班级表)
CREATE TABLE myclass (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL COMMENT '班级名'
);
-- 再创建从表(学生表)
CREATE TABLE stu (
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL COMMENT '学生名',
class_id INT,
FOREIGN KEY (class_id) REFERENCES myclass(id)
);
规则:从表插入 / 更新数据时,class_id 必须在主表 id 中存在或为 NULL。
四、数据操作(DML)
数据操纵语言(DML)用于对表中数据进行增、删、改操作。
1. 插入数据(INSERT)
-- 单行全列插入
INSERT INTO <表名> VALUES (NULL, '张三', 20, '男');
-- 多行指定列插入
INSERT INTO <表名>(username, age, gender)
VALUES
('李四', 22, '女'),
('王五', 19, '男');
-- 插入否则更新(主键/唯一键冲突时更新)
INSERT INTO <表名> (id, username)
VALUES (1, '张三三')
ON DUPLICATE KEY UPDATE username = '张三三';
-- 替换(主键/唯一键冲突时删除再插入)
REPLACE INTO <表名> (id, username) VALUES (1, '张三');
-- 插入查询结果
INSERT INTO tb_student_bak (username, age)
SELECT username, age FROM <表名> WHERE age > 20;
2. 更新数据(UPDATE)
-- 单条件更新
UPDATE <表名>
SET age = 23, gender = '男'
WHERE username = '李四';
-- 多条件更新(结合排序和分页)
UPDATE <表名>
SET age = age + 1
WHERE gender = '男'
ORDER BY id DESC
LIMIT 10;
3. 删除数据(DELETE)
-- 条件删除
DELETE FROM <表名> WHERE id = 3;
-- 清空表(保留结构,自增ID重置,不可回滚)
TRUNCATE TABLE <表名>;
-- 批量删除(结合排序和分页)
DELETE FROM <表名>
WHERE age < 18
ORDER BY id
LIMIT 5;
五、查询技巧(DQL)
数据查询语言(DQL)是 MySQL 核心,用于从表中提取数据,支持复杂条件、聚合、分组等操作。
1. 基础查询
-- 全列查询(不推荐,效率低)
SELECT * FROM <表名>;
-- 指定列查询
SELECT username, age FROM <表名>;
-- 字段表达式查询
SELECT username, age + 1 AS new_age FROM <表名>;
-- 去重查询
SELECT DISTINCT age FROM <表名>;
2. 条件查询(WHERE)
(1)比较运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于(NULL 不安全) | age = 20 |
| <=> | 等于(NULL 安全) | address <=> NULL |
| != / <> | 不等于 | age != 20 |
| BETWEEN...AND... | 范围匹配 | age BETWEEN 18 AND 25 |
| IN / NOT IN | 多值匹配 | id IN (1,3,5) |
| LIKE | 模糊匹配(% 任意字符,_单个字符) | username LIKE '张%' |
| IS NULL / IS NOT NULL | 空值判断 | address IS NOT NULL |
(2)逻辑运算符
-- AND(多条件同时满足)
SELECT * FROM <表名> WHERE age > 18 AND gender = '男';
-- OR(任意条件满足)
SELECT * FROM <表名> WHERE age < 18 OR gender = '女';
-- NOT(条件取反)
SELECT * FROM <表名> WHERE NOT age = 20;
3. 排序与分页
-- 单字段排序(ASC 升序,DESC 降序)
SELECT * FROM <表名> ORDER BY age DESC;
-- 多字段排序(先按性别升序,再按年龄降序)
SELECT * FROM <表名> ORDER BY gender ASC, age DESC;
-- 分页查询(LIMIT 偏移量, 条数;偏移量从 0 开始)
SELECT * FROM <表名> LIMIT 0, 10; -- 第一页(1-10条)
SELECT * FROM <表名> LIMIT 10, 10; -- 第二页(11-20条)
4. 聚合查询与分组
(1)聚合函数
| 函数 | 说明 | 示例 |
|---|---|---|
| COUNT(*) | 统计记录数(包含 NULL) | COUNT(*) AS total |
| SUM(expr) | 求和(仅数值类型) | SUM(age) AS sum_age |
| AVG(expr) | 求平均值 | AVG(age) AS avg_age |
| MAX(expr) | 求最大值 | MAX(age) AS max_age |
| MIN(expr) | 求最小值 | MIN(age) AS min_age |
(2)分组查询(GROUP BY)
-- 按性别分组,统计每组人数和平均年龄
SELECT gender, COUNT(*) AS count, AVG(age) AS avg_age
FROM <表名>
GROUP BY gender;
-- 分组后筛选(HAVING,筛选分组结果,区别于 WHERE)
SELECT gender, COUNT(*) AS count
FROM <表名>
GROUP BY gender
HAVING count > 2;
5. 关键字执行顺序
FROM > ON > JOIN > WHERE > GROUP BY > WITH > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
六、复合查询与多表关联
实际业务中数据常分布在多张表,需通过复合查询获取完整信息。
1. 子查询(嵌套查询)
(1)单行子查询(返回单列单行)
-- 查询与“张三”同部门的员工
SELECT * FROM <表名>
WHERE deptno = (SELECT deptno FROM <表名> WHERE ename = '张三');
(2)多行子查询(返回单列多行)
-- IN:匹配任意一个值
SELECT * FROM <表名>
WHERE job IN (SELECT DISTINCT job FROM <表名> WHERE deptno = 10);
-- ALL:大于所有值
SELECT * FROM <表名>
WHERE sal > ALL (SELECT sal FROM <表名> WHERE deptno = 30);
-- ANY:大于任意一个值
SELECT * FROM <表名>
WHERE sal > ANY (SELECT sal FROM <表名> WHERE deptno = 30);
(3)多列子查询(返回多列多行)
-- 查询与“张三”部门和岗位完全相同的员工
SELECT * FROM <表名>
WHERE (deptno, job) = (SELECT deptno, job FROM <表名> WHERE ename = '张三')
AND ename != '张三';
(4)from 子句中子查询(临时表)
-- 查询高于部门平均工资的员工
SELECT e.* FROM <表名1> e,(
SELECT deptno, AVG(sal) AS avg_sal FROM <表名>
GROUP BY deptno
)
AS tmp
WHERE e.sal > tmp.avg_sal AND e.deptno = tmp.deptno;
2. 多表连接查询
(1)内连接(INNER JOIN,仅返回匹配记录)
SELECT g.title, c.name
FROM <表名1> g
INNER JOIN <表名2> c
ON g.cid = c.id; -- 关联条件
(2)外连接
- 左外连接(LEFT JOIN):保留左表所有记录,右表无匹配则为
NULL - 右外连接(RIGHT JOIN):保留右表所有记录,左表无匹配则为
NULL
-- 左外连接:查询所有产品,包括未匹配分类的产品
SELECT g.title, c.name
FROM <表名1> g
LEFT JOIN <表名2> c
ON g.cid = c.id;
(3)自连接(同表连接)
-- 查询员工的上级领导信息
SELECT worker.ename AS 员工, leader.ename AS 领导
FROM emp worker
LEFT JOIN emp leader
ON worker.mgr = leader.empno;
(4)联合查询(UNION/UNION ALL)
-- UNION:合并结果并去重
SELECT * FROM emp WHERE sal > 2500
UNION
SELECT * FROM emp WHERE job = 'MANAGER';
-- UNION ALL:合并结果,保留重复记录(效率更高)
SELECT * FROM emp WHERE sal > 2500
UNION ALL
SELECT * FROM emp WHERE job = 'MANAGER';
七、内置函数
MySQL 提供丰富的内置函数,涵盖日期、字符串、数学等场景:
1. 日期函数
CURRENT_DATE() -- 获取当前日期
CURRENT_TIME() -- 获取当前时间
CURRENT_TIMESTAMP() -- 获取当前时间戳
NOW() -- 获取当前日期时间
DATE_ADD(date, INTERVAL 10 DAY) -- 日期加10天
DATE_SUB(date, INTERVAL 1 HOUR) -- 日期减1小时
DATEDIFF(date1, date2) -- 两日期相差天数
DATE_FORMAT(date,"%Y%m%d") -- 格式化日期
2. 字符串函数
CONCAT(str1, str2) -- 字符串拼接
INSTR(str, substr) -- 查找子串位置
UCASE(str) / LCASE(str) -- 大小写转换
SUBSTRING(str, pos, len) -- 截取字符串
LENGTH(str) -- 字符串长度
REPLACE(str, old, new) -- 字符串替换
TRIM(str) -- 去除前后空格
3. 数学函数
ABS(num) -- 绝对值
CEIL(num) / FLOOR(num) -- 向上/向下取整
RAND() -- 随机数(0.0~1.0)
MOD(num, den) -- 取模
FORMAT(num, dec) -- 保留小数位数
4. 其他函数
USER() -- 查看当前用户
DATABASE() -- 查看当前数据库
MD5(str) -- MD5 加密
IFNULL(val1, val2) -- 若 val1 为 NULL 则返回 val2
PASSWORD(str) -- 密码加密(MySQL 8.0 已弃用)
八、索引
索引是提高查询效率的核心,类似书籍目录,可快速定位数据。
1. 索引基础
(1)索引类型
| 索引类型 | 说明 | 特点 |
|---|---|---|
| 主键索引 | 基于主键创建 | 唯一、非空,查询效率最高 |
| 唯一索引 | 基于唯一键创建 | 值不重复,可为空 |
| 普通索引 | 基于普通字段创建 | 无唯一性限制,应用最广 |
| 全文索引 | 基于大文本字段创建 | 支持全文检索(MyISAM 支持,InnoDB 8.0 + 支持) |
(2)创建原则
- 频繁作为查询条件的字段适合创建索引;
- 唯一性差的字段(如性别)不适合单独创建索引;
- 更新频繁的字段不适合创建索引;
- 不参与查询的字段无需创建索引。
2. 索引操作
-- 创建普通索引
CREATE INDEX <索引名> ON <表名>(age);
-- 创建唯一索引
CREATE UNIQUE INDEX <索引名> ON <表名>(mobile);
-- 创建联合索引(多字段)
CREATE INDEX <索引名> ON <表名>(username, age);
-- 查看索引
SHOW INDEX FROM <表名>;
SHOW KEYS FROM <表名>;
-- 删除索引
DROP INDEX <索引名> ON <表名>;
ALTER TABLE <表名> DROP INDEX <索引名>;
-- 删除主键索引
ALTER TABLE <表名> DROP PRIMARY KEY;
九、事务
事务用于保证一组操作的原子性(要么全执行,要么全不执行),支持 ACID 特性(原子性、一致性、隔离性、持久性)。
1. 事务操作
-- 开启事务
START TRANSACTION;
-- 或 BEGIN;
-- 创建保存点
SAVEPOINT save1;
-- 执行操作(增删改)
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
-- 回滚到保存点
ROLLBACK TO save1;
-- 回滚整个事务
ROLLBACK;
-- 提交事务(操作生效,不可回滚)
COMMIT;
2. 隔离级别
事务隔离级别用于解决并发问题(脏读、不可重复读、幻读):
| 隔离级别 | 说明 | 并发问题解决情况 |
|---|---|---|
| 读未提交(Read Uncommitted) | 允许读取未提交数据 | 脏读、不可重复读、幻读均存在 |
| 读提交(Read Committed) | 仅读取已提交数据 | 解决脏读,存在不可重复读、幻读 |
| 可重复读(Repeatable Read) | 同一事务多次读取结果一致 | 解决脏读、不可重复读,MySQL 解决幻读 |
| 串行化(Serializable) | 事务串行执行 | 所有并发问题均解决,效率最低 |
-- 查看隔离级别
SELECT @@global.tx_isolation; -- 全局
SELECT @@session.tx_isolation; -- 会话
-- 设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3. MVCC 机制
MVCC(多版本并发控制)是 InnoDB 实现隔离级别的核心,通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)、undo 日志和读视图(Read View)实现快照读,避免锁竞争,提高并发效率。
十、视图
视图是虚拟表,基于查询结果创建,不存储实际数据,仅保存查询逻辑。
1. 视图操作
-- 创建视图
CREATE VIEW <视图名> AS
SELECT * FROM <表名> WHERE gender = '男';
-- 查询视图
SELECT * FROM <视图名>;
-- 修改视图(修改底层查询逻辑)
CREATE OR REPLACE VIEW <视图名> AS
SELECT username, age FROM <表名> WHERE gender = '男';
-- 删除视图
DROP VIEW IF EXISTS <视图名>;
2. 视图特点
- 简化复杂查询,隐藏查询逻辑;
- 只允许查询,修改需满足特定条件;
- 视图依赖基表,基表数据变更会同步到视图。
十一、窗口函数
窗口函数(MySQL 8.0+)用于在一组相关行上执行计算,保留原始行数,附加统计结果,适合排名、累计求和等场景。
1. 基本语法
函数名(字段) OVER (
[PARTITION BY 分组字段] -- 分组(类似 GROUP BY,不合并行)
[ORDER BY 排序字段 [ASC|DESC]] -- 分组内排序
[ROWS|RANGE BETWEEN 边界条件] -- 窗口范围(如前 N 行到当前行)
)
2. 常用窗口函数
(1)排名函数
| 函数 | 说明 | 示例 |
|---|---|---|
| RANK() | 跳跃排名(1,2,2,4...) | 成绩排名(相同分数并列) |
| DENSE_RANK() | 连续排名(1,2,2,3...) | 筛选 Top N 排名 |
| ROW_NUMBER() | 顺序编号(1,2,3,4...) | 唯一序号标记 |
-- 按科目分组,对成绩降序排名
SELECT
student_name, subject, score,
RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS dense_rank,
ROW_NUMBER() OVER (PARTITION BY subject ORDER BY score DESC) AS row_num
FROM tb_score;
(2)聚合类窗口函数
-- 按学生分组,累计成绩
SELECT
student_name, subject, score,
SUM(score) OVER (PARTITION BY student_name ORDER BY subject) AS total_score
FROM tb_score;
(3)分布函数
-- 百分比排名
SELECT
student_name, score,
PERCENT_RANK() OVER (ORDER BY score) AS pct_rank
FROM tb_score WHERE subject = '数学';
十二、存储过程
存储过程是预编译的 SQL 语句集合,类似函数,可封装复杂逻辑,重复调用。
1. 存储过程特点
- 预编译:创建时编译,调用时直接执行,效率高;
- 封装性:隐藏复杂逻辑,简化调用;
- 安全性:限制直接操作表,通过存储过程间接访问;
- 可复用:一次创建,多处调用。
2. 存储过程操作
(1)创建与调用
-- 1.创建无参数存储过程
DELIMITER //
CREATE PROCEDURE GetStudentsOver20()
BEGIN
SELECT * FROM tb_student WHERE age > 20;
END //
DELIMITER ;
-- 调用存储过程
CALL GetStudentsOver20();
-- 2.创建带输入参数的存储过程
DELIMITER //
CREATE PROCEDURE GetMaxScoreBySubject(IN subj VARCHAR(20))
BEGIN
SELECT MAX(score) AS max_score FROM tb_score WHERE subject = subj;
END //
DELIMITER ;
-- 调用带参存储过程
CALL GetMaxScoreBySubject('数学');
-- 3.创建带输出参数的存储过程
DELIMITER //
CREATE PROCEDURE GetStudentTotalScore(
IN stu_name VARCHAR(20),
OUT total INT
)
BEGIN
SELECT SUM(score) INTO total FROM tb_score WHERE student_name = stu_name;
END //
DELIMITER ;
-- 调用带输出参数的存储过程
SET @total = 0;
CALL GetStudentTotalScore('张三', @total);
SELECT @total AS total_score;
(2)控制语句
-- 条件判断(IF-ELSE)
DELIMITER //
CREATE PROCEDURE CheckScoreLevel(IN score INT)
BEGIN
IF score >= 90 THEN
SELECT '优秀' AS level;
ELSEIF score >= 60 THEN
SELECT '及格' AS level;
ELSE
SELECT '不及格' AS level;
END IF;
END //
DELIMITER ;
-- 循环(WHILE)
DELIMITER //
CREATE PROCEDURE BatchInsertStudents(IN count INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= count DO
INSERT INTO tb_student (username, age) VALUES (CONCAT('学生', i), 18 + i % 5);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
(3)存储过程管理
-- 查看所有存储过程
SHOW PROCEDURE STATUS;
-- 查看存储过程定义
SHOW CREATE PROCEDURE <存储过程名>;
-- 删除存储过程
DROP PROCEDURE IF EXISTS <存储过程名>;
十三、用户管理与权限
MySQL 通过用户和权限控制数据库访问安全。
1. 用户管理
-- 创建用户(指定登录主机,% 表示任意主机)
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
-- 查看用户(存储在 mysql.user 表)
USE mysql;
SELECT host, user, authentication_string FROM user;
-- 修改用户密码
SET PASSWORD FOR 'test'@'localhost' = PASSWORD('654321');
-- MySQL 8.0+:ALTER USER 'test'@'localhost' IDENTIFIED BY '654321';
-- 删除用户
DROP USER 'test'@'localhost';
2. 权限管理
-- 授予权限(ALL 表示所有权限,*.* 表示所有数据库所有表)
GRANT ALL ON *.* TO 'test'@'%';
-- 授予特定权限(查询、插入)
GRANT SELECT, INSERT ON db_itheima.* TO 'test'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'test'@'%';
-- 回收权限
REVOKE INSERT ON db_itheima.* FROM 'test'@'%';
总结
本文系统覆盖了 MySQL 从基础到进阶的核心知识点,包括:
- 基础层:数据库 / 表操作、数据类型、约束,是数据库设计的基石;
- 操作层:DML 数据增删改、DQL 查询技巧,是数据操纵的核心;
- 进阶层:多表关联、索引、事务、窗口函数、存储过程,是提升效率和安全性的关键;
- 扩展层:视图、用户权限,满足复杂场景需求。
掌握这些知识点可应对大部分 MySQL 开发与运维场景,实际应用中需结合业务场景灵活选型,注重数据一致性和查询效率优化。后续可进一步深入锁机制、性能调优、分库分表等高级主题。

被折叠的 条评论
为什么被折叠?



