mysqldump
)、物理备份(数据文件复制)及增量恢复方案。查看数据库
SHOW DATABASES; -- 查看当前数据库所有表
SHOW CREATE DATABASE db_name; -- 查看该数据库结构
创建数据库
CREATE DATABASE db_name; -- 默认字符集
CREATE DATABASE db_name CHARACTER SET utf8mb4; -- 指定字符集
选择数据库
USE db_name;
删除数据库
DROP DATABASE db_name;
查看表
SHOW TABLES; -- 查看当前数据库所有表
DESC table_name; -- 查看表结构
SHOW CREATE TABLE table_name; -- 查看建表语句
创建表
CREATE TABLE table_name (
id INT PRIMARY KEY AUTO_INCREMENT, --设置主键,字填充序号
name VARCHAR(50) NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP --自动填充插入时的时间
);
重命名表
RENAME TABLE old_table TO new_table;
-- 或
ALTER TABLE old_table RENAME TO new_table;
添加列
ALTER TABLE table_name ADD COLUMN new_column VARCHAR(100);
重命名列
ALTER TABLE table_name CHANGE COLUMN old_column new_column VARCHAR(50);
删除列
ALTER TABLE table_name DROP COLUMN column_name;
删除表
DROP TABLE table_name;
主键
-- 建表时指定
CREATE TABLE table_name (id INT PRIMARY KEY);
-- 修改表添加
ALTER TABLE table_name ADD PRIMARY KEY (column);
外键
-- 建表时指定
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 修改表添加
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
唯一约束
CREATE TABLE table_name (email VARCHAR(100) UNIQUE);
-- 或
ALTER TABLE table_name ADD UNIQUE (email);
非空约束
CREATE TABLE table_name (name VARCHAR(50) NOT NULL);
默认值
CREATE TABLE table_name (
status INT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
查看数据
SELECT * FROM table_name; -- 所有数据
SELECT column1, column2 FROM table_name; -- 指定列
直接插入数据
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
INSERT INTO table_name VALUES (value1, value2); -- 需按列顺序
从查询插入数据
INSERT INTO table_target (col1, col2)
SELECT colA, colB FROM table_source WHERE condition;
更新数据
UPDATE table_name SET column1 = value1 WHERE condition;
删除数据
DELETE FROM table_name WHERE condition; -- 删除符合条件的数据
TRUNCATE TABLE table_name; -- 清空表(不可恢复)
查询顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
简单查询
SELECT * FROM tb_name;
去重查询
SELECT DISTINCT col_name FROM tb_name;
条件查询
WHERE age = 25
WHERE status <> 'active'
WHERE salary > 5000
WHERE created_at < '2023-01-01'
WHERE score >= 60
WHERE quantity <= 100
排序查询
ORDER BY col_name DESC;
ORDER BY col_name ASC;
范围查询
WHERE column BETWEEN value1 AND value2; -- 包含边界值
WHERE column IN (value1, value2, ...); -- 匹配列表中的任意值
WHERE column NOT IN (value1, value2, ...); -- 排除列表中的值
空值判断
WHERE col_name IS NULL
WHERE col_name IS NOT NULL
逻辑查询
WHERE age > 18 AND country = 'CN'
WHERE status = 'paid' OR status = 'shipped'
WHERE NOT age > 30
模糊查询
WHERE name LIKE '张%'; -- 姓张的人
WHERE email LIKE '%@gmail.com'; -- Gmail 邮箱
WHERE title LIKE '%数据库%'; -- 标题包含“数据库”
限制查询
LIMIT 5; -- 前5 条
LIMIT 20, 10; -- 跳过前 20 条,查10条
LIMIT 10 OFFSET 20; -- 跳过前 20 条,查10条
分组聚合查询
SELECT 分组字段, 聚合函数(字段)
FROM 表名
WHERE 过滤条件
GROUP BY 分组字段
HAVING 分组后过滤条件
ORDER BY 排序字段;
以下是 MySQL 中 常用聚合函数 的总结表格,包含功能、语法示例及注意事项:
函数 | 功能描述 | 语法示例 | 是否忽略 NULL | 注意事项 |
---|---|---|---|---|
COUNT() |
统计行数或非空值的数量 | COUNT(*) COUNT(column) COUNT(DISTINCT column) |
是(除COUNT(*) 外) |
COUNT(*) 统计所有行;COUNT(column) 忽略该列 NULL;DISTINCT 去重统计。 |
SUM() |
计算数值列的总和 | SUM(column) SUM(DISTINCT column) |
是 | 仅适用于数值类型(整数、小数),非数值列返回 0 或错误。 |
AVG() |
计算数值列的平均值 | AVG(column) AVG(DISTINCT column) |
是 | 忽略 NULL 值,结果可能包含小数;若所有值为 NULL,返回 NULL。 |
MAX() |
获取列中的最大值 | MAX(column) |
是 | 适用于数值、日期、字符串类型;字符串按字典序比较。 |
MIN() |
获取列中的最小值 | MIN(column) |
是 | 同 MAX() ,支持多种数据类型比较。 |
GROUP_CONCAT() |
将分组内的值合并为字符串 | GROUP_CONCAT(column [SEPARATOR '分隔符']) GROUP_CONCAT(DISTINCT column) |
是 | 默认逗号分隔;可指定分隔符(如 `SEPARATOR ’ |
STDDEV() |
计算数值列的标准差 | STDDEV(column) |
是 | 返回浮点数;样本标准差用 STDDEV_SAMP() ,总体标准差用 STDDEV_POP() 。 |
VARIANCE() |
计算数值列的方差 | VARIANCE(column) |
是 | 同标准差函数,方差为标准差的平方。 |
-- 内连接
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- 左连接
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
连接类型 | 语法 | 描述 |
---|---|---|
内连接 (INNER JOIN) | SELECT ... FROM A INNER JOIN B ON 条件 |
返回两个表中 匹配的行(交集) |
左连接 (LEFT JOIN) | SELECT ... FROM A LEFT JOIN B ON 条件 |
返回左表所有行 + 右表匹配的行(右表无匹配则显示 NULL ) |
右连接 (RIGHT JOIN) | SELECT ... FROM A RIGHT JOIN B ON 条件 |
返回右表所有行 + 左表匹配的行(左表无匹配则显示 NULL ) |
全外连接 (FULL OUTER JOIN) | SELECT ... FROM A LEFT JOIN B ... UNION SELECT ... FROM A RIGHT JOIN B ... |
返回左右表所有行(并集),MySQL 需用 UNION 模拟 |
交叉连接 (CROSS JOIN) | SELECT ... FROM A CROSS JOIN B |
返回笛卡尔积(无连接条件) |
自连接 (Self Join) | SELECT ... FROM A AS t1 JOIN A AS t2 ON 条件 |
同一表内连接,常用于层级数据(如员工和经理) |
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
1. 用户创建与删除
操作 | 命令 |
---|---|
创建用户 | CREATE USER 'username'@'host' IDENTIFIED BY 'password'; |
删除用户 | DROP USER 'username'@'host'; |
修改用户密码 | ALTER USER 'username'@'host' IDENTIFIED BY 'new_password'; |
查看所有用户 | SELECT user, host FROM mysql.user; |
示例:
-- 创建允许本地登录的用户
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'DevPass123!';
-- 创建允许任意主机登录的用户
CREATE USER 'admin'@'%' IDENTIFIED BY 'AdminPass456!';
1. 授予与撤销权限
操作 | 命令 |
---|---|
授予权限 | GRANT 权限 ON 数据库.表 TO 'user'@'host'; |
撤销权限 | REVOKE 权限 ON 数据库.表 FROM 'user'@'host'; |
授予所有权限 | GRANT ALL PRIVILEGES ON 数据库.* TO 'user'@'host'; |
允许用户授权他人 | GRANT ... WITH GRANT OPTION; |
查看用户权限 | SHOW GRANTS FOR 'user'@'host'; |
刷新权限 | FLUSH PRIVILEGES; (修改权限表后执行) |
常用权限:
SELECT
, INSERT
, UPDATE
, DELETE
: 基础数据操作权限CREATE
, ALTER
, DROP
: 对象管理权限ALL PRIVILEGES
: 所有权限(慎用)示例:
-- 授予用户对 `mydb` 数据库的读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'dev'@'localhost';
-- 授予管理员所有权限(含授权能力)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
-- 撤销删除权限
REVOKE DELETE ON mydb.* FROM 'dev'@'localhost';
1. 逻辑备份(导出 SQL 文件)
场景 | 命令 |
---|---|
全库备份 | mysqldump -u 用户名 -p --all-databases > full_backup.sql |
单库备份 | mysqldump -u 用户名 -p 数据库名 > db_backup.sql |
单表备份 | mysqldump -u 用户名 -p 数据库名 表名 > table_backup.sql |
增量备份 | 依赖二进制日志(Binlog):mysqlbinlog binlog.000001 > incr.sql |
常用参数:
--single-transaction
: 保证 InnoDB 表备份一致性(事务隔离)。--routines
: 包含存储过程和函数。--events
: 包含事件调度器。--skip-lock-tables
: 不锁定表(需确保数据一致性)。示例:
# 备份 `mydb` 数据库(包含存储过程)
mysqldump -u root -p --routines --events mydb > mydb_backup.sql
2. 恢复数据
场景 | 命令 |
---|---|
恢复全库 | mysql -u 用户名 -p < full_backup.sql |
恢复单库 | mysql -u 用户名 -p 数据库名 < db_backup.sql |
恢复单表 | mysql -u 用户名 -p 数据库名 < table_backup.sql |
增量恢复 | 先恢复全量备份,再应用增量 Binlog: `mysqlbinlog binlog.000001 |
示例:
# 恢复 `mydb` 数据库
mysql -u root -p mydb < mydb_backup.sql
3. 物理备份(直接复制数据文件)
操作 | 说明 |
---|---|
停止 MySQL 服务 | systemctl stop mysql 或 service mysql stop |
复制数据目录 | cp -R /var/lib/mysql /backup/mysql_data |
使用 XtraBackup | 热备份工具(无需停服务):xtrabackup --backup --target-dir=/backup/ |