MySQL 数据库核心操作手册

本手册围绕 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,只是无对应操作权限。

六、核心操作总结

  1. 库操作:创(CREATE)→ 选(USE)→ 查(SHOW)→ 删(DROP),注意判断不存在 / 存在,避免报错。
  2. 表操作 :先选库,再操作,创表核心是数据类型 + 约束条件,修改表用 ALTER,复制表分 "仅结构" 和 "结构 + 数据"。
  3. 数据操作 :增(INSERT)、删(DELETE)、改(UPDATE)必加 WHERE,查(SELECT)是核心,灵活运用条件、分组、排序、限制。
  4. 权限操作:MySQL8.0 + 先创用户再授权,按 "最小权限原则" 分配,来源地址严格限制,避免 % 通配符(生产环境)。
  5. 通用规范:语句以;结尾,关键字大写,注释清晰,删除 / 更新操作谨慎,提前备份数据。
相关推荐
ShineWinsu2 小时前
sqlite
jvm·数据库·oracle
慵懒的猫mi2 小时前
deepin UOS AI 助手接入钉钉(DingTalk)配置指南
linux·数据库·人工智能·ai·钉钉·deepin
海山数据库2 小时前
移动云大云海山数据库分页查询性能优化时间:从16s到2ms
数据库·oracle·性能优化·he3db·大云海山数据库
Maverick062 小时前
Oracle PDB 创建
运维·数据库·oracle
爱折腾的小码农2 小时前
neo4j数据库桌面管理工具
数据库·neo4j
常利兵2 小时前
Room 3.0大变身:安卓开发的新挑战与机遇
android·jvm·oracle
总要冲动一次2 小时前
MySQL 5.7 全量 + 增量备份方案(本地执行 + 远程存储)
数据库·mysql·adb
猿小喵2 小时前
MySQL数据库源码调试
数据库·mysql