MySQL 基础命令
→ 返回 MySQL
本文汇总 mysql 客户端、库表 DDL、增删改查与常用 SHOW / 运维 命令。类型与引擎见 架构与数据类型;JOIN / 开窗见 联表与查询、开窗函数。
连接与基础使用
命令行登录
# 本机 root
mysql -u root -p
# 指定主机、端口、库
mysql -h 127.0.0.1 -P 3306 -u app -p app_db
# 单次执行(脚本/CI)
mysql -u app -p'***' -D app_db -e "SELECT COUNT(*) FROM orders;"会话内常用
SELECT VERSION(); -- 版本
SELECT DATABASE(); -- 当前库
SELECT USER(); -- 当前用户
SHOW VARIABLES LIKE 'character_set%';
SET NAMES utf8mb4; -- 客户端字符集(建议连接即设)| 说明 | 命令 |
|---|---|
| 所有库 | SHOW DATABASES; |
| 切换库 | USE app_db; |
| 当前库所有表 | SHOW TABLES; |
| 表结构 | DESC orders; 或 SHOW CREATE TABLE orders\G |
| 正在执行的连接 | SHOW PROCESSLIST; |
| 杀慢查询 | KILL query_id; |
库与表(DDL)
数据库
CREATE DATABASE app_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
DROP DATABASE IF EXISTS test_db;建表(InnoDB 示例)
CREATE TABLE users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL,
email VARCHAR(128) NOT NULL,
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_email (email),
KEY idx_status_created (status, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;主键与自增:主键与自增。
改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL AFTER email;
ALTER TABLE users MODIFY COLUMN name VARCHAR(128) NOT NULL;
ALTER TABLE users ADD INDEX idx_phone (phone);
ALTER TABLE users DROP INDEX idx_phone;
ALTER TABLE users DROP COLUMN phone;删表 / 清空
DROP TABLE IF EXISTS tmp_import;
TRUNCATE TABLE logs_2023; -- 快、重置自增;不可回滚(DDL)查询(SELECT)
-- 基础
SELECT id, name, email FROM users WHERE status = 1;
SELECT * FROM users WHERE id = 1001;
SELECT id, name FROM users ORDER BY created_at DESC LIMIT 20;
SELECT id, name FROM users WHERE id > 1000 ORDER BY id LIMIT 20; -- 深分页游标
-- 条件
SELECT * FROM users WHERE name LIKE '张%'; -- 前缀可走索引
SELECT * FROM users WHERE created_at >= '2024-01-01'
AND created_at < '2025-01-01';
SELECT * FROM users WHERE status IN (1, 2) AND id BETWEEN 1 AND 100;
-- 聚合
SELECT status, COUNT(*) AS cnt FROM users GROUP BY status;
SELECT user_id, SUM(amount) FROM orders WHERE status = 'paid' GROUP BY user_id
HAVING SUM(amount) > 1000;
-- 去重
SELECT DISTINCT user_id FROM orders;索引与失效:索引与失效;执行计划:
EXPLAIN SELECT id, name FROM users WHERE status = 1;
EXPLAIN FORMAT=TREE SELECT ...; -- 8.0.16+详见 EXPLAIN 与运维。
插入 / 更新 / 删除(DML)
-- 插入
INSERT INTO users (name, email, status) VALUES ('张三', 'a@b.com', 1);
INSERT INTO users (name, email) VALUES ('李四', 'c@d.com'), ('王五', 'e@f.com');
-- 存在则更新(需唯一键)
INSERT INTO users (id, name, email)
VALUES (1, '张三', 'a@b.com')
ON DUPLICATE KEY UPDATE name = VALUES(name), updated_at = NOW();
-- 替换(删后插,慎用)
REPLACE INTO users (id, name, email) VALUES (1, '张三', 'a@b.com');
-- 更新
UPDATE users SET status = 0 WHERE id = 1001;
UPDATE orders SET amount = amount * 0.9 WHERE status = 'pending' LIMIT 100;
-- 删除
DELETE FROM users WHERE id = 1001;
DELETE FROM logs WHERE created_at < '2023-01-01' LIMIT 5000; -- 分批删大表注意:UPDATE / DELETE 务必带 WHERE;生产先 SELECT 同条件确认行数。
联表与子查询(入口)
SELECT o.id, o.amount, u.name
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.status = 'paid';
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.status = 'paid'
);完整写法:联表与查询。
事务
START TRANSACTION; -- 或 BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- 回滚
START TRANSACTION;
UPDATE ...;
ROLLBACK;
-- 保存点
SAVEPOINT sp1;
ROLLBACK TO sp1;隔离级别与锁:事务与锁。
索引相关命令
-- 查看索引
SHOW INDEX FROM orders;
-- 在线加索引(8.0+ 支持 ALGORITHM/LOCK)
ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);
-- 分析统计信息
ANALYZE TABLE orders;
OPTIMIZE TABLE orders; -- 主要 InnoDB 整理,少用用户与权限(简表)
CREATE USER 'app'@'%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app'@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'%';生产遵循最小权限;勿对业务账号授予 SUPER、DROP 等。
备份与导入(命令行)
# 导出库
mysqldump -u root -p --single-transaction --routines app_db > app_db.sql
# 导出单表
mysqldump -u root -p app_db orders > orders.sql
# 导入
mysql -u root -p app_db < app_db.sql会话内:SOURCE /path/to/app_db.sql;
常用 SHOW / 状态
| 命令 | 用途 |
|---|---|
SHOW TABLE STATUS LIKE 'orders'\G | 行数估算、自增值 |
SHOW ENGINE INNODB STATUS\G | InnoDB 锁、事务(排障) |
SHOW VARIABLES LIKE 'max_connections' | 参数 |
SHOW STATUS LIKE 'Threads_connected' | 连接数 |
SHOW BINARY LOGS | binlog 列表 |
SHOW MASTER STATUS | 主库位点(复制) |
复制:主从复制。
SQL 书写习惯(生产)
| 习惯 | 说明 |
|---|---|
避免 SELECT * | 利于覆盖索引、减网络 |
| 大表变更 | 分批、LIMIT、低峰;考虑 pt-online-schema-change |
| 类型匹配 | 字符串列勿与数字比较(防隐式转换) |
| 慢 SQL | 开 slow_query_log,配合 SQL 优化 |
命令 → 学习路径
相关
- MySQL 索引
- PostgreSQL
- Redis 基础命令(对照 KV 命令风格)