本手册围绕 MySQL 数据库基础操作展开,涵盖库、表、数据、用户权限的全流程操作,整合实操代码并补充核心知识点,内容简易易懂、逻辑清晰,适合 MySQL 入门学习与日常操作参考。
一、SQL 语言基础
SQL(结构化查询语言)是操作关系型数据库的标准语言,所有 MySQL 操作语句均在mysql>环境执行,以分号 (;) 结尾,核心分为四类:
表格
| 语言类型 | 英文缩写 | 核心作用 | 常用关键字 |
|---|---|---|---|
| 数据定义语言 | DDL | 定义数据库 / 表结构 | CREATE、ALTER、DROP |
| 数据操纵语言 | DML | 增删改表中数据 | INSERT、UPDATE、DELETE |
| 数据查询语言 | DQL | 查询表中数据 | SELECT |
| 数据控制语言 | DCL | 管理用户与权限 | GRANT、REVOKE、COMMIT |
补充知识点 :SQL 语句不区分大小写(关键字建议大写),注释可使用# 单行注释或/* 多行注释 */。
二、MySQL 库操作
MySQL 初始化后默认存在 4 个系统数据库,各自承担核心功能,库操作的核心是创建、选择、查看、删除,命名需遵循规范。
2.1 系统数据库说明
表格
| 系统库名 | 核心功能 | 补充说明 |
|---|---|---|
| information_schema | 存储数据库运行参数 | 虚拟库,不占用磁盘空间 |
| performance_schema | 收集数据库性能参数 | MySQL5.5 及以上版本新增 |
| mysql | 存储系统用户权限信息 | 核心授权库,不可随意修改 |
| sys | 存储性能监控数据 | 简化性能优化与故障排查 |
2.2 库操作核心代码
(1)创建数据库
mysql
# 基础语法
CREATE DATABASE 数据库名;
# 示例:创建名为db1的数据库
CREATE DATABASE db1;
补充知识点 :避免创建失败可加判断CREATE DATABASE IF NOT EXISTS db1;(数据库不存在时才创建)。
(2)数据库命名规则
- 不能使用 MySQL 关键字(如 create、select、where)
- 可由字母、数字、下划线、@、#、$ 组成,区分大小写
- 名称唯一,不能单独使用数字,最长 128 位
(3)选择数据库
mysql
# 基础语法:切换到指定数据库,后续操作基于该库
USE 数据库名;
# 示例:切换到db1
USE db1;
(4)查看数据库
mysql
# 查看当前MySQL中所有数据库
SHOW DATABASES;
# 查看指定数据库的创建语句(可验证字符集、存储引擎等)
SHOW CREATE DATABASE db1;
# 查看当前选中的数据库名称
SELECT DATABASE();
(5)删除数据库
mysql
# 基础语法
DROP DATABASE 数据库名;
# 示例:删除db1数据库
DROP DATABASE db1;
补充知识点 :安全删除加判断DROP DATABASE IF EXISTS db1;(数据库存在时才删除),删除后数据不可恢复,需谨慎操作。
三、MySQL 表操作
库相当于 "文件夹",表相当于 "文件夹中的文件",表由字段 (列标题)和记录 (行数据)组成,操作核心为创建、查看、修改、复制、删除。
3.1 表操作前置要求
操作表前必须先用USE 数据库名;切换到目标数据库,否则需指定数据库名.表名(如db1.t1)。
3.2 查看数据库中的表
mysql
# 先切换数据库
USE db1;
# 查看当前库中所有表
SHOW TABLES;
3.3 创建表
(1)基础语法
mysql
CREATE TABLE 表名(
字段名1 数据类型[(宽度) 约束条件],
字段名2 数据类型[(宽度) 约束条件],
字段名3 数据类型[(宽度) 约束条件]
);
注意 :表中最后一个字段后不能加逗号;字段名和数据类型为必选,宽度和约束条件为可选。
(2)核心基础:数据类型
MySQL 数据类型分三类,常用类型及用途如下,宽度为可选参数,不设置则使用默认宽度:
表格
| 类型分类 | 常用类型 | 宽度 / 范围 | 核心用途 |
|---|---|---|---|
| 数值类型 | int | 0-11 位 | 存储整数(如 ID、年龄) |
| double(m,n) | m 为总位数,n 为小数位 | 存储小数(如薪资、价格) | |
| 日期类型 | date | - | 存储日期(格式:YYYY-MM-DD,如入职时间) |
| datetime | - | 存储日期 + 时间(格式:YYYY-MM-DD HH:MM:SS) | |
| 字符串类型 | varchar(n) | 0-65535 字节 | 变长字符串,n 为字符数(如姓名、岗位) |
| text | - | 长文本数据(如文章、备注) | |
| enum (' 值 1',' 值 2') | - | 枚举类型,值只能从指定集合中选(如性别) |
(3)核心基础:约束条件
用于保证数据的完整性和一致性,常用约束如下:
表格
| 约束条件 | 缩写 | 核心说明 |
|---|---|---|
| PRIMARY KEY | PK | 主键,唯一标识记录,非空且唯一 |
| NOT NULL | - | 字段值不能为空 |
| UNIQUE KEY | UK | 字段值唯一,可空 |
| AUTO_INCREMENT | - | 字段值自动增长,仅适用于整数类型且为主键 |
| DEFAULT | - | 为字段设置默认值 |
| UNSIGNED | - | 无符号,仅适用于数值类型(如年龄不能为负) |
(4)创建表示例
mysql
# 先创建并切换到db1
CREATE DATABASE IF NOT EXISTS db1;
USE db1;
# 创建表t1,包含id、姓名、年龄、性别字段
CREATE TABLE t1(
id int,
name varchar(50),
age int(3) UNSIGNED, # 无符号,年龄不能为负
sex enum('male','female') # 性别只能选male/female
);
3.4 查看表结构
mysql
# 简易查看:显示字段名、类型、是否为空、默认值等
DESCRIBE 表名;
# 简写
DESC 表名;
# 示例:查看t1表结构
DESC t1;
# 详细查看:显示创建表的完整语句(含存储引擎、字符集)
SHOW CREATE TABLE 表名\G; # \G:长格式展示,避免排版混乱
# 示例:查看t1表详细结构
SHOW CREATE TABLE t1\G;
3.5 修改表
使用ALTER TABLE修改表,支持修改表名、增删字段、修改字段,核心代码如下:
mysql
USE db1;
# 1. 修改表名:将t1改为t2
ALTER TABLE t1 RENAME t2;
# 2. 增加字段
ALTER TABLE t2 ADD class int(3) NOT NULL; # 末尾增加字段
ALTER TABLE t2 ADD phone varchar(11) FIRST; # 第一个位置增加字段
ALTER TABLE t2 ADD email varchar(50) AFTER name; # 在name字段后增加字段
# 3. 删除字段:删除class字段
ALTER TABLE t2 DROP class;
# 4. 修改字段
ALTER TABLE t2 MODIFY name char(50); # 仅修改字段类型(name从varchar→char)
ALTER TABLE t2 CHANGE name user_name varchar(50); # 修改字段名+类型(name→user_name,类型不变)
ALTER TABLE t2 CHANGE age user_age int(2) UNSIGNED DEFAULT 18; # 全修改:名+类型+约束+默认值
补充知识点 :MODIFY仅能修改字段属性,CHANGE可同时修改字段名和属性,是更灵活的修改方式。
3.6 复制表
支持仅复制表结构 和复制表结构 + 数据两种方式,核心代码:
mysql
USE db1;
# 1. 仅复制表结构,不复制数据(推荐,保留原表约束)
CREATE TABLE t3 LIKE t2;
# 2. 复制表结构+数据(不复制主键、外键、索引等约束)
CREATE TABLE t4 SELECT * FROM t2;
3.7 删除表
mysql
# 基础语法
DROP TABLE 表名;
# 示例1:删除当前库中的t2表
DROP TABLE t2;
# 示例2:删除指定库中的t3表(无需切换库)
DROP TABLE db1.t3;
# 安全删除:表存在时才删除
DROP TABLE IF EXISTS db1.t4;
四、MySQL 数据操作
通过 DML 语言实现表中数据的增、删、改、查 ,其中查询 是最核心、最常用的操作,所有操作后可通过SELECT * FROM 表名;验证结果。
4.1 前置准备:创建示例表
mysql
# 创建测试库test
CREATE DATABASE IF NOT EXISTS test;
USE test;
# 创建人员信息表renyuan,用于后续数据操作示例
CREATE TABLE renyuan(
id int NOT NULL UNIQUE AUTO_INCREMENT, # 员工ID,自增、唯一、非空
name varchar(20) NOT NULL, # 姓名,非空
age int(3) UNSIGNED NOT NULL DEFAULT 28, # 年龄,无符号、非空、默认28
sex enum('male','female') NOT NULL DEFAULT 'male', # 性别,默认男
hire_date date NOT NULL, # 入职日期
post varchar(50), # 岗位
salary double(15,2), # 薪资,总15位,小数2位
office int, # 办公室
depart_id int # 部门编号
);
# 插入测试数据
INSERT INTO renyuan(name,sex,age,hire_date,post,salary,office,depart_id)
VALUES
('zhangsan','male',18,'20170301','teacher',7300.33,401,1),
('lisi','male',78,'20150302','teacher',1000000.31,401,1),
('wangwu','male',81,'20130305','teacher',8300,401,1),
('歪歪','female',48,'20150311','sale',3000.13,402,2),
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('张野','male',28,'20160311','operation',10000.13,403,3),
('程咬金','male',18,'19970312','operation',20000,403,3);
4.2 插入数据(INSERT)
支持顺序插入、指定字段插入、批量插入 ,推荐指定字段插入(避免字段顺序变化导致插入失败)。
mysql
USE test;
# 1. 顺序插入:值的顺序必须与表字段顺序一致
INSERT INTO renyuan VALUES(8,'成龙','male',48,'20101111','teacher',10000,401,1);
# 2. 指定字段插入:推荐,值与指定字段一一对应
INSERT INTO renyuan(id,name,sex,hire_date,post) VALUES(9,'zhuba','female','20110211','teacher');
# 3. 批量插入:高效,一次插入多条记录
INSERT INTO renyuan(name,sex,age,hire_date,post,salary,office,depart_id)
VALUES
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2);
4.3 删除数据(DELETE)
必须加 WHERE 条件,否则会删除表中所有数据,数据删除后不可恢复,需谨慎。
mysql
USE test;
# 基础语法:删除符合条件的记录
DELETE FROM 表名 WHERE 条件表达式;
# 示例:删除id=1的员工记录
DELETE FROM renyuan WHERE id=1;
# 示例:删除岗位为sale且薪资低于3000的记录
DELETE FROM renyuan WHERE post='sale' AND salary < 3000;
补充知识点 :清空整表可使用TRUNCATE TABLE 表名;(比 DELETE 更高效,直接删除表再重建,不记录日志),但同样不可恢复。
4.4 更新数据(UPDATE)
必须加 WHERE 条件,否则会更新表中所有记录,核心代码:
mysql
USE test;
# 基础语法:更新符合条件的字段值,多个字段用逗号分隔
UPDATE 表名 SET 字段1=值1,字段2=值2 WHERE 条件表达式;
# 示例:将wangwu的年龄改为80,薪资改为8500
UPDATE renyuan SET age=80,salary=8500 WHERE name='wangwu';
# 示例:将所有operation岗位的薪资涨1000
UPDATE renyuan SET salary=salary+1000 WHERE post='operation';
4.5 查询数据(SELECT)
DQL 核心操作,支持单表查询、多表查询 ,单表查询语法及关键字优先级为:SELECT 字段 FROM 表名 WHERE 条件 GROUP BY 分组字段 HAVING 分组筛选 ORDER BY 排序字段 LIMIT 限制条数关键字优先级:from > where > group by > having > select > order by > limit
(1)简单查询
mysql
USE test;
# 1. 查询指定字段
SELECT name,age,post FROM renyuan;
# 2. 查询所有字段(通配符*,测试用,生产环境不推荐,效率低)
SELECT * FROM renyuan;
# 3. 别名查询:给字段/表起别名,用AS(可省略),避免字段名重复
SELECT name AS 姓名,age AS 年龄,salary 薪资 FROM renyuan;
(2)条件查询(WHERE)
通过条件过滤数据,支持比较运算符、范围、集合、模糊匹配、逻辑运算符,核心代码:
mysql
USE test;
# 1. 比较运算符:> < >= <= != <>(不等于)
SELECT name,salary FROM renyuan WHERE salary > 10000; # 薪资大于10000
SELECT name,office FROM renyuan WHERE office != 403; # 办公室不是403
# 2. 范围查询:BETWEEN 最小值 AND 最大值
SELECT name,salary FROM renyuan WHERE salary BETWEEN 5000 AND 10000; # 薪资5000-10000
# 3. 集合查询:IN(值1,值2,...),值在集合中
SELECT name,salary FROM renyuan WHERE salary IN(8300,10000,20000); # 薪资为指定值
# 4. 模糊查询:LIKE,%匹配任意多字符,_匹配1个字符
SELECT * FROM renyuan WHERE name LIKE '程%'; # 姓名以"程"开头
SELECT * FROM renyuan WHERE name LIKE '张_'; # 姓名以"张"开头,共2个字
# 5. 逻辑运算符:AND(且)、OR(或)、NOT(非)
SELECT * FROM renyuan WHERE office=403 AND salary>15000; # 办公室403且薪资>15000
SELECT * FROM renyuan WHERE post='teacher' OR post='sale'; # 岗位为老师或销售
SELECT * FROM renyuan WHERE salary NOT IN(7300,8300); # 薪资不是7300/8300
(3)分组查询(GROUP BY)
按指定字段将数据归类 ,通常与聚合函数 配合使用,解决 "每个 / 每组" 的统计需求(如每个部门的平均薪资)。常用聚合函数:count (*)(计数)、avg (字段)(平均值)、max (字段)(最大值)、min (字段)(最小值)、sum (字段)(求和)。
mysql
USE test;
# 示例1:按性别分组,统计男/女人数
SELECT sex,COUNT(*) AS 人数 FROM renyuan GROUP BY sex;
# 示例2:按岗位分组,统计每个岗位的平均薪资、最高薪资、最低薪资
SELECT post,AVG(salary) 平均薪资,MAX(salary) 最高薪资,MIN(salary) 最低薪资 FROM renyuan GROUP BY post;
# 示例3:按部门分组,统计每个部门的总人数和薪资总和
SELECT depart_id 部门编号,COUNT(*) 总人数,SUM(salary) 薪资总和 FROM renyuan GROUP BY depart_id;
(4)分组筛选(HAVING)
在分组后 对结果进行筛选,可使用聚合函数;与 WHERE 的区别:WHERE 在分组前筛选,不能使用聚合函数。
mysql
USE test;
# 示例:查询平均薪资大于10000的岗位及平均薪资
SELECT post,AVG(salary) 平均薪资 FROM renyuan GROUP BY post HAVING AVG(salary) > 10000;
# 示例:查询部门人数大于2的部门编号及人数
SELECT depart_id 部门编号,COUNT(*) 人数 FROM renyuan GROUP BY depart_id HAVING COUNT(*) > 2;
(5)排序查询(ORDER BY)
对查询结果按指定字段排序,ASC(升序,默认)、DESC(降序),可按多个字段排序。
mysql
USE test;
# 示例1:按薪资升序排序(默认ASC)
SELECT name,salary FROM renyuan ORDER BY salary;
# 示例2:按薪资降序排序,薪资相同按年龄升序
SELECT name,salary,age FROM renyuan ORDER BY salary DESC,age ASC;
# 示例3:按部门编号降序,同一部门按入职日期升序
SELECT name,depart_id,hire_date FROM renyuan ORDER BY depart_id DESC,hire_date ASC;
(6)限制结果条数(LIMIT)
限制查询结果的显示行数,用于分页查询 或取前 N 条数据 ,语法:LIMIT 起始行, 显示条数(起始行从 0 开始,可省略,默认 0)。
mysql
USE test;
# 示例1:取前3条数据(起始行0省略)
SELECT * FROM renyuan LIMIT 3;
# 示例2:从第2行开始,取3条数据(起始行0为第一行)
SELECT * FROM renyuan LIMIT 1,3;
# 示例3:取薪资最高的前5名员工
SELECT name,salary FROM renyuan ORDER BY salary DESC LIMIT 5;
(7)正则匹配查询(REGEXP)
按正则表达式匹配数据,比 LIKE 更灵活,核心关键字REGEXP。
mysql
USE test;
# 示例1:查询姓名以l开头的员工
SELECT * FROM renyuan WHERE name REGEXP "^l";
# 示例2:查询姓名以u结尾的员工
SELECT * FROM renyuan WHERE name REGEXP "u$";
# 示例3:查询姓名包含"程"的员工
SELECT * FROM renyuan WHERE name REGEXP "程";
(8)多表查询
用于从多个关联表中提取数据,核心方式为子查询 和连接查询,先准备多表测试数据:
mysql
# 创建测试库test2
CREATE DATABASE IF NOT EXISTS test2;
USE test2;
# 创建部门表bumen
CREATE TABLE bumen(
id int,
name varchar(20)
);
# 创建人员表renyuan
CREATE TABLE renyuan(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20),
sex enum('male','female') NOT NULL DEFAULT 'male',
age int,
dep_id int # 与部门表id关联
);
# 插入测试数据
INSERT INTO bumen VALUES(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营');
INSERT INTO renyuan(name,sex,age,dep_id) VALUES
('zhangsan','male',18,200),('lisi','female',48,201),
('wangwu','male',38,201),('zhaoliu','female',28,202),
('sunqi','male',18,200),('zhuba','female',18,204);
① 子查询
嵌套在主查询中的查询,先执行子查询 ,结果作为主查询的条件,常用IN配合使用。
mysql
USE test2;
# 示例1:查询技术部的员工姓名
SELECT name FROM renyuan WHERE dep_id IN (SELECT id FROM bumen WHERE name='技术');
# 示例2:查询平均年龄大于25岁的部门名称
SELECT name FROM bumen WHERE id IN (SELECT dep_id FROM renyuan GROUP BY dep_id HAVING AVG(age) > 25);
# 示例3:查询没有员工的部门名称
SELECT name FROM bumen WHERE id NOT IN (SELECT DISTINCT dep_id FROM renyuan);
② 连接查询
基于表之间的关联字段 拼接数据,核心分为内连接、左连接、右连接。
mysql
USE test2;
# 1. 内连接(INNER JOIN):只显示两表中匹配的记录
SELECT r.id,r.name,r.age,b.name AS 部门名称
FROM renyuan r INNER JOIN bumen b
ON r.dep_id = b.id; # 关联条件:人员表dep_id=部门表id
# 2. 左连接(LEFT JOIN):优先显示左表(renyuan)所有记录,右表无匹配则为NULL
SELECT r.id,r.name,b.name AS 部门名称
FROM renyuan r LEFT JOIN bumen b
ON r.dep_id = b.id;
# 3. 右连接(RIGHT JOIN):优先显示右表(bumen)所有记录,左表无匹配则为NULL
SELECT r.id,r.name,b.name AS 部门名称
FROM renyuan r RIGHT JOIN bumen b
ON r.dep_id = b.id;
补充知识点 :连接查询中可给表起别名(如renyuan r),简化代码;关联条件必须用ON指定,不能用 WHERE。
五、MySQL 用户权限操作
MySQL 的 root 用户为超级管理员,拥有所有权限,生产环境中需创建低权限用户 ,按需求分配权限,降低安全风险。MySQL8.0 + 要求先创建用户,再授权,二者分离。
5.1 创建用户
mysql
# 基础语法
CREATE USER 用户名@来源地址 IDENTIFIED BY '密码';
# 说明:
# 来源地址:指定用户可从哪里访问,可为IP、域名,%为通配符(任意地址)
# 密码:需加单/双引号,建议包含字母、数字、特殊字符,提高安全性
# 示例1:创建用户xiaoqi,仅允许从本机(localhost)访问,密码123456
CREATE USER 'xiaoqi'@'localhost' IDENTIFIED BY '123456';
# 示例2:创建用户dbuser,允许从IP192.168.4.19访问,密码pwd@123
CREATE USER 'dbuser'@'192.168.4.19' IDENTIFIED BY 'pwd@123';
# 示例3:创建用户webuser,允许从任意地址访问,密码Web@123456
CREATE USER 'webuser'@'%' IDENTIFIED BY 'Web@123456';
补充知识点 :删除用户使用DROP USER 用户名@来源地址;(如DROP USER 'xiaoqi'@'localhost';)。
5.2 授权操作
mysql
# 基础语法
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址;
# 说明:
# 权限列表:多个权限用逗号分隔,all表示所有权限;常用权限:select、insert、update、delete
# 数据库名.表名:*.*表示所有库所有表,db1.*表示db1库所有表,db1.t1表示db1库t1表
# 示例1:给xiaoqi分配test库所有表的查询权限(仅本机)
GRANT SELECT ON test.* TO 'xiaoqi'@'localhost';
# 示例2:给dbuser分配bdqn库所有表的所有权限(仅192.168.4.19)
CREATE DATABASE IF NOT EXISTS bdqn; # 先创建库
GRANT ALL ON bdqn.* TO 'dbuser'@'192.168.4.19';
# 示例3:给webuser分配所有库所有表的查询、插入权限(任意地址)
GRANT SELECT,INSERT ON *.* TO 'webuser'@'%';
补充知识点 :授权后需刷新权限FLUSH PRIVILEGES;(MySQL8.0 + 部分场景可自动刷新,建议手动执行)。
5.3 查看用户权限
mysql
# 基础语法
SHOW GRANTS FOR 用户名@来源地址;
# 示例1:查看xiaoqi的权限
SHOW GRANTS FOR 'xiaoqi'@'localhost';
# 示例2:查看dbuser的权限
SHOW GRANTS FOR 'dbuser'@'192.168.4.19';
5.4 撤销用户权限
mysql
# 基础语法
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址;
# 示例1:撤销xiaoqi的test库所有表的查询权限
REVOKE SELECT ON test.* FROM 'xiaoqi'@'localhost';
# 示例2:撤销webuser的所有库所有表的插入权限
REVOKE INSERT ON *.* FROM 'webuser'@'%';
# 示例3:撤销dbuser的bdqn库所有表的所有权限
REVOKE ALL ON bdqn.* FROM 'dbuser'@'192.168.4.19';
补充知识点 :撤销权限后同样需要执行FLUSH PRIVILEGES;刷新权限;撤销后用户仍可连接 MySQL,只是无对应操作权限。
六、核心操作总结
- 库操作:创(CREATE)→ 选(USE)→ 查(SHOW)→ 删(DROP),注意判断不存在 / 存在,避免报错。
- 表操作 :先选库,再操作,创表核心是数据类型 + 约束条件,修改表用 ALTER,复制表分 "仅结构" 和 "结构 + 数据"。
- 数据操作 :增(INSERT)、删(DELETE)、改(UPDATE)必加 WHERE,查(SELECT)是核心,灵活运用条件、分组、排序、限制。
- 权限操作:MySQL8.0 + 先创用户再授权,按 "最小权限原则" 分配,来源地址严格限制,避免 % 通配符(生产环境)。
- 通用规范:语句以;结尾,关键字大写,注释清晰,删除 / 更新操作谨慎,提前备份数据。