人人都会AI编程

附录 A MySQL 常用命令与函数速查表

更新时间:2026-07-11

本附录汇总了 MySQL 日常开发与运维中最常用的命令和函数,可作为快速查阅的手边参考。所有示例默认基于 MySQL 8.0,大部分命令兼容 5.7,差异之处会特别说明。


A.1 常用命令速查

1. 连接与管理

| 命令 | 说明 |
|------|------|
| mysql -u root -p | 以 root 用户身份连接本地 MySQL,提示输入密码 |
| mysql -h 192.168.1.100 -P 3306 -u user -p db_name | 远程连接指定主机、端口、用户和数据库 |
| exit\q | 退出客户端 |
| status\s | 查看服务器版本、连接信息、字符集等状态 |
| SELECT VERSION(); | 查看 MySQL 版本号 |
| SHOW DATABASES; | 列出所有数据库 |
| USE db_name; | 切换到指定数据库 |
| SELECT DATABASE(); | 查看当前使用的数据库 |
| SHOW TABLES; | 查看当前库所有的表 |
| SHOW CREATE TABLE table_name; | 查看表的完整建表语句 |
| DESC table_name; | 查看表结构(字段、类型、键等) |
| SHOW INDEX FROM table_name; | 查看表的索引信息 |

2. 用户与权限管理

| 命令 | 说明 |
|------|------|
| CREATE USER 'username'@'host' IDENTIFIED BY 'password'; | 创建用户,允许从指定主机连接,% 表示任意主机 |
| ALTER USER 'username'@'host' IDENTIFIED BY 'new_password'; | 修改用户密码 |
| GRANT ALL PRIVILEGES ON db.* TO 'user'@'host'; | 授予指定数据库全部权限 |
| GRANT SELECT, INSERT ON db.table TO 'user'@'host'; | 授予特定表的查询和插入权限 |
| REVOKE INSERT ON db.* FROM 'user'@'host'; | 回收权限 |
| SHOW GRANTS FOR 'user'@'host'; | 查看用户拥有的权限 |
| FLUSH PRIVILEGES; | 刷新权限,使修改立即生效 |
| DROP USER 'user'@'host'; | 删除用户 |

3. DDL(数据定义语言)

| 命令 | 说明 |
|------|------|
| CREATE DATABASE db_name; | 创建数据库,默认使用服务器字符集 |
| CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; | 指定字符集创建数据库(推荐 utf8mb4) |
| DROP DATABASE db_name; | 删除数据库(危险操作) |
| CREATE TABLE t (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)); | 创建表,设置主键自增 |
| CREATE TABLE t LIKE t2; | 复制表结构,不复制数据 |
| CREATE TABLE t AS SELECT * FROM t2; | 复制表结构和数据(可能丢失索引等) |
| ALTER TABLE t ADD COLUMN age INT DEFAULT 0; | 增加列 |
| ALTER TABLE t MODIFY COLUMN name VARCHAR(100); | 修改列定义 |
| ALTER TABLE t CHANGE old_name new_name VARCHAR(100); | 重命名列并修改定义 |
| ALTER TABLE t DROP COLUMN age; | 删除列 |
| ALTER TABLE t ADD INDEX idx_name (name); | 添加普通索引 |
| ALTER TABLE t ADD UNIQUE idx_name (name); | 添加唯一索引 |
| ALTER TABLE t DROP INDEX idx_name; | 删除索引 |
| CREATE INDEX idx_multi ON t (col1, col2); | 创建联合索引 |
| DROP TABLE t; | 删除表 |
| TRUNCATE TABLE t; | 清空表数据,保留结构,无法回滚 |

4. DML(数据操作语言)

| 命令 | 说明 |
|------|------|
| INSERT INTO t (col1, col2) VALUES ('val1', 'val2'); | 单行插入 |
| INSERT INTO t (col1, col2) VALUES ('a','b'), ('c','d'); | 批量插入多行 |
| INSERT INTO t (col1, col2) SELECT colA, colB FROM t2; | 将查询结果插入表 |
| UPDATE t SET col1 = 'new' WHERE id = 1; | 更新数据,务必带上 WHERE 条件 |
| UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.col = t2.col; | 多表联合更新 |
| DELETE FROM t WHERE id = 10; | 删除数据,务必带上 WHERE |
| DELETE t1 FROM t1 JOIN t2 ON t1.id = t2.id WHERE …; | 多表删除 |

5. DQL(数据查询语言)常用子句

| 子句 / 语法 | 示例与说明 |
|-------------|------------|
| SELECT col1, col2 FROM t WHERE condition; | 基本查询 |
| SELECT DISTINCT col FROM t; | 去重查询 |
| SELECT * FROM t ORDER BY col1 ASC, col2 DESC; | 排序,默认升序 |
| SELECT * FROM t LIMIT 10 OFFSET 20; | 分页,跳过20行取10行(也可写为 LIMIT 20,10) |
| SELECT * FROM t WHERE col BETWEEN 10 AND 20; | 范围查询 |
| SELECT * FROM t WHERE col IN (1,2,3); | 集合查询 |
| SELECT * FROM t WHERE col LIKE 'abc%'; | 模糊匹配,% 任意多字符,_ 单个字符 |
| SELECT * FROM t WHERE col IS NULL; | 判断NULL值(不能用 = NULL) |
| SELECT t1.col FROM t1 INNER JOIN t2 ON t1.id = t2.id; | 内连接(交集) |
| SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id; | 左外连接,保留左表所有行 |
| SELECT * FROM t1 CROSS JOIN t2; | 交叉连接(笛卡尔积) |
| SELECT col FROM t1 UNION [ALL] SELECT col FROM t2; | 合并结果集,ALL 保留重复行 |
| SELECT * FROM t WHERE col = (SELECT max(col) FROM t); | 标量子查询 |
| SELECT * FROM t WHERE col IN (SELECT col FROM t2); | 行子查询 |
| SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id = t.id); | 关联子查询 |
| SELECT * FROM t WHERE col > ANY (SELECT col FROM t2); | 与子查询结果任意值比较 |
| 窗口函数关键词 | |
| ROW_NUMBER() OVER (PARTITION BY col ORDER BY col2) | 分组排序赋予唯一行号 |
| RANK() OVER (PARTITION BY col ORDER BY col2) | 分组排序,同值同号,后续跳跃 |
| SUM(amount) OVER (PARTITION BY col ORDER BY col2 ROWS BETWEEN ...) | 窗口聚合 |

6. 事务控制

| 命令 | 说明 |
|------|------|
| START TRANSACTION;BEGIN; | 开启事务 |
| COMMIT; | 提交事务,持久化所有操作 |
| ROLLBACK; | 回滚事务,撤销所有未提交的修改 |
| SAVEPOINT sp1; | 设置保存点 |
| ROLLBACK TO SAVEPOINT sp1; | 回滚到指定保存点 |
| RELEASE SAVEPOINT sp1; | 删除保存点 |
| SET AUTOCOMMIT = 0; | 关闭自动提交,之后语句需手动 COMMIT/ROLLBACK |
| SET TRANSACTION ISOLATION LEVEL READ COMMITTED; | 设置事务隔离级别 |

7. 备份与恢复

| 命令 | 说明 |
|------|------|
| mysqldump -u root -p db_name > backup.sql | 导出整个数据库(逻辑备份) |
| mysqldump -u root -p db_name t > table.sql | 导出单张表 |
| mysqldump -u root -p --all-databases > all.sql | 导出所有数据库 |
| mysqldump -u root -p db_name --single-transaction > backup.sql | 使用快照方式导出,不锁表(InnoDB) |
| mysql -u root -p db_name < backup.sql | 恢复数据库 |
| source /path/to/backup.sql; | 在客户端内执行 SQL 文件恢复 |
| mysqlbinlog binlog.000001 > statements.sql | 将二进制日志解码为 SQL |

8. 执行计划与性能分析

| 命令 | 说明 |
|------|------|
| EXPLAIN SELECT ...; | 查看查询的执行计划 |
| EXPLAIN FORMAT=JSON SELECT ...; | 输出详细执行计划 |
| EXPLAIN ANALYZE SELECT ...; | 实际执行并返回计划与实际耗时(8.0.18+) |
| SHOW PROCESSLIST; | 查看当前所有连接及其执行的 SQL |
| KILL connection_id; | 杀掉指定连接 |
| SHOW STATUS LIKE 'Threads_connected'; | 查看当前连接数 |
| SHOW VARIABLES LIKE '%buffer_pool%'; | 查看系统变量配置 |
| SET GLOBAL slow_query_log = ON; | 开启慢查询日志 |
| SHOW ENGINE INNODB STATUS\G | 查看 InnoDB 运行状态(含锁、死锁信息) |


A.2 常用函数速查

以下函数用法中的 str 表示字符串,n 表示数值,date 表示日期时间值,col 表示列名。

1. 字符串函数

| 函数 | 说明与示例 |
|------|------------|
| CONCAT(str1, str2, ...) | 字符串拼接,如 CONCAT('Hello',' World')'Hello World' |
| CONCAT_WS(sep, str1, str2, ...) | 带分隔符拼接,如 CONCAT_WS(',','a','b','c')'a,b,c' |
| SUBSTRING(str, pos, len) / SUBSTR() | 截取子串,位置从1开始,SUBSTRING('hello',2,3)'ell' |
| LEFT(str, len)RIGHT(str, len) | 从左/右截取指定长度子串 |
| LENGTH(str) | 字符串字节长度,中文字符在UTF8下一个字符占3字节 |
| CHAR_LENGTH(str) | 字符长度的个数,中文一个字符算1,建议用它来判断字符长度 |
| UPPER(str) / UCASE(str) | 转大写 |
| LOWER(str) / LCASE(str) | 转小写 |
| TRIM(str) / LTRIM(str) / RTRIM(str) | 去除两侧/左侧/右侧空格 |
| REPLACE(str, from_str, to_str) | 替换字符串,REPLACE('abc','b','x')'axc' |
| INSTR(str, substr) | 返回子串第一次出现的位置,找不到返回0,INSTR('hello','l') → 3 |
| LOCATE(substr, str) | 等同于 INSTR,但参数顺序不同 |
| LPAD(str, len, padstr) / RPAD() | 左/右填充至指定长度,LPAD('ab',5,'x')'xxxab' |
| FORMAT(n, d) | 数字千分位格式化,保留d位小数,返回字符串 |

2. 数值函数

| 函数 | 说明 |
|------|------|
| ROUND(n, d) | 四舍五入,保留d位小数;d省略则取整 |
| CEIL(n) / CEILING(n) | 向上取整 |
| FLOOR(n) | 向下取整 |
| ABS(n) | 绝对值 |
| RAND() | 生成0-1之间的随机浮点数 |
| MOD(m, n)m % n | 取余数 |
| POW(m, n) | m的n次方 |
| SQRT(n) | 平方根 |
| TRUNCATE(n, d) | 截断到d位小数,不做四舍五入 |

3. 日期时间函数

| 函数 | 说明与示例 |
|------|------------|
| NOW() | 当前日期和时间(YYYY-MM-DD HH:MM:SS) |
| CURDATE() | 当前日期(YYYY-MM-DD) |
| CURTIME() | 当前时间(HH:MM:SS) |
| DATE_FORMAT(date, format) | 日期格式化,DATE_FORMAT(NOW(),'%Y-%m-%d')2025-01-15 |
| STR_TO_DATE(str, format) | 字符串转日期,STR_TO_DATE('2025-01-15','%Y-%m-%d') |
| DATE_ADD(date, INTERVAL expr unit) | 日期加减,如 DATE_ADD('2025-01-15', INTERVAL 1 MONTH) |
| DATE_SUB(date, INTERVAL expr unit) | 日期减 |
| DATEDIFF(date1, date2) | 两个日期的天数差,DATEDIFF('2025-01-20','2025-01-15') → 5 |
| TIMESTAMPDIFF(unit, start, end) | 按指定单位返回差值,如 TIMESTAMPDIFF(DAY, date1, date2) |
| YEAR(date) / MONTH(date) / DAY(date) | 提取年、月、日 |
| HOUR(time) / MINUTE(time) / SECOND(time) | 提取时、分、秒 |
| UNIX_TIMESTAMP(date) | 指定时间转为 Unix 时间戳 |
| FROM_UNIXTIME(unixtime [, format]) | Unix 时间戳转为日期时间 |

4. 条件判断与空值处理函数

| 函数 | 说明 |
|------|------|
| IF(expr, val1, val2) | 条件判断,如 IF(score>=60, 'pass', 'fail') |
| IFNULL(expr, val) | 若expr为NULL返回val,否则返回expr |
| COALESCE(val1, val2, ...) | 返回第一个非NULL值,常用于多字段备选 |
| NULLIF(expr1, expr2) | 若两值相等返回NULL,否则返回expr1 |
| CASE WHEN condition THEN result [WHEN ...] [ELSE default] END | 多条件判断,功能强大,可嵌套在SELECT/ORDER BY中 |

5. 聚合函数

| 函数 | 说明 |
|------|------|
| COUNT(col) | 统计非NULL的行数;COUNT(*)统计总行数(含NULL) |
| SUM(col) | 求和 |
| AVG(col) | 求平均值 |
| MAX(col) / MIN(col) | 最大值 / 最小值 |
| GROUP_CONCAT(col [SEPARATOR ',']) | 将分组中的列值拼接为一个字符串 |

6. 常用窗口函数速查

窗口函数基本语法:函数名() OVER ([PARTITION BY 分组列] [ORDER BY 排序列] [窗口子句])

| 函数 | 作用 |
|------|------|
| ROW_NUMBER() | 分组内行号,从1递增,相同值序号不同 |
| RANK() | 分组内排名,相同值占相同排名,排名会跳跃(如1,1,3) |
| DENSE_RANK() | 分组内排名,相同值占相同排名,排名连续(如1,1,2) |
| NTILE(n) | 将分组内数据均匀分成n个桶,返回桶编号 |
| LEAD(col, n [, default]) | 获取本行之后第n行的值,常用于环比分析 |
| LAG(col, n [, default]) | 获取本行之前第n行的值 |
| FIRST_VALUE(col) | 分组窗口内第一行的值 |
| LAST_VALUE(col) | 分组窗口内最后一行的值 |
| SUM(col) OVER(...) | 窗口内累计求和(常用 ROWS BETWEEN ... 指定窗口范围) |
| AVG(col) OVER(...) | 窗口内移动平均等 |

典型窗口子句(用于聚合窗口函数):

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW — 从第一行到当前行(累计)
  • ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING — 当前行及前后各1行(移动平均)

A.3 实用辅助命令

| 命令 | 说明 |
|------|------|
| SELECT SLEEP(5); | 让当前会话暂停5秒 |
| SELECT SQL_NO_CACHE ...; | 禁止查询缓存(8.0 无效,缓存已移除) |
| SELECT HIGH_PRIORITY ...; | 提高语句优先级(MyISAM) |
| LOCK TABLES t READ; / UNLOCK TABLES; | 表级别的显式读锁 |
| FLUSH TABLES; | 关闭所有打开的表 |
| RESET QUERY CACHE; | 清除查询缓存(5.7) |
| OPTIMIZE TABLE t; | 重建表,回收碎片(InnoDB 本质是重建) |

掌握以上命令和函数足以应对 90% 的日常开发与运维场景,建议收藏本页,随时翻阅。