Skip to content

MySQL 操作与命令 ​

连接数据库与检查结构 ​

mysql · 连接数据库并从终端执行 SQL;密码通过交互提示输入 ​

  • 连接指定主机和数据库:
bash
mysql --host={{localhost}} --port={{3306}} --user={{app_user}} --password {{app_db}}
  • 执行只读查询后退出:
bash
mysql --user={{app_user}} --password {{app_db}} --execute="SELECT CURRENT_USER(), DATABASE();"
  • 以适合脚本的格式输出,不显示列名:
bash
mysql --user={{app_user}} --password --batch --skip-column-names {{app_db}} --execute="SELECT id FROM users ORDER BY id LIMIT 10;"
  • 查看客户端版本;这不是服务器版本:
bash
mysql --version

MySQL SHOW · 查看数据库结构及会话信息;权限会影响可见范围 ​

  • 列出可见数据库:
bash
SHOW DATABASES;
  • 查看指定库中的表:
bash
SHOW TABLES FROM {{app_db}};
  • 查看建表语句:
bash
SHOW CREATE TABLE {{app_db.users}};
  • 查看索引:
bash
SHOW INDEX FROM {{app_db.users}};
  • 查看当前可见连接与完整 SQL:
bash
SHOW FULL PROCESSLIST;

查询与读取数据 ​

MySQL JOIN · 在 MySQL 会话中组合表数据,注意连接键不唯一可能增加结果行数 ​

在 MySQL 会话中组合表数据,注意连接键不唯一可能增加结果行数。

  • 关联订单与用户:
bash
SELECT o.id, u.name, o.total FROM orders AS o INNER JOIN users AS u ON u.id = o.user_id LIMIT 20;
  • 保留没有订单的用户:
bash
SELECT u.id, o.id AS order_id FROM users AS u LEFT JOIN orders AS o ON o.user_id = u.id LIMIT 20;
  • 查找没有订单的用户:
bash
SELECT u.id, u.name FROM users AS u LEFT JOIN orders AS o ON o.user_id = u.id WHERE o.id IS NULL;

MySQL SELECT · 在 MySQL 会话中筛选、排序和聚合数据;表名和字段需按实际结构调整 ​

  • 按条件查询,限制返回行数:
bash
SELECT id, name FROM users WHERE active = 1 ORDER BY id LIMIT 20;
  • 按时间区间查询,使用左闭右开边界:
bash
SELECT id, total FROM orders WHERE created_at >= '2026-01-01' AND created_at < '2026-02-01';
  • 按用户统计订单数量,过滤聚合结果:
bash
SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id HAVING COUNT(*) >= 3;
  • 使用上一页末尾 ID 查询下一页:
bash
SELECT id, name FROM users WHERE id > {{last_id}} ORDER BY id LIMIT 20;

写入数据与管理事务 ​

MySQL INSERT · 在 MySQL 会话中新增数据;示例会写入表,先确认唯一键和目标环境 ​

在 MySQL 会话中新增数据;示例会写入表,先确认唯一键和目标环境。

  • 明确列名插入一行:
bash
INSERT INTO users (name, active) VALUES ('demo-user', 1);
  • 一次插入多行:
bash
INSERT INTO users (name, active) VALUES ('demo-one', 1), ('demo-two', 0);
  • 复制筛选后的数据到已有归档表,避免重复执行:
bash
INSERT INTO archived_users (id, name) SELECT id, name FROM users WHERE active = 0;

MySQL transaction · 在同一个会话管理事务;回滚适用于事务表,部分 DDL 会隐式提交 ​

  • 开始事务;后续语句需在同一连接执行:
bash
START TRANSACTION;
  • 在事务中修改已确认的行;执行前检查 WHERE 条件:
bash
UPDATE users SET active = 0 WHERE id = 42;
  • 确认无误后提交;提交后的更改不能用 ROLLBACK 撤销:
bash
COMMIT;
  • 放弃尚未提交的事务修改:
bash
ROLLBACK;

分析计划、过期时间与运行状态 ​

MySQL EXPLAIN · 分析查询计划;ANALYZE 会实际运行查询,应先评估成本 ​

  • 查看估算执行计划:
bash
EXPLAIN SELECT id, name FROM users WHERE id = 42;
  • 以 JSON 输出计划:
bash
EXPLAIN FORMAT=JSON SELECT id FROM orders WHERE user_id = 42;
  • 实际执行只读查询并测量计划,可能消耗较多资源:
bash
EXPLAIN ANALYZE SELECT id FROM orders WHERE user_id = 42 LIMIT 20;

导入、导出与备份恢复 ​

MySQL import · 将 SQL 文件导入数据库;脚本可能覆盖或删除数据,先审阅并备份 ​

将 SQL 文件导入数据库;脚本可能覆盖或删除数据,先审阅并备份。

  • 在已连接的 mysql 会话中执行经过审阅的 SQL 文件:
bash
source {{path/to/backup.sql}}
  • 从终端导入 SQL;路径不要含空格,文件内 USE 可切换数据库:
bash
mysql --user={{app_user}} --password {{app_db}} --execute="source {{path/to/backup.sql}}"
  • 导入后检查目标表行数;不等同于完整校验:
bash
mysql --user={{app_user}} --password {{app_db}} --execute="SELECT COUNT(*) FROM users;"

示例整理自 tldr-pages,作者为 tldr-pages team and contributors,遵循 CC BY 4.0。

继续阅读