MySQL语句,内置函数,事务,视图,窗口函数与存储过程

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)整数类型(精确值)
类型字节数范围(无符号)应用场景
TINYINT10~255年龄、状态(0/1)
SMALLINT20~65535小范围计数(如订单状态)
MEDIUMINT30~16777215中等规模 ID(如用户 ID)
INT40~4294967295常用 ID、数量
BIGINT80~18446744073709551615大数据量计数(如日志 ID)
BIT(m)1~81~64 位二进制数据(如权限标识)
BOOL10(假)、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. 字符串与二进制类型

用于存储文本、二进制数据,核心类型包括 CHARVARCHARTEXT 和 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. 日期时间类型

用于存储时间相关数据,常用类型如下:

类型格式范围特点
DATEYYYY-MM-DD1000-01-01 ~ 9999-12-31仅日期
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59日期 + 时间,范围大
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 ~ 2038-01-19 03:14:07自动更新为当前时间(未指定时)
TIMEHH:MM:SS-838:59:59 ~ 838:59:59可表示时间间隔(如运行时长)
YEARYYYY1901 ~ 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_IDDB_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 从基础到进阶的核心知识点,包括:

  1. 基础层:数据库 / 表操作、数据类型、约束,是数据库设计的基石;
  2. 操作层:DML 数据增删改、DQL 查询技巧,是数据操纵的核心;
  3. 进阶层:多表关联、索引、事务、窗口函数、存储过程,是提升效率和安全性的关键;
  4. 扩展层:视图、用户权限,满足复杂场景需求。

掌握这些知识点可应对大部分 MySQL 开发与运维场景,实际应用中需结合业务场景灵活选型,注重数据一致性和查询效率优化。后续可进一步深入锁机制、性能调优、分库分表等高级主题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值