外观
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.sockmysqladmin命令
语法:
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-logsmysqldump命令
语法:
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.gzmysqlimport命令
语法:
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
JSON支持:
- MySQL 5.6:不支持JSON类型
- MySQL 5.7:引入JSON类型和JSON函数
- MySQL 8.0:增强JSON支持,添加更多JSON函数
窗口函数:
- MySQL 5.6/5.7:不支持窗口函数
- MySQL 8.0:引入窗口函数
CTE(Common Table Expressions):
- MySQL 5.6/5.7:不支持CTE
- MySQL 8.0:引入CTE
表达式索引:
- MySQL 5.6/5.7:不支持表达式索引
- MySQL 8.0:支持表达式索引
角色管理:
- MySQL 5.6/5.7:不支持角色
- MySQL 8.0:引入角色管理
密码验证插件:
- MySQL 5.6:简单密码验证
- MySQL 5.7:引入validate_password插件
- MySQL 8.0:增强密码验证,默认启用validate_password组件
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 --helpQ2: 如何在MySQL中执行多行命令?
A2: 在MySQL客户端中,可以直接输入多行命令,以分号(;)结束命令。例如:
sql
SELECT
column1,
column2,
column3
FROM
table_name
WHERE
condition1
AND condition2
ORDER BY
column1 DESC;Q3: 如何在MySQL客户端中取消正在输入的命令?
A3: 在MySQL客户端中,可以使用\c或Ctrl+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> promptQ8: 如何在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