№ 18·MySQL / MYSQL
MySQL 常用命令:CRUD 操作速查
围绕 MySQL 日常增删改查整理常用命令,覆盖连接、库表、查询、插入、更新、删除、事务和导入导出。
占位符说明
| 占位符 | 含义 |
|---|---|
<host> | 数据库主机,例如 127.0.0.1 |
<port> | 数据库端口,例如 3306 |
<user> | 数据库用户名 |
<database> | 数据库名 |
<table> | 表名 |
<column> | 字段名 |
<value> | 字段值 |
<id> | 主键 ID |
<file> | 文件路径 |
连接和基础命令
| 命令 | 说明 |
|---|---|
mysql -u <user> -p | 使用用户名和密码连接本机 MySQL |
mysql -h <host> -P <port> -u <user> -p | 连接指定主机和端口 |
mysql -u <user> -p <database> | 连接后直接进入指定数据库 |
SELECT VERSION(); | 查看 MySQL 版本 |
SELECT NOW(); | 查看数据库当前时间 |
SHOW VARIABLES LIKE 'character_set%'; | 查看字符集配置 |
SHOW VARIABLES LIKE 'time_zone'; | 查看时区配置 |
STATUS; | 查看当前连接状态 |
HELP <command>; | 查看命令帮助 |
EXIT; | 退出 MySQL 客户端 |
数据库命令
| 命令 | 说明 |
|---|---|
SHOW DATABASES; | 查看所有数据库 |
CREATE DATABASE <database>; | 创建数据库 |
CREATE DATABASE <database> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; | 创建数据库并指定字符集 |
USE <database>; | 切换数据库 |
SELECT DATABASE(); | 查看当前数据库 |
DROP DATABASE <database>; | 删除数据库 |
表结构命令
| 命令 | 说明 |
|---|---|
SHOW TABLES; | 查看当前数据库所有表 |
DESC <table>; | 查看表字段结构 |
DESCRIBE <table>; | 查看表字段结构 |
SHOW CREATE TABLE <table>; | 查看建表语句 |
CREATE TABLE <table> (id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL); | 创建简单数据表 |
ALTER TABLE <table> ADD COLUMN <column> VARCHAR(255); | 新增字段 |
ALTER TABLE <table> MODIFY COLUMN <column> VARCHAR(500); | 修改字段类型 |
ALTER TABLE <table> DROP COLUMN <column>; | 删除字段 |
DROP TABLE <table>; | 删除表 |
TRUNCATE TABLE <table>; | 清空表并重置自增 ID |
查询数据
| 命令 | 说明 |
|---|---|
SELECT * FROM <table>; | 查询整张表 |
SELECT <column>, <column> FROM <table>; | 查询指定字段 |
SELECT * FROM <table> WHERE id = <id>; | 按主键查询 |
SELECT * FROM <table> WHERE <column> = '<value>'; | 按字段精确查询 |
SELECT * FROM <table> WHERE <column> LIKE '%keyword%'; | 模糊查询 |
SELECT * FROM <table> WHERE created_at >= '2026-01-01'; | 按时间范围查询 |
SELECT * FROM <table> WHERE <column> IS NULL; | 查询字段为空的数据 |
SELECT * FROM <table> WHERE <column> IS NOT NULL; | 查询字段不为空的数据 |
SELECT * FROM <table> ORDER BY created_at DESC; | 按时间倒序排序 |
SELECT * FROM <table> ORDER BY id DESC LIMIT 20; | 查询最近 20 条数据 |
SELECT * FROM <table> LIMIT 20 OFFSET 40; | 分页查询 |
SELECT COUNT(*) FROM <table>; | 统计总行数 |
SELECT <column>, COUNT(*) FROM <table> GROUP BY <column>; | 分组统计 |
SELECT DISTINCT <column> FROM <table>; | 查询字段去重值 |
连接查询
| 命令 | 说明 |
|---|---|
SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id; | 左连接查询,保留左表 users 的所有数据 |
SELECT users.id, users.name, orders.id AS order_id FROM users LEFT JOIN orders ON users.id = orders.user_id; | 左连接时指定返回字段 |
SELECT users.id, users.name, orders.id AS order_id FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE users.id = <id>; | 查询指定用户及其订单 |
SELECT users.id, users.name FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.id IS NULL; | 查询没有订单的用户 |
SELECT users.id, COUNT(orders.id) AS order_count FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id; | 统计每个用户的订单数量,没有订单时结果为 0 |
SELECT * FROM users INNER JOIN orders ON users.id = orders.user_id; | 内连接查询,只返回两张表都匹配的数据 |
SELECT * FROM users RIGHT JOIN orders ON users.id = orders.user_id; | 右连接查询,保留右表 orders 的所有数据 |
LEFT JOIN 的核心是保留左表全部记录。右表没有匹配数据时,右表字段会返回 NULL,所以它常用于“查主表列表,同时带上关联表信息”或“找出没有关联数据的记录”。
插入数据
| 命令 | 说明 |
|---|---|
INSERT INTO <table> (<column>) VALUES ('<value>'); | 插入单个字段 |
INSERT INTO <table> (<column>, <column>) VALUES ('<value>', '<value>'); | 插入多个字段 |
INSERT INTO <table> (<column>, <column>) VALUES ('<value>', '<value>'), ('<value>', '<value>'); | 批量插入 |
INSERT INTO <table> SET <column> = '<value>', <column> = '<value>'; | 使用 SET 语法插入 |
INSERT IGNORE INTO <table> (<column>) VALUES ('<value>'); | 插入冲突时忽略错误 |
INSERT INTO <table> (<column>) SELECT <column> FROM <table>; | 从查询结果插入数据 |
SELECT LAST_INSERT_ID(); | 查看最近一次自增 ID |
更新数据
| 命令 | 说明 |
|---|---|
UPDATE <table> SET <column> = '<value>' WHERE id = <id>; | 按主键更新 |
UPDATE <table> SET <column> = '<value>' WHERE <column> = '<value>'; | 按条件更新 |
UPDATE <table> SET <column> = <column> + 1 WHERE id = <id>; | 数值递增 |
UPDATE <table> SET updated_at = NOW() WHERE id = <id>; | 更新时间字段 |
UPDATE <table> SET <column> = NULL WHERE id = <id>; | 将字段更新为空 |
UPDATE <table> SET status = 'archived' WHERE created_at < '2026-01-01'; | 批量更新历史数据 |
UPDATE <table> SET <column> = '<value>' ORDER BY id DESC LIMIT 10; | 限制更新条数 |
删除数据
| 命令 | 说明 |
|---|---|
DELETE FROM <table> WHERE id = <id>; | 按主键删除 |
DELETE FROM <table> WHERE <column> = '<value>'; | 按条件删除 |
DELETE FROM <table> WHERE created_at < '2026-01-01'; | 删除历史数据 |
DELETE FROM <table> ORDER BY id DESC LIMIT 10; | 限制删除条数 |
DELETE FROM <table>; | 删除表内所有数据,不重置自增 ID |
TRUNCATE TABLE <table>; | 清空表并重置自增 ID |
条件和排序常用写法
| 命令 | 说明 |
|---|---|
WHERE <column> = '<value>' | 等于条件 |
WHERE <column> <> '<value>' | 不等于条件 |
WHERE <column> IN ('a', 'b', 'c') | 匹配多个值 |
WHERE <column> NOT IN ('a', 'b', 'c') | 排除多个值 |
WHERE <column> BETWEEN 1 AND 100 | 区间条件 |
WHERE <column> >= 1 AND <column> <= 100 | 多条件同时满足 |
WHERE <column> = 'a' OR <column> = 'b' | 多条件任意满足 |
ORDER BY <column> ASC | 升序排序 |
ORDER BY <column> DESC | 降序排序 |
LIMIT 20 | 限制返回 20 条 |
事务命令
| 命令 | 说明 |
|---|---|
START TRANSACTION; | 开启事务 |
BEGIN; | 开启事务 |
COMMIT; | 提交事务 |
ROLLBACK; | 回滚事务 |
SAVEPOINT <name>; | 创建保存点 |
ROLLBACK TO SAVEPOINT <name>; | 回滚到保存点 |
SET autocommit = 0; | 关闭自动提交 |
SET autocommit = 1; | 开启自动提交 |
索引和执行计划
| 命令 | 说明 |
|---|---|
SHOW INDEX FROM <table>; | 查看表索引 |
CREATE INDEX <index_name> ON <table> (<column>); | 创建普通索引 |
CREATE UNIQUE INDEX <index_name> ON <table> (<column>); | 创建唯一索引 |
DROP INDEX <index_name> ON <table>; | 删除索引 |
EXPLAIN SELECT * FROM <table> WHERE id = <id>; | 查看查询执行计划 |
EXPLAIN ANALYZE SELECT * FROM <table> WHERE id = <id>; | 实际执行并分析查询 |
导入和导出
| 命令 | 说明 |
|---|---|
mysqldump -u <user> -p <database> > <file>.sql | 导出整个数据库 |
mysqldump -u <user> -p <database> <table> > <file>.sql | 导出单张表 |
mysql -u <user> -p <database> < <file>.sql | 导入 SQL 文件 |
SELECT * FROM <table> INTO OUTFILE '<file>.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\n'; | 导出查询结果为 CSV |
LOAD DATA INFILE '<file>.csv' INTO TABLE <table> FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\n'; | 从 CSV 导入数据 |
常用组合
| 命令 | 说明 |
|---|---|
SELECT * FROM <table> WHERE id = <id> LIMIT 1; | 按主键查询单条数据 |
SELECT COUNT(*) FROM <table> WHERE <column> = '<value>'; | 统计满足条件的行数 |
SELECT * FROM <table> WHERE <column> IN ('a', 'b') ORDER BY id DESC LIMIT 20; | 查询多个状态的最近数据 |
UPDATE <table> SET deleted_at = NOW() WHERE id = <id>; | 常见软删除写法 |
SELECT * FROM <table> WHERE deleted_at IS NULL ORDER BY id DESC LIMIT 20; | 查询未软删除数据 |
START TRANSACTION; UPDATE <table> SET <column> = '<value>' WHERE id = <id>; COMMIT; | 在事务中更新数据 |
SELECT * FROM <table> WHERE <column> = '<value>' FOR UPDATE; | 事务内查询并锁定数据行 |
操作建议
- 执行
UPDATE和DELETE前,先用相同的WHERE写一条SELECT确认影响范围。 - 批量修改数据时,优先放在事务里执行,并准备好回滚方案。
- 线上操作尽量加上明确条件,避免直接执行无条件的
UPDATE、DELETE和TRUNCATE。 - 查询列表数据时优先指定字段,避免在大表上长期依赖
SELECT *。