Skip to content

MySQL 命令语法

连接命令

mysql命令

语法

mysql [选项] [数据库]

常用选项

  • -u, --user=用户名:指定连接数据库的用户名
  • -p, --password[=密码]:指定密码,不跟密码则交互式输入
  • -h, --host=主机名:指定数据库服务器的主机名或IP地址
  • -P, --port=端口号:指定数据库服务器的端口号,默认3306
  • -S, --socket=socket路径:指定Unix socket文件路径,仅适用于本地连接
  • -D, --database=数据库名:指定要连接的数据库
  • -e, --execute=SQL语句:执行指定的SQL语句并退出
  • -V, --version:显示MySQL客户端版本信息
  • --help:显示完整的帮助信息

示例

bash
# 连接到本地MySQL服务器
mysql -u root -p

# 连接到远程MySQL服务器
mysql -u root -p -h 192.168.1.100 -P 3306

# 执行SQL语句并退出
mysql -u root -p -e "SELECT * FROM database.table LIMIT 10;"

# 使用socket文件连接
mysql -u root -p -S /var/lib/mysql/mysql.sock

mysqladmin命令

语法

mysqladmin [选项] 命令 [命令选项]

常用命令

  • create 数据库名:创建新的数据库
  • drop 数据库名:删除指定的数据库
  • status:显示服务器状态摘要
  • extended-status:显示扩展的服务器状态变量
  • variables:显示服务器系统变量
  • processlist:显示当前运行的进程列表
  • kill 进程ID1 [进程ID2...]:杀死指定的进程
  • flush-hosts:清空主机缓存,解除主机封锁
  • flush-logs:刷新日志文件,生成新的日志文件
  • flush-privileges:刷新权限表,使权限更改生效
  • flush-tables:刷新所有表,关闭并重新打开表文件
  • flush-threads:刷新线程缓存
  • ping:检查服务器是否存活
  • shutdown:关闭MySQL服务器
  • version:显示MySQL服务器版本信息

示例

bash
# 检查服务器状态
mysqladmin -u root -p status

# 显示进程列表
mysqladmin -u root -p processlist

# 杀死进程
mysqladmin -u root -p kill 123 456

# 刷新日志
mysqladmin -u root -p flush-logs

mysqldump命令

语法

mysqldump [选项] [数据库 [表...]]

常用选项

  • -u, --user=用户名:指定备份的用户名
  • -p, --password[=密码]:指定密码
  • -h, --host=主机名:指定数据库服务器的主机名
  • -P, --port=端口号:指定数据库服务器的端口号
  • -A, --all-databases:备份所有数据库
  • -B, --databases 数据库1 数据库2...:备份多个指定的数据库
  • -d, --no-data:只备份表结构,不备份数据
  • -t, --no-create-info:只备份数据,不备份表结构
  • -R, --routines:备份存储过程和函数
  • --triggers:备份触发器
  • --events:备份事件调度器
  • --single-transaction:使用单事务模式备份(适用于InnoDB)
  • --lock-tables:备份前锁定所有表(适用于MyISAM)
  • --flush-logs:备份前刷新日志
  • --master-data[=2]:记录二进制日志位置和文件名,2表示注释掉该语句

示例

bash
# 备份单个数据库
mysqldump -u root -p database_name > backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_databases.sql

# 只备份表结构
mysqldump -u root -p -d database_name > structure.sql

# 使用单事务备份
mysqldump -u root -p --single-transaction database_name > backup.sql

# 备份并压缩
mysqldump -u root -p database_name | gzip > backup.sql.gz

mysqlimport命令

语法

mysqlimport [选项] 数据库 文本文件1 [文本文件2...]

常用选项

  • -u, --user=用户名:指定导入的用户名
  • -p, --password[=密码]:指定密码
  • -h, --host=主机名:指定数据库服务器的主机名
  • -P, --port=端口号:指定数据库服务器的端口号
  • -d, --delete:导入前删除表中所有现有数据
  • -i, --ignore:忽略导入数据中的重复行
  • -r, --replace:用导入数据替换表中现有的重复行
  • --fields-terminated-by=字符:指定字段间的分隔符
  • --fields-enclosed-by=字符:指定字段的包围符
  • --fields-escaped-by=字符:指定转义字符
  • --lines-terminated-by=字符串:指定行分隔符

示例

bash
# 导入数据文件
mysqlimport -u root -p database_name data.txt

# 导入前删除数据
mysqlimport -u root -p -d database_name data.txt

# 指定分隔符
mysqlimport -u root -p --fields-terminated-by=, --lines-terminated-by=\n database_name data.csv

数据库管理命令

CREATE DATABASE - 创建数据库

语法

sql
CREATE DATABASE [IF NOT EXISTS] 数据库名
    [DEFAULT CHARACTER SET 字符集名]
    [DEFAULT COLLATE 校对规则名];

示例

sql
# 创建数据库
CREATE DATABASE mydatabase;

# 带条件创建数据库(如果不存在则创建)
CREATE DATABASE IF NOT EXISTS mydatabase;

# 指定字符集和校对规则创建数据库
CREATE DATABASE mydatabase
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

DROP DATABASE - 删除数据库

语法

sql
DROP DATABASE [IF EXISTS] 数据库名;

示例

sql
# 删除数据库
DROP DATABASE mydatabase;

# 带条件删除数据库(如果存在则删除)
DROP DATABASE IF EXISTS mydatabase;

USE - 切换数据库

语法

sql
USE 数据库名;

示例

sql
# 切换到指定数据库
USE mydatabase;

SHOW DATABASES - 显示数据库列表

语法

sql
SHOW DATABASES [LIKE '匹配模式'];

示例

sql
# 显示所有数据库
SHOW DATABASES;

# 显示名称以my开头的数据库
SHOW DATABASES LIKE 'my%';

表管理命令

CREATE TABLE - 创建表

语法

sql
CREATE TABLE [IF NOT EXISTS] 表名 (
    列1 数据类型 [约束],
    列2 数据类型 [约束],
    ...
    [表级约束]
) ENGINE=存储引擎名 [ROW_FORMAT=行格式] [其他选项];

示例

sql
# 创建用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

# 创建带外键的订单表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

ALTER TABLE - 修改表

语法

sql
ALTER TABLE 表名
    操作1,
    操作2,
    ...;

常用操作

  • ADD COLUMN 列名 数据类型 [约束]:添加新列
  • MODIFY COLUMN 列名 数据类型 [约束]:修改现有列
  • CHANGE COLUMN 旧列名 新列名 数据类型 [约束]:重命名列
  • DROP COLUMN 列名:删除列
  • ADD CONSTRAINT 约束名 约束类型 (列名):添加表级约束
  • DROP CONSTRAINT 约束名:删除表级约束
  • RENAME TO 新表名:重命名表

示例

sql
# 为用户表添加年龄列
ALTER TABLE users ADD COLUMN age INT;

# 修改年龄列的数据类型为无符号整数
ALTER TABLE users MODIFY COLUMN age INT UNSIGNED;

# 将年龄列重命名为用户年龄
ALTER TABLE users CHANGE COLUMN age user_age INT UNSIGNED;

# 删除用户年龄列
ALTER TABLE users DROP COLUMN user_age;

# 将用户表重命名为客户表
ALTER TABLE users RENAME TO customers;

DROP TABLE - 删除表

语法

sql
DROP TABLE [IF EXISTS] 表名 [, 表名]...;

示例

sql
# 删除用户表
DROP TABLE users;

# 带条件删除用户表(如果存在则删除)
DROP TABLE IF EXISTS users;

# 同时删除多个表
DROP TABLE IF EXISTS users, orders;

SHOW TABLES - 显示表列表

语法

sql
SHOW TABLES [FROM 数据库名] [LIKE '匹配模式'];

示例

sql
# 显示当前数据库的所有表
SHOW TABLES;

# 显示指定数据库的所有表
SHOW TABLES FROM mydatabase;

# 显示名称以user开头的表
SHOW TABLES LIKE 'user%';

数据操作命令

INSERT - 插入数据

语法

sql
INSERT [INTO] 表名 [(列1, 列2, ...)]
    VALUES (值1, 值2, ...),
           (值1, 值2, ...),
           ...;

INSERT [INTO] 表名 [(列1, 列2, ...)]
    SELECT 列1, 列2, ...
    FROM 其他表
    [WHERE 条件];

示例

sql
# 插入单行数据
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');

# 插入多行数据
INSERT INTO users (username, email) VALUES
    ('john', 'john@example.com'),
    ('jane', 'jane@example.com'),
    ('bob', 'bob@example.com');

# 从其他表插入数据到备份表
INSERT INTO users_backup (username, email) SELECT username, email FROM users;

UPDATE - 更新数据

语法

sql
UPDATE 表名
SET 列1 = 值1,
    列2 = 值2,
    ...
[WHERE 条件]
[ORDER BY 列名]
[LIMIT 行数];

示例

sql
# 更新单行数据
UPDATE users SET email = 'newemail@example.com' WHERE id = 1;

# 更新多行数据,将长时间未登录的用户设为非活跃状态
UPDATE users SET status = 'inactive' WHERE last_login < '2023-01-01';

# 带LIMIT的更新,只更新10个非活跃用户为活跃状态
UPDATE users SET status = 'active' WHERE status = 'inactive' LIMIT 10;

DELETE - 删除数据

语法

sql
DELETE FROM 表名
[WHERE 条件]
[ORDER BY 列名]
[LIMIT 行数];

示例

sql
# 删除单行数据
DELETE FROM users WHERE id = 1;

# 删除多行数据,删除长时间未登录的用户
DELETE FROM users WHERE last_login < '2023-01-01';

# 带LIMIT的删除,只删除10个非活跃用户
DELETE FROM users WHERE status = 'inactive' LIMIT 10;

SELECT - 查询数据

语法

sql
SELECT [DISTINCT] 选择表达式 [, 选择表达式]...
    FROM 表引用
    [WHERE 条件]
    [GROUP BY {列名 | 表达式 | 位置} [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING 条件]
    [ORDER BY {列名 | 表达式 | 位置} [ASC | DESC], ...]
    [LIMIT {[偏移量,] 行数 | 行数 OFFSET 偏移量}]
    [FOR UPDATE | LOCK IN SHARE MODE];

示例

sql
# 查询所有用户数据
SELECT * FROM users;

# 查询活跃用户的用户名和邮箱
SELECT username, email FROM users WHERE status = 'active';

# 按创建时间倒序查询用户名和创建时间
SELECT username, created_at FROM users ORDER BY created_at DESC;

# 分页查询,从第20条记录开始,查询10条
SELECT username, email FROM users LIMIT 10 OFFSET 20;

# 按状态分组统计用户数量
SELECT status, COUNT(*) as count FROM users GROUP BY status;

# 按状态分组统计用户数量,只显示数量大于10的状态
SELECT status, COUNT(*) as count FROM users GROUP BY status HAVING count > 10;

索引管理命令

CREATE INDEX - 创建索引

语法

sql
CREATE [UNIQUE] INDEX 索引名
    ON 表名 (列1 [ASC | DESC], 列2 [ASC | DESC], ...);

CREATE [UNIQUE] INDEX 索引名
    ON 表名 ((表达式));

示例

sql
# 创建普通索引
CREATE INDEX idx_users_email ON users(email);

# 创建唯一索引
CREATE UNIQUE INDEX idx_users_username ON users(username);

# 创建复合索引
CREATE INDEX idx_users_status_created ON users(status, created_at DESC);

# 创建表达式索引(MySQL 8.0+
CREATE INDEX idx_users_email_domain ON users((SUBSTRING_INDEX(email, '@', -1)));

DROP INDEX - 删除索引

语法

sql
DROP INDEX 索引名 ON 表名;

示例

sql
# 删除索引
DROP INDEX idx_users_email ON users;

SHOW INDEX - 显示索引

语法

sql
SHOW INDEX FROM 表名 [FROM 数据库名];

示例

sql
# 显示表的所有索引
SHOW INDEX FROM users;

# 显示指定数据库表的所有索引
SHOW INDEX FROM mydatabase.users;

事务管理命令

START TRANSACTION - 开始事务

语法

sql
START TRANSACTION | BEGIN [WORK];

示例

sql
# 开始事务
START TRANSACTION;

# 或使用BEGIN关键字开始事务
BEGIN;

COMMIT - 提交事务

语法

sql
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE];

示例

sql
# 提交事务,将所有更改永久保存到数据库
COMMIT;

ROLLBACK - 回滚事务

语法

sql
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE];

示例

sql
# 回滚事务,取消所有未提交的更改
ROLLBACK;

SAVEPOINT - 创建保存点

语法

sql
SAVEPOINT 保存点名称;

示例

sql
# 创建一个名为my_savepoint的保存点
SAVEPOINT my_savepoint;

ROLLBACK TO SAVEPOINT - 回滚到保存点

语法

sql
ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;

示例

sql
# 回滚到指定保存点,取消保存点之后的所有更改
ROLLBACK TO SAVEPOINT my_savepoint;

RELEASE SAVEPOINT - 释放保存点

语法

sql
RELEASE SAVEPOINT 保存点名称;

示例

sql
# 释放指定的保存点
RELEASE SAVEPOINT my_savepoint;

常用系统命令

SHOW STATUS - 显示状态变量

语法

sql
SHOW [GLOBAL | SESSION] STATUS [LIKE '匹配模式'];

示例

sql
# 显示全局状态变量
SHOW GLOBAL STATUS;

# 显示当前会话的状态变量
SHOW SESSION STATUS;

# 显示名称以Threads开头的全局状态变量
SHOW GLOBAL STATUS LIKE 'Threads%';

SHOW VARIABLES - 显示系统变量

语法

sql
SHOW [GLOBAL | SESSION] VARIABLES [LIKE '匹配模式'];

示例

sql
# 显示全局系统变量
SHOW GLOBAL VARIABLES;

# 显示当前会话的系统变量
SHOW SESSION VARIABLES;

# 显示名称以innodb开头的全局系统变量
SHOW GLOBAL VARIABLES LIKE 'innodb%';

SHOW PROCESSLIST - 显示进程列表

语法

sql
SHOW [FULL] PROCESSLIST;

示例

sql
# 显示当前运行的进程列表
SHOW PROCESSLIST;

# 显示完整的进程列表,包括完整的SQL语句
SHOW FULL PROCESSLIST;

SHOW ENGINE - 显示存储引擎状态

语法

sql
SHOW ENGINE 存储引擎名 {STATUS | MUTEX | INNODB STATUS};

示例

sql
# 显示InnoDB存储引擎的详细状态
SHOW ENGINE INNODB STATUS;

# 显示MyISAM存储引擎的状态
SHOW ENGINE MYISAM STATUS;

KILL - 杀死进程

语法

sql
KILL [CONNECTION | QUERY] 进程ID;

示例

sql
# 杀死指定ID的连接
KILL 123;

# 或使用CONNECTION关键字杀死连接
KILL CONNECTION 123;

# 只杀死指定ID的查询,但保留连接
KILL QUERY 123;

版本差异

MySQL 5.6 vs 5.7 vs 8.0

  1. JSON支持

    • MySQL 5.6:不支持JSON类型
    • MySQL 5.7:引入JSON类型和JSON函数
    • MySQL 8.0:增强JSON支持,添加更多JSON函数
  2. 窗口函数

    • MySQL 5.6/5.7:不支持窗口函数
    • MySQL 8.0:引入窗口函数
  3. CTE(Common Table Expressions)

    • MySQL 5.6/5.7:不支持CTE
    • MySQL 8.0:引入CTE
  4. 表达式索引

    • MySQL 5.6/5.7:不支持表达式索引
    • MySQL 8.0:支持表达式索引
  5. 角色管理

    • MySQL 5.6/5.7:不支持角色
    • MySQL 8.0:引入角色管理
  6. 密码验证插件

    • MySQL 5.6:简单密码验证
    • MySQL 5.7:引入validate_password插件
    • MySQL 8.0:增强密码验证,默认启用validate_password组件
  7. utf8mb4支持

    • MySQL 5.6:支持utf8mb4,但默认字符集为utf8
    • MySQL 5.7:默认字符集为utf8mb4
    • MySQL 8.0:默认字符集为utf8mb4,增强utf8mb4支持

常见问题(FAQ)

Q1: 如何查看MySQL命令的完整帮助?

A1: 可以使用以下命令查看MySQL命令的完整帮助:

bash
# 查看mysql命令帮助
mysql --help

# 查看mysqladmin命令帮助
mysqladmin --help

# 查看mysqldump命令帮助
mysqldump --help

Q2: 如何在MySQL中执行多行命令?

A2: 在MySQL客户端中,可以直接输入多行命令,以分号(;)结束命令。例如:

sql
SELECT 
    column1,
    column2,
    column3
FROM 
    table_name
WHERE 
    condition1
    AND condition2
ORDER BY 
    column1 DESC;

Q3: 如何在MySQL客户端中取消正在输入的命令?

A3: 在MySQL客户端中,可以使用\cCtrl+C取消正在输入的命令。

Q4: 如何执行存储在文件中的SQL命令?

A4: 可以使用以下方法执行存储在文件中的SQL命令:

bash
# 使用mysql命令
mysql -u root -p database_name < script.sql

# 在MySQL客户端中使用source命令
mysql> source /path/to/script.sql;

# 或使用\.命令
mysql> \. /path/to/script.sql;

Q5: 如何查看当前MySQL客户端的版本?

A5: 可以使用以下命令查看当前MySQL客户端的版本:

bash
mysql --version

# 或在MySQL客户端中
mysql> SELECT VERSION();

Q6: 如何在MySQL中执行系统命令?

A6: 在MySQL客户端中,可以使用\!命令执行系统命令:

sql
mysql> \! ls -la;
mysql> \! pwd;

Q7: 如何修改MySQL客户端的提示符?

A7: 可以使用以下命令修改MySQL客户端的提示符:

sql
# 修改提示符为当前数据库名
mysql> prompt \d> 

# 修改提示符为当前用户名@主机名:数据库名>
mysql> prompt \u@\h:\d>

# 恢复默认提示符
mysql> prompt

Q8: 如何在MySQL中查看表的结构?

A8: 可以使用以下命令查看表的结构:

sql
# 使用DESCRIBE命令
DESCRIBE table_name;

# 或使用DESC命令
DESC table_name;

# 显示完整的表结构
SHOW CREATE TABLE table_name;

Q9: 如何在MySQL中查看当前用户?

A9: 可以使用以下命令查看当前用户:

sql
SELECT USER();

# 或
SELECT CURRENT_USER();

Q10: 如何在MySQL中查看当前数据库?

A10: 可以使用以下命令查看当前数据库:

sql
SELECT DATABASE();

# 或在MySQL客户端中使用\d命令
mysql> \d