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 参考手册。