Linux 系统中,MySQL 是最常用的关系型数据库管理系统之一,掌握其命令行操作是管理和维护数据库的基础,本文将详细讲解 MySQL 的常用命令,涵盖登录、数据库操作、表操作、数据管理、用户权限等核心功能,帮助用户高效完成数据库管理任务。

MySQL 登录与退出
要使用 MySQL 命令行工具,首先需要登录到 MySQL 服务器,基本登录命令为:
mysql -u 用户名 -p
执行后会提示输入密码,输入正确密码后即可进入 MySQL 交互界面,若 MySQL 服务未运行,需先启动服务(通过 sudo systemctl start mysql 或 sudo service mysql start)。
退出 MySQL 可使用以下命令:
exit; -- 或 quit;
按 Ctrl+D 也可直接退出。

数据库操作
显示所有数据库
SHOW DATABASES;
该命令列出服务器中所有数据库,默认包括 information_schema、mysql、performance_schema 等系统数据库。
创建数据库
CREATE DATABASE 数据库名 [CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci];
创建一个名为 mydb 的数据库并指定字符集为 utf8mb4(支持 emoji 和特殊字符):
CREATE DATABASE mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
选择数据库
USE 数据库名;
执行后,后续操作将针对该数据库,USE mydb;。
删除数据库
DROP DATABASE 数据库名;
注意:此操作不可逆,会删除数据库及所有数据,需谨慎使用。

表操作
显示当前数据库中的所有表
SHOW TABLES;
创建表
创建表需定义字段名、数据类型、约束等,创建一个用户表 users:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
age TINYINT UNSIGNED,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
AUTO_INCREMENT:自增主键,从 1 开始自动递增。NOT NULL:字段不能为空。UNIQUE:字段值唯一。DEFAULT CURRENT_TIMESTAMP:默认值为当前时间。ENGINE=InnoDB:指定存储引擎为 InnoDB(支持事务和外键)。
查看表结构
DESC 表名; -- 或 DESCRIBE 表名;
DESC users; 会显示字段名、数据类型、是否允许 NULL、键信息、默认值等。
修改表结构
-
添加字段:
ALTER TABLE 表名 ADD 字段名 数据类型 [约束];
为
users表添加phone字段:ALTER TABLE users ADD phone VARCHAR(20) DEFAULT '';
-
修改字段:
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [新约束];
修改
age字段类型为INT:ALTER TABLE users MODIFY age INT;
-
删除字段:
ALTER TABLE 表名 DROP 字段名;
例如删除
phone字段:ALTER TABLE users DROP phone;
-
重命名表:
RENAME TABLE 旧表名 TO 新表名;
删除表
DROP TABLE 表名;
注意:删除表会同时删除表中的所有数据,且无法恢复。
数据管理(增删改查)
插入数据(INSERT)
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
向 users 表插入数据:
INSERT INTO users (username, email, age) VALUES ('Alice', 'alice@example.com', 25);
若插入所有字段,可省略字段名列表:
INSERT INTO users VALUES (NULL, 'Bob', 'bob@example.com', 30, DEFAULT);
NULL表示自增主键的默认值。DEFAULT表示使用字段的默认值(如created_at的时间戳)。
查询数据(SELECT)
-
基本查询:
SELECT 字段名1, 字段名2, ... FROM 表名 [WHERE 条件];
查询所有用户名和邮箱:
SELECT username, email FROM users;
-
条件查询(WHERE 子句):
SELECT * FROM users WHERE age > 20 AND gender = 'M';
常用条件操作符:, (或
<>),>,<,>=,<=,BETWEEN...AND...,IN(...),LIKE(模糊匹配,如LIKE 'A%'匹配以 A 开头的用户名)。 -
排序(ORDER BY):
SELECT * FROM users ORDER BY age DESC; -- 按年龄降序排列
ASC为升序(默认),DESC为降序。 -
限制结果数(LIMIT):
SELECT * FROM users LIMIT 5; -- 只返回前 5 条记录
分页查询:
LIMIT offset, count,LIMIT 0, 10表示第 1-10 条(offset 从 0 开始)。
更新数据(UPDATE)
UPDATE 表名 SET 字段1=新值1, 字段2=新值2, ... WHERE 条件;
注意:必须加 WHERE 条件,否则会更新全表数据!更新用户 Alice 的年龄:
UPDATE users SET age = 26 WHERE username = 'Alice';
删除数据(DELETE)
DELETE FROM 表名 WHERE 条件;
注意:必须加 WHERE 条件,否则会删除全表数据!删除年龄小于 18 的用户:
DELETE FROM users WHERE age < 18;
用户与权限管理
创建用户并授权
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码'; GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机';
创建用户 testuser,允许其从本地登录,并对 mydb 数据库的所有表有查询和插入权限:
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'Test123!@#'; GRANT SELECT, INSERT ON mydb.* TO 'testuser'@'localhost';
- 权限列表包括
SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、ALL(所有权限)等。 - 表示所有数据库的所有表,
db.*表示某数据库的所有表。
刷新权限
修改权限后需执行以下命令使权限生效:
FLUSH PRIVILEGES;
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机';
撤销 testuser 的插入权限:
REVOKE INSERT ON mydb.* FROM 'testuser'@'localhost';
删除用户
DROP USER '用户名'@'主机';
数据备份与恢复
备份数据库(mysqldump)
mysqldump -u 用户名 -p 数据库名 > 备份文件.sql
备份 mydb 数据库到 mydb_backup.sql:
mysqldump -u root -p mydb > mydb_backup.sql
备份所有数据库:mysqldump -u root -p --all-databases > all_backup.sql。
恢复数据库
mysql -u 用户名 -p 数据库名 < 备份文件.sql
从 mydb_backup.sql 恢复 mydb 数据库:
mysql -u root -p mydb < mydb_backup.sql
常用数据类型
| 数据类型 | 说明 | 示例 |
|---|---|---|
| INT | 整数,4 字节 | age INT |
| VARCHAR(n) | 可变长度字符串,n 为最大长度 | username VARCHAR(50) |
| TEXT | 长文本,最大 64KB | content TEXT |
| DATETIME | 日期时间,格式 'YYYY-MM-DD HH:MM:SS' | created_at DATETIME |
| TIMESTAMP | 时间戳,自动更新 | update_time TIMESTAMP |
| DECIMAL(m, d) | 精确小数,m 为总位数,d 为小数位数 | price DECIMAL(10, 2) |
| BOOLEAN / TINYINT | 布尔值,0 为 false,1 为 true | is_active TINYINT(1) |
FAQs
Q1:MySQL 中忘记 root 密码如何重置?
A1:重置 root 密码的步骤如下(以 Linux 系统为例):
- 停止 MySQL 服务:
sudo systemctl stop mysql。 - 跳过权限表启动 MySQL:
sudo mysqld_safe --skip-grant-tables &。 - 无密码登录 MySQL:
mysql -u root。 - 执行以下命令重置密码(MySQL 5.7+):
UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root'; FLUSH PRIVILEGES; - 退出并重启 MySQL 服务:
sudo systemctl restart mysql。
Q2:如何优化 MySQL 查询性能?
A2:优化 MySQL 查询性能可从以下方面入手:
- 索引优化:为常用查询条件(如 WHERE 子句中的字段)添加索引,
CREATE INDEX idx_email ON users(email);。 - **避免 SELECT ***:只查询必要的字段,减少数据传输量。
- 使用 EXPLAIN 分析查询:通过
EXPLAIN SELECT * FROM users WHERE age > 20;查看查询执行计划,判断是否走索引。 - 控制分页页码:避免大偏移量分页(如
LIMIT 100000, 10),可采用“延迟关联”优化。 - 定期维护表:执行
OPTIMIZE TABLE 表名;碎片整理,提升查询效率。
