SQL 快速参考手册(运维增强版)
SQL 快速参考手册(运维增强版)
整理自 菜鸟教程 SQL 快速参考,并补充运维日常管理命令(以 MySQL 为主,标注了版本差异)。
维护人:橙子柠檬 | 更新日期:2026-10-05
目录
- 一、数据查询(DQL)
- 二、数据操作(DML)
- 三、数据定义(DDL)
- 四、用户与权限管理(DCL)
- 五、会话与进程管理
- 六、状态与配置(运行时诊断)
- 七、库表元数据查看
- 八、锁与事务排查
- 九、主从复制管理
- 十、备份与恢复
- 十一、表维护与优化
- 十二、性能分析
- 十三、常用运维场景速查
- 附:危险操作清单
一、数据查询(DQL)
| 语句 | 语法 | 说明 |
|---|---|---|
| SELECT | SELECT column_name(s) FROM table_name; |
从表中选择数据 |
| **SELECT *** | SELECT * FROM table_name; |
选择所有列 |
| SELECT DISTINCT | SELECT DISTINCT column_name(s) FROM table_name; |
返回去重后的值 |
| WHERE | SELECT column_name(s) FROM table_name WHERE column operator value; |
过滤记录 |
| AND / OR | SELECT ... WHERE condition AND\|OR condition; |
逻辑与 / 逻辑或 |
| ORDER BY | SELECT ... ORDER BY column [ASC\|DESC]; |
排序,ASC 升序(默认)、DESC 降序 |
| LIKE | SELECT ... WHERE column LIKE pattern; |
模式匹配(% 任意字符,_ 单字符) |
| IN | SELECT ... WHERE column IN (v1, v2, ...); |
匹配集合中的值 |
| BETWEEN | SELECT ... WHERE column BETWEEN v1 AND v2; |
范围筛选(含边界) |
| LIMIT (MySQL) | SELECT ... LIMIT n OFFSET m; 或 LIMIT m, n; |
限制返回行数(SQL Server 用 TOP,Oracle 用 ROWNUM) |
| 别名 AS | SELECT col AS c_alias FROM table AS t_alias; |
列或表取别名 |
| INNER JOIN | SELECT ... FROM t1 INNER JOIN t2 ON t1.c=t2.c; |
两表匹配的记录 |
| LEFT JOIN | SELECT ... FROM t1 LEFT JOIN t2 ON t1.c=t2.c; |
左表全部 + 右表匹配 |
| RIGHT JOIN | SELECT ... FROM t1 RIGHT JOIN t2 ON t1.c=t2.c; |
右表全部 + 左表匹配 |
| FULL JOIN | SELECT ... FROM t1 FULL JOIN t2 ON t1.c=t2.c; |
两表全部记录(MySQL 不支持,用 UNION 模拟) |
| UNION | SELECT ... FROM t1 UNION SELECT ... FROM t2; |
合并结果集并去重 |
| UNION ALL | SELECT ... FROM t1 UNION ALL SELECT ... FROM t2; |
合并结果集不去重(性能更好) |
| GROUP BY | SELECT col, agg(col) FROM t GROUP BY col; |
分组聚合 |
| HAVING | SELECT ... GROUP BY col HAVING agg(col) op value; |
对分组后的结果过滤 |
常用聚合/函数
COUNT(*) / COUNT(col) -- 计数
SUM(col) / AVG(col) -- 求和 / 平均
MAX(col) / MIN(col) -- 最大 / 最小
ROUND(x, d) -- 四舍五入
NOW() -- 当前时间
IFNULL(col, 0) -- NULL 转换(COALESCE 同理,支持多参数)
DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s') -- 日期格式化(MySQL)
二、数据操作(DML)
| 语句 | 语法 | 说明 |
|---|---|---|
| INSERT INTO | INSERT INTO t (c1, c2) VALUES (v1, v2); |
插入记录 |
| INSERT INTO SELECT | INSERT INTO t2 SELECT * FROM t1 WHERE ...; |
从另一表批量导入 |
| UPDATE | UPDATE t SET c1=v1, c2=v2 WHERE condition; |
修改记录(务必带 WHERE) |
| DELETE | DELETE FROM t WHERE condition; |
删除记录(务必带 WHERE) |
| TRUNCATE | TRUNCATE TABLE t; |
清空全表(保留结构,不可回滚,重置自增) |
⚠️
UPDATE/DELETE不带 WHERE 会影响全表;生产环境执行前先开事务验证,或先用 SELECT 确认影响范围。
三、数据定义(DDL)
| 语句 | 语法 | 说明 |
|---|---|---|
| CREATE DATABASE | CREATE DATABASE db_name DEFAULT CHARSET utf8mb4; |
建库(建议显式指定字符集) |
| CREATE TABLE | CREATE TABLE t (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(64) NOT NULL, ...); |
建表 |
| CREATE INDEX | CREATE INDEX idx_name ON t (col); |
普通索引 |
| CREATE UNIQUE INDEX | CREATE UNIQUE INDEX idx_name ON t (col); |
唯一索引 |
| CREATE VIEW | CREATE VIEW v AS SELECT ... WHERE ...; |
创建视图 |
| ALTER TABLE 加列 | ALTER TABLE t ADD COLUMN c datatype; |
加列 |
| ALTER TABLE 删列 | ALTER TABLE t DROP COLUMN c; |
删列 |
| ALTER TABLE 改列 | ALTER TABLE t MODIFY COLUMN c new_datatype; |
改列类型 |
| ALTER TABLE 改名 | ALTER TABLE t RENAME TO new_t; |
表改名 |
| DROP DATABASE | DROP DATABASE db_name; |
删库(⚠️ 危险) |
| DROP TABLE | DROP TABLE t; |
删表(⚠️ 危险) |
| DROP INDEX | ALTER TABLE t DROP INDEX idx_name; (MySQL) |
删索引 |
| DROP VIEW | DROP VIEW v; |
删视图 |
常用约束
NOT NULL -- 非空
UNIQUE -- 唯一
PRIMARY KEY -- 主键(非空 + 唯一)
FOREIGN KEY -- 外键:FOREIGN KEY (col) REFERENCES other(id)
CHECK (expr) -- 检查约束
DEFAULT value -- 默认值
AUTO_INCREMENT -- 自增(MySQL)
四、用户与权限管理(DCL)
| 语句 | 语法 | 说明 |
|---|---|---|
| CREATE USER | CREATE USER 'user'@'host' IDENTIFIED BY 'password'; |
创建用户(host 可用 % 表示任意) |
| GRANT | GRANT SELECT, INSERT ON db.* TO 'user'@'host'; |
授权 |
| GRANT ALL | GRANT ALL PRIVILEGES ON *.* TO 'user'@'host' WITH GRANT OPTION; |
全库全权限(慎用) |
| REVOKE | REVOKE INSERT ON db.* FROM 'user'@'host'; |
回收权限 |
| SHOW GRANTS | SHOW GRANTS FOR 'user'@'host'; |
查看用户权限 |
| ALTER USER | ALTER USER 'user'@'host' IDENTIFIED BY 'new_password'; |
改密码(MySQL 5.7+) |
| SET PASSWORD | SET PASSWORD FOR 'user'@'host' = 'new_password'; |
改密码(旧写法) |
| RENAME USER | RENAME USER 'old'@'host' TO 'new'@'host'; |
用户改名 |
| DROP USER | DROP USER 'user'@'host'; |
删除用户 |
| FLUSH PRIVILEGES | FLUSH PRIVILEGES; |
刷新权限表(直接改 grant 表后才需要) |
💡 MySQL 8.0 起不再支持
GRANT隐式创建用户,必须先CREATE USER。
⚠️ 密码不要出现在 shell 命令行/脚本/日志里,用mysql_config_editor或交互输入。
五、会话与进程管理
运维高频:排查慢 SQL、连接堆积、杀会话。
| 语句 | 语法 | 说明 |
|---|---|---|
| SHOW PROCESSLIST | SHOW PROCESSLIST; |
查看当前连接与正在执行的语句 |
| SHOW FULL PROCESSLIST | SHOW FULL PROCESSLIST; |
同上,但显示完整 SQL(不截断) |
| 增强版 | SELECT * FROM information_schema.processlist; |
信息更全(含执行中的 SQL 文本、进度),且能加条件过滤 |
| KILL | KILL <Id>; |
杀掉指定连接 |
| KILL QUERY | KILL QUERY <Id>; |
只终止该连接正在执行的语句,保留连接 |
-- 筛选运行超过 60 秒的查询
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE command != 'Sleep' AND time > 60
ORDER BY time DESC;
-- 查看连接数概况
SHOW STATUS LIKE 'Threads_%'; -- Threads_connected / Threads_running
SHOW VARIABLES LIKE 'max_connections';
批量 KILL(生成 kill 语句再执行,不要盲目全杀):
-- 杀掉某用户的所有 Sleep 超时连接
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.processlist
WHERE user = 'app_user' AND command = 'Sleep' AND time > 600;
-- 拿到输出后逐条确认执行
六、状态与配置(运行时诊断)
| 语句 | 语法 | 说明 |
|---|---|---|
| SHOW STATUS | SHOW GLOBAL STATUS; |
运行状态计数器(QPS 相关、连接数等) |
| SHOW VARIABLES | SHOW GLOBAL VARIABLES LIKE '%buffer%'; |
查看配置参数 |
| SET GLOBAL | SET GLOBAL max_connections = 2000; |
在线改参数(重启失效,需同步改 my.cnf) |
| SHOW ENGINES | SHOW ENGINES; |
查看支持的存储引擎 |
| SHOW ENGINE INNODB STATUS | SHOW ENGINE INNODB STATUS\G |
InnoDB 详细状态(锁、死锁、缓冲池、IO) |
| SHOW CHARACTER SET | SHOW CHARACTER SET; |
支持的字符集 |
| SHOW COLLATION | SHOW COLLATION; |
支持的排序规则 |
-- 运维常用状态项
SHOW GLOBAL STATUS LIKE 'Threads_connected'; -- 当前连接数
SHOW GLOBAL STATUS LIKE 'Threads_running'; -- 活跃线程数
SHOW GLOBAL STATUS LIKE 'Max_used_connections';-- 历史峰值连接
SHOW GLOBAL STATUS LIKE 'Slow_queries'; -- 慢查询累计次数
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_%'; -- 行锁等待统计
SHOW GLOBAL STATUS LIKE 'Uptime'; -- 实例运行时长
七、库表元数据查看
| 语句 | 语法 | 说明 |
|---|---|---|
| SHOW DATABASES | SHOW DATABASES; |
列出所有库 |
| USE | USE db_name; |
切换库 |
| SHOW TABLES | SHOW TABLES; / SHOW TABLES FROM db; |
列出表 |
| DESCRIBE | DESC t; 或 SHOW COLUMNS FROM t; |
查看表结构 |
| SHOW CREATE TABLE | SHOW CREATE TABLE t\G |
查看完整建表语句(含引擎/字符集) |
| SHOW CREATE DATABASE | SHOW CREATE DATABASE db\G |
查看建库语句 |
| SHOW INDEX | SHOW INDEX FROM t; |
查看表的索引 |
| SHOW TABLE STATUS | SHOW TABLE STATUS LIKE 't%'\G |
表的引擎/行数/大小等 |
-- 用 information_schema 统计:各库大小
SELECT table_schema AS db,
ROUND(SUM(data_length+index_length)/1024/1024, 1) AS size_mb
FROM information_schema.tables
GROUP BY table_schema
ORDER BY size_mb DESC;
-- 某库下最大的 10 张表
SELECT table_name,
table_rows,
ROUND((data_length+index_length)/1024/1024, 1) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'your_db'
ORDER BY data_length+index_length DESC
LIMIT 10;
-- 查找无主键的表(复制与大数据量运维隐患)
SELECT table_schema, table_name
FROM information_schema.tables t
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema','sys')
AND NOT EXISTS (SELECT 1 FROM information_schema.table_constraints c
WHERE c.table_schema=t.table_schema AND c.table_name=t.table_name
AND c.constraint_type='PRIMARY KEY');
八、锁与事务排查
线上卡顿常见原因:长事务、锁等待。排查顺序:先看正在执行的事务 → 再看锁等待 → 定位阻塞源头。
-- 1. 当前运行中的事务(重点看运行时间长的)
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id AS pid,
trx_rows_locked, trx_rows_modified, trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
-- 2. 锁等待关系(MySQL 5.7)
SELECT * FROM information_schema.innodb_lock_waits;
SELECT * FROM information_schema.innodb_locks;
-- 3. 锁等待关系(MySQL 8.0,新数据字典)
SELECT * FROM performance_schema.data_lock_waits;
SELECT * FROM performance_schema.data_locks;
-- 4. 一站式:谁在等谁的锁(8.0 常用)
SELECT waiting_pid, waiting_query, blocking_pid, blocking_query
FROM sys.innodb_lock_waits\G
-- 5. 杀掉阻塞源头(用上面查到的 blocking_pid)
KILL <blocking_pid>;
显式锁相关语句:
SELECT * FROM t WHERE id=1 FOR UPDATE; -- 行排他锁(事务内)
SELECT * FROM t WHERE id=1 FOR SHARE; -- 行共享锁(8.0,旧写法 LOCK IN SHARE MODE)
LOCK TABLES t READ; -- 表读锁
LOCK TABLES t WRITE; -- 表写锁
UNLOCK TABLES; -- 解锁
FLUSH TABLES WITH READ LOCK; -- 全局读锁(备份用,尽快释放)
⚠️
FLUSH TABLES WITH READ LOCK会阻塞所有写操作,生产库慎用;备份优先用mysqldump --single-transaction(仅 InnoDB)。
九、主从复制管理
| 语句 | 语法 | 说明 |
|---|---|---|
| SHOW MASTER STATUS | SHOW MASTER STATUS; |
主库当前 binlog 位点 |
| SHOW SLAVE STATUS\G | SHOW SLAVE STATUS\G |
从库复制状态(运维必会) |
| SHOW REPLICAS | SHOW REPLICAS; |
主库看已连接的从库(8.0.22+) |
| START/STOP REPLICA | START REPLICA; / STOP REPLICA; |
启停复制(旧写法 START SLAVE) |
| RESET REPLICA | RESET REPLICA ALL; |
清除复制配置(⚠️ 慎重) |
| CHANGE REPLICATION SOURCE TO | CHANGE REPLICATION SOURCE TO SOURCE_HOST='x', SOURCE_USER='r', SOURCE_PASSWORD='p', SOURCE_LOG_FILE='binlog.000001', SOURCE_LOG_POS=157; |
配置复制源(8.0.22+,旧写法 CHANGE MASTER TO) |
| SHOW BINARY LOGS | SHOW BINARY LOGS; |
列出 binlog 文件与大小 |
| SHOW BINLOG EVENTS | SHOW BINLOG EVENTS IN 'binlog.000001' LIMIT 10; |
查看 binlog 内容 |
| PURGE BINARY LOGS | PURGE BINARY LOGS BEFORE '2026-09-01 00:00:00'; |
清理 binlog(⚠️ 确认从库已消费) |
| FLUSH LOGS | FLUSH BINARY LOGS; |
手动滚动 binlog |
-- 从库健康检查三要素
SHOW SLAVE STATUS\G
-- 1) Slave_IO_Running: Yes
-- 2) Slave_SQL_Running: Yes
-- 3) Seconds_Behind_Master: 0 (延迟秒数)
-- 主从延迟对应关系(从库执行,用于精确追位点)
SHOW REPLICA STATUS\G -- 看 Retrieved_Gtid_Set / Executed_Gtid_Set(启用 GTID 时)
⚠️
PURGE BINARY LOGS前必须确认所有从库已消费对应 binlog;更推荐设置expire_logs_days/binlog_expire_logs_seconds自动清理。
十、备份与恢复
Shell 层工具为主,SQL 层配合。
# 全库逻辑备份(InnoDB 推荐 --single-transaction,不锁表)
mysqldump -uroot -p --single-transaction --routines --triggers \
--master-data=2 --all-databases > full_backup_$(date +%F).sql
# 单库 / 单表
mysqldump -uroot -p db_name > db.sql
mysqldump -uroot -p db_name table1 table2 > tables.sql
# 仅备份表结构 / 仅数据
mysqldump -uroot -p --no-data db_name > schema.sql
mysqldump -uroot -p --no-create-info db_name > data.sql
# 恢复
mysql -uroot -p db_name < db.sql
# 物理备份:percona xtrabackup(大库首选)
xtrabackup --backup --target-dir=/backup/base --user=root --password=xxx
# binlog 解析(指定库、时间范围)
mysqlbinlog --start-datetime="2026-10-01 00:00:00" \
--stop-datetime="2026-10-02 00:00:00" binlog.000001 > binlog.sql
-- SQL 层配合
SOURCE /path/to/dump.sql; -- 客户端内导入
SELECT ... INTO OUTFILE '/tmp/x.csv'; -- 导出数据到文件(需 secure_file_priv 许可)
LOAD DATA INFILE '/tmp/x.csv' INTO TABLE t; -- 从文件导入
FLUSH TABLES WITH READ LOCK; -- 备份期间短暂加全局读锁(非 InnoDB 表)
UNLOCK TABLES;
⚠️
SELECT ... INTO OUTFILE/LOAD DATA INFILE受secure_file_priv限制;恢复大数据量时先关闭 binlog(SET sql_log_bin=0)可提速,但注意复制环境一致性。
十一、表维护与优化
| 语句 | 语法 | 说明 |
|---|---|---|
| ANALYZE TABLE | ANALYZE TABLE t; |
重新收集统计信息(优化器用) |
| OPTIMIZE TABLE | OPTIMIZE TABLE t; |
整理碎片空间(实质重建表,⚠️ 大表会长时间锁) |
| CHECK TABLE | CHECK TABLE t; |
检查表完整性 |
| REPAIR TABLE | REPAIR TABLE t; |
修复表(仅 MyISAM 有效) |
| FLUSH TABLES | FLUSH TABLES; |
关闭所有打开的表 |
| FLUSH STATUS | FLUSH STATUS; |
重置会话状态计数器 |
-- 查看表碎片率,决定是否需要 OPTIMIZE
SELECT table_name, data_free/1024/1024 AS frag_mb
FROM information_schema.tables
WHERE table_schema='your_db' AND data_free > 0
ORDER BY data_free DESC;
十二、性能分析
-- 1. 执行计划(优化第一入口)
EXPLAIN SELECT ...;
EXPLAIN FORMAT=JSON SELECT ...\G -- 详细计划(含 cost)
EXPLAIN ANALYZE SELECT ...; -- 8.0.18+ 实际执行并统计,最真实
-- 2. 慢查询日志(动态开启,无需重启)
SET GLOBAL slow_query_log = ON;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 1; -- 超过 1 秒记录
SET GLOBAL log_queries_not_using_indexes = ON;
-- 3. 语句分析(MySQL 5.7 前常用)
SET profiling = 1;
SELECT ...;
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;
-- 4. performance_schema:开销最大的 SQL(8.0)
SELECT * FROM sys.statements_with_full_table_scans LIMIT 10;
SELECT * FROM sys.statements_with_sorts LIMIT 10;
-- 5. sys schema 现成视图(8.0 强烈推荐)
SELECT * FROM sys.schema_tables_with_full_table_scans; -- 全表扫描多的表
SELECT * FROM sys.innodb_buffer_stats_by_table; -- 缓冲池占用
SELECT * FROM sys.user_summary_by_statement_type; -- 按用户统计语句
EXPLAIN 关键列速查:
| 列 | 关注点 |
|---|---|
| type | 访问类型,从好到差:system > const > eq_ref > ref > range > index > ALL,出现 ALL(全表扫描)要警惕 |
| key | 实际使用的索引,NULL 表示没用上索引 |
| rows | 预估扫描行数,越大越慢 |
| Extra | Using filesort(额外排序)、Using temporary(临时表)都是优化信号 |
十三、常用运维场景速查
场景 1:连接数暴涨 / too many connections
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
SELECT user, host, count(*) AS cnt FROM information_schema.processlist
GROUP BY user, host ORDER BY cnt DESC; -- 谁占的连接
SET GLOBAL max_connections = 2000; -- 临时扩容(治标)
-- 治本:排查应用连接池配置 / 连接泄漏
场景 2:某条 SQL 把库拖慢了
SHOW FULL PROCESSLIST; -- 找到 long time 的 Query
KILL <id>; -- 终止
-- 再用 EXPLAIN 分析该 SQL,补索引
场景 3:表被锁,业务卡住
SELECT * FROM sys.innodb_lock_waits\G -- 找 blocking_pid
KILL <blocking_pid>;
SELECT * FROM information_schema.innodb_trx; -- 复查是否还有长事务
场景 4:主从延迟高
SHOW SLAVE STATUS\G -- 看 Seconds_Behind_Master
-- 大事务 → 拆小;单线程回放慢 → 8.0 开并行复制
-- SHOW VARIABLES LIKE 'replica_parallel_workers';
场景 5:磁盘被 binlog 占满
SHOW BINARY LOGS;
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY; -- 确认从库已同步再清
场景 6:找回误删数据(有 binlog 前提)
# 定位误操作 binlog → 反向生成补偿 SQL(工具:my2sql / binlog2sql)
mysqlbinlog --start-position=xxx --stop-position=yyy binlog.000005 > recover.sql
附:危险操作清单
以下命令生产环境执行前必须走变更工单 + 二次确认:
| 操作 | 风险 |
|---|---|
DROP DATABASE / DROP TABLE |
不可恢复(除非有备份) |
TRUNCATE TABLE |
清空全表,隐式提交,不可回滚 |
无 WHERE 的 UPDATE / DELETE |
全表数据被改/删 |
KILL 大事务连接 |
回滚可能耗时更长,先评估 |
RESET MASTER / RESET REPLICA |
清空 binlog / 复制位点,破坏复制链 |
PURGE BINARY LOGS |
从库未消费会导致复制中断 |
FLUSH TABLES WITH READ LOCK |
全库写阻塞 |
OPTIMIZE TABLE(大表) |
长时间锁表、占用双倍磁盘空间 |
SET GLOBAL 内存相关参数 |
调大 buffer 可能引发 OOM |
参考链接
- 菜鸟教程 SQL 快速参考:https://www.runoob.com/sql/sql-quickref.html
- MySQL 官方文档:https://dev.mysql.com/doc/
- MySQL 8.0 sys schema:https://dev.mysql.com/doc/refman/8.0/en/sys-schema.html