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'@'%';

生产遵循最小权限;勿对业务账号授予 SUPERDROP 等。


备份与导入(命令行)

# 导出库
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\GInnoDB 锁、事务(排障)
SHOW VARIABLES LIKE 'max_connections'参数
SHOW STATUS LIKE 'Threads_connected'连接数
SHOW BINARY LOGSbinlog 列表
SHOW MASTER STATUS主库位点(复制)

复制:主从复制


SQL 书写习惯(生产)

习惯说明
避免 SELECT *利于覆盖索引、减网络
大表变更分批、LIMIT、低峰;考虑 pt-online-schema-change
类型匹配字符串列勿与数字比较(防隐式转换)
慢 SQL开 slow_query_log,配合 SQL 优化

命令 → 学习路径

阶段文档
入门本文 + 架构与数据类型
索引索引与失效
复杂查询联表与查询开窗函数
JavaMyBatis

相关