MySQL 常用命令与函数全能速查表 (MySQL CheatSheet)
一份专为开发者整理的 MySQL 全能速查手册,浓缩日常高频的管理命令、核心内置函数、索引调优、事务锁排查及 EXPLAIN 执行计划分析。
发布于
本速查表涵盖 MySQL 开发与日常运维中最常用的核心命令、常用函数、索引设计及事务性能诊断,适合常驻收藏与案头检索。
一、 数据库与表基础操作
1. 数据库管理
SHOW DATABASES; -- 查看所有数据库
CREATE DATABASE db_name CHARACTER SET utf8mb4; -- 创建数据库并指定 utf8mb4
USE db_name; -- 切换当前数据库
SELECT DATABASE(); -- 查看当前所在数据库
DROP DATABASE IF EXISTS db_name; -- 删除数据库
2. 数据表管理
SHOW TABLES; -- 查看当前库所有表
DESCRIBE table_name; -- 查看表结构 (简写: DESC table_name;)
SHOW CREATE TABLE table_name\G -- 查看建表详细 DDL 语句
DROP TABLE IF EXISTS table_name; -- 删除表
TRUNCATE TABLE table_name; -- 快速清空表数据 (重置自增计数器)
RENAME TABLE old_name TO new_name; -- 重命名表
3. 表字段修改 (ALTER TABLE)
ALTER TABLE t ADD COLUMN col_name VARCHAR(50) NOT NULL DEFAULT ''; -- 新增列
ALTER TABLE t DROP COLUMN col_name; -- 删除列
ALTER TABLE t MODIFY COLUMN col_name VARCHAR(100) NOT NULL; -- 修改列定义
ALTER TABLE t CHANGE COLUMN old_col new_col INT NOT NULL; -- 修改列名与定义
二、 常用内置函数速查
1. 字符串函数
| 函数 | 功能说明 | 经典语法示例 |
|---|---|---|
CONCAT(s1, s2, ...) |
拼接字符串 | SELECT CONCAT('Hello', ' ', 'World'); |
CONCAT_WS(sep, s1, ...) |
用分隔符拼接 | SELECT CONCAT_WS('-', '2026', '10', '30'); |
SUBSTRING(str, pos, len) |
截取字符串(pos 从 1 开始) | SELECT SUBSTRING('Database', 1, 4); -- Data |
LENGTH(str) / CHAR_LENGTH(str) |
字节长度 / 字符数 | SELECT CHAR_LENGTH('数据库'); -- 3 |
REPLACE(str, from, to) |
替换字符串 | SELECT REPLACE('www.mysql.com', 'mysql', 'sjkjc'); |
TRIM(str) |
去除首尾空格 | SELECT TRIM(' abc '); |
LOWER(str) / UPPER(str) |
大小写转换 | SELECT LOWER('MySQL'), UPPER('mysql'); |
IFNULL(expr1, expr2) |
为 NULL 时返回默认值 | SELECT IFNULL(email, '未绑定') FROM users; |
COALESCE(v1, v2, ...) |
返回首个非 NULL 值 | SELECT COALESCE(phone, mobile, '无电话'); |
2. 日期与时间函数
| 函数 | 功能说明 | 经典语法示例 |
|---|---|---|
NOW() / CURRENT_TIMESTAMP |
当前日期时间 | SELECT NOW(); -- 2026-10-30 12:00:00 |
CURDATE() / CURTIME() |
当前日期 / 当前时间 | SELECT CURDATE(), CURTIME(); |
DATE_ADD(date, INTERVAL n unit) |
日期增加 | SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); |
DATE_SUB(date, INTERVAL n unit) |
日期减少 | SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); |
DATEDIFF(date1, date2) |
两日期相差天数 (date1 - date2) |
SELECT DATEDIFF('2026-10-30', '2026-10-01'); -- 29 |
DATE_FORMAT(date, format) |
日期格式化输出 | SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); |
STR_TO_DATE(str, format) |
字符串解析为日期 | SELECT STR_TO_DATE('30-10-2026', '%d-%m-%Y'); |
3. 条件判断与控制流
-- 1. IF(expr, v1, v2)
SELECT username, IF(score >= 60, '及格', '不及格') AS result FROM exam;
-- 2. CASE 表达式
SELECT username,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM exam;
4. 聚合与窗口函数
SELECT dept_id, COUNT(*) AS total, AVG(salary) AS avg_sal
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > 8000;
-- 组内字符串聚合
SELECT dept_id, GROUP_CONCAT(emp_name ORDER BY salary DESC SEPARATOR ', ')
FROM employees
GROUP BY dept_id;
-- 窗口函数 (MySQL 8.0+)
SELECT emp_name, dept_id, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dept_rank
FROM employees;
三、 索引管理与优化速查
1. 索引创建与删除
-- 普通索引
CREATE INDEX idx_user_email ON users(email);
-- 唯一索引 (保证字段唯一,允许 NULL)
CREATE UNIQUE INDEX uk_user_phone ON users(phone);
-- 复合联合索引 (遵循最左前缀原则)
CREATE INDEX idx_name_age_status ON users(last_name, age, status);
-- 查看表上全部索引
SHOW INDEX FROM users\G
-- 删除索引
DROP INDEX idx_user_email ON users;
2. EXPLAIN 执行计划关键指标快速诊断
在查询语句前加上 EXPLAIN(如 EXPLAIN SELECT ...):
| 关键字段 | 常见取值与含义 | 性能评级 / 优化建议 |
|---|---|---|
| type | system > const > eq_ref > ref > range > index > ALL |
ALL 为全表扫描(最差),生产查询务必优化至 range 或 ref 以上。 |
| possible_keys | 可能用到的索引 | 若为空说明无可用索引。 |
| key | 实际使用的索引 | 检查是否命中了你预期的组合索引。 |
| rows | 预估扫描行数 | 数值越小代表过滤效率越高。 |
| Extra | Using index |
覆盖索引(最优),无需回表查询。 |
| Extra | Using where |
使用了 WHERE 条件过滤。 |
| Extra | Using filesort |
需警惕:无法利用索引完成排序,触发内存/磁盘外部文件排序。 |
| Extra | Using temporary |
需优化:使用了内部临时表(常见于 GROUP BY 无索引)。 |
四、 事务控制与锁排查
1. 基础事务控制
START TRANSACTION; -- 显式开启事务
-- 或者: BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交事务
-- 或者在发生异常时:
ROLLBACK; -- 回滚事务
2. 行级悲观锁与快照读
-- 排他锁 (X 锁,写锁)
SELECT * FROM orders WHERE id = 100 FOR UPDATE;
-- 共享锁 (S 锁,读锁)
SELECT * FROM orders WHERE id = 100 FOR SHARE;
3. 阻塞事务与锁等待一键排查
-- 查看当前正在运行的所有活跃事务
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx;
-- 查看锁等待关系 (快速找出谁阻塞了谁)
SELECT
r.trx_id AS waiting_trx,
r.trx_mysql_thread_id AS waiting_thread,
b.trx_id AS blocking_trx,
b.trx_mysql_thread_id AS blocking_thread
FROM performance_schema.data_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_engine_transaction_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_engine_transaction_id;
-- 杀掉源头阻塞线程 (解除系统假死)
KILL 1024;
五、 用户权限与运维安全
-- 创建新用户 (允许局域网或任意 IP 访问)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!';
-- 授予特定数据库的常用读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'%';
-- 授予管理员所有权限
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%' WITH GRANT OPTION;
-- 查看指定用户的权限
SHOW GRANTS FOR 'app_user'@'%';
-- 撤销权限
REVOKE DELETE ON mydb.* FROM 'app_user'@'%';
-- 修改密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'NewSecurePass456!';
-- 刷新权限缓存
FLUSH PRIVILEGES;
结语
建议将本页面加入浏览器书签,在日常编写复杂 SQL、排查线上慢查询或配置数据库权限时随时快速检索对照。更多关于函数与子句的详细运行示例,可查阅本站的 MySQL 教程 与 MySQL 参考手册。