MySQL常用命令完整指南
前言:
MySQL常用命令的集合,方便查询和使用
,
- 平时大量的使用navicat、DBeaver类的工具给我胃口养刁了,有时候切换到服务器上去使用命令操作数据库,有些命令就忘了
- 所以总结了一下,方便记忆与查询
目录概要
- 1. 数据库连接和管理
- 2. 数据库操作命令
- 3. 数据表操作命令
- 4. 数据查询命令
- 5. 数据修改命令
- 6. 索引管理命令
- 7. 用户权限管理
- 8. 备份与恢复
- 9. 性能优化命令
- 10. 系统信息查看
- 11. MySQL操作流程图
1. 数据库连接和管理
1.1 连接MySQL服务器
命令格式:
mysql -h [主机名] -P [端口号] -u [用户名] -p[密码] [数据库名]
重要参数:
-h
: 指定主机名(默认localhost)-P
: 指定端口号(默认3306)-u
: 指定用户名-p
: 提示输入密码(注意p后面不要有空格)-D
: 指定默认数据库
代码示例:
# 连接本地MySQL
mysql -u root -p# 连接远程MySQL
mysql -h 192.168.1.100 -P 3306 -u admin -p# 连接并指定数据库
mysql -u root -p -D mydb
1.2 退出MySQL
-- 方式一
EXIT;-- 方式二
QUIT;-- 方式三
\q
2. 数据库操作命令
2.1 查看数据库
-- 显示所有数据库
SHOW DATABASES;-- 显示数据库创建语句
SHOW CREATE DATABASE database_name;
2.2 创建数据库
命令格式:
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
代码示例:
-- 创建数据库
CREATE DATABASE mycompany;-- 创建数据库并指定字符集
CREATE DATABASE mycompany
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 避免重复创建
CREATE DATABASE IF NOT EXISTS mycompany;
2.3 选择和删除数据库
-- 选择数据库
USE database_name;-- 删除数据库
DROP DATABASE [IF EXISTS] database_name;-- 示例
USE mycompany;
DROP DATABASE IF EXISTS old_database;
3. 数据表操作命令
3.1 查看表信息
-- 显示当前数据库的所有表
SHOW TABLES;-- 显示表结构
DESC table_name;
-- 或者
DESCRIBE table_name;
-- 或者
SHOW COLUMNS FROM table_name;-- 显示表的创建语句
SHOW CREATE TABLE table_name;-- 显示表的状态信息
SHOW TABLE STATUS LIKE 'table_name';
3.2 创建数据表
命令格式:
CREATE TABLE [IF NOT EXISTS] table_name (column1 datatype [constraints],column2 datatype [constraints],...[PRIMARY KEY (column_name)],[FOREIGN KEY (column_name) REFERENCES other_table(column_name)]
) [ENGINE=storage_engine] [CHARACTER SET charset];
重要数据类型:
INT(size)
: 整数类型VARCHAR(size)
: 可变长字符串CHAR(size)
: 固定长字符串TEXT
: 长文本DATE
: 日期 (YYYY-MM-DD)DATETIME
: 日期时间 (YYYY-MM-DD HH:MM:SS)TIMESTAMP
: 时间戳DECIMAL(p,s)
: 精确小数
重要约束:
NOT NULL
: 非空约束UNIQUE
: 唯一约束PRIMARY KEY
: 主键约束FOREIGN KEY
: 外键约束AUTO_INCREMENT
: 自动递增DEFAULT value
: 默认值
代码示例:
-- 创建用户表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL,password VARCHAR(255) NOT NULL,age INT DEFAULT 0,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);-- 创建订单表
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,product_name VARCHAR(100) NOT NULL,quantity INT DEFAULT 1,price DECIMAL(10,2) NOT NULL,order_date DATE NOT NULL,FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB CHARACTER SET utf8mb4;
3.3 修改表结构
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name datatype [constraints];-- 修改列
ALTER TABLE table_name MODIFY COLUMN column_name new_datatype;-- 重命名列
ALTER TABLE table_name CHANGE old_column_name new_column_name datatype;-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;-- 重命名表
ALTER TABLE old_table_name RENAME TO new_table_name;-- 示例
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN age TINYINT;
ALTER TABLE users CHANGE age user_age INT;
ALTER TABLE users DROP COLUMN phone;
3.4 删除表
-- 删除表
DROP TABLE [IF EXISTS] table_name;-- 清空表数据但保留结构
TRUNCATE TABLE table_name;-- 示例
DROP TABLE IF EXISTS temp_table;
TRUNCATE TABLE logs;
4. 数据查询命令
4.1 基本SELECT语句
命令格式:
SELECT [DISTINCT] column1, column2, ...
FROM table_name
[WHERE condition]
[GROUP BY column_name]
[HAVING condition]
[ORDER BY column_name [ASC|DESC]]
[LIMIT offset, count];
代码示例:
-- 查询所有数据
SELECT * FROM users;-- 查询指定列
SELECT username, email FROM users;-- 条件查询
SELECT * FROM users WHERE age > 18;-- 模糊查询
SELECT * FROM users WHERE username LIKE 'john%';-- 范围查询
SELECT * FROM users WHERE age BETWEEN 18 AND 65;-- 多条件查询
SELECT * FROM users
WHERE age > 18 AND email LIKE '%@gmail.com';-- 去重查询
SELECT DISTINCT age FROM users;-- 排序查询
SELECT * FROM users ORDER BY created_at DESC;-- 限制查询结果数量
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10, 20; -- 跳过前10条,取20条
4.2 聚合函数
-- 统计函数
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT age) FROM users;
SELECT MAX(age), MIN(age), AVG(age) FROM users;
SELECT SUM(price) FROM orders;-- 分组查询
SELECT age, COUNT(*) as user_count
FROM users
GROUP BY age;-- 分组后过滤
SELECT age, COUNT(*) as user_count
FROM users
GROUP BY age
HAVING COUNT(*) > 5;
4.3 连接查询
-- 内连接
SELECT u.username, o.product_name, o.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id;-- 左连接
SELECT u.username, o.product_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;-- 右连接
SELECT u.username, o.product_name
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;-- 全外连接(MySQL中使用UNION模拟)
SELECT u.username, o.product_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.username, o.product_name
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
4.4 子查询
-- 简单子查询
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders);-- EXISTS子查询
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);-- 标量子查询
SELECT username, (SELECT COUNT(*) FROM orders WHERE user_id = users.id) as order_count
FROM users;
5. 数据修改命令
5.1 插入数据
命令格式:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
代码示例:
-- 插入单条记录
INSERT INTO users (username, email, age)
VALUES ('john_doe', 'john@example.com', 25);-- 插入多条记录
INSERT INTO users (username, email, age) VALUES
('alice', 'alice@example.com', 28),
('bob', 'bob@example.com', 32),
('charlie', 'charlie@example.com', 24);-- 插入查询结果
INSERT INTO users_backup (username, email)
SELECT username, email FROM users WHERE age > 30;-- 忽略重复插入
INSERT IGNORE INTO users (username, email, age)
VALUES ('existing_user', 'existing@example.com', 25);-- 存在则更新,不存在则插入
INSERT INTO users (username, email, age)
VALUES ('john_doe', 'john_new@example.com', 26)
ON DUPLICATE KEY UPDATE
email = VALUES(email), age = VALUES(age);
5.2 更新数据
命令格式:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
代码示例:
-- 更新单个字段
UPDATE users SET age = 26 WHERE username = 'john_doe';-- 更新多个字段
UPDATE users
SET email = 'newemail@example.com', age = age + 1
WHERE id = 1;-- 条件更新
UPDATE users SET age = age + 1 WHERE age < 30;-- 连接更新
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.last_order_date = o.order_date
WHERE o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.user_id = u.id
);
5.3 删除数据
命令格式:
DELETE FROM table_name WHERE condition;
代码示例:
-- 删除特定记录
DELETE FROM users WHERE age < 18;-- 删除所有记录(保留表结构)
DELETE FROM temp_table;-- 连接删除
DELETE u FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.order_date < '2023-01-01';-- 限制删除数量
DELETE FROM logs ORDER BY created_at ASC LIMIT 1000;
6. 索引管理命令
6.1 创建索引
-- 创建普通索引
CREATE INDEX idx_username ON users(username);-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);-- 创建复合索引
CREATE INDEX idx_age_email ON users(age, email);-- 创建全文索引
CREATE FULLTEXT INDEX idx_content ON articles(title, content);-- 在表创建时添加索引
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),category_id INT,price DECIMAL(10,2),INDEX idx_category (category_id),INDEX idx_price (price)
);
6.2 查看和删除索引
-- 查看表的索引
SHOW INDEX FROM table_name;-- 删除索引
DROP INDEX index_name ON table_name;-- 示例
SHOW INDEX FROM users;
DROP INDEX idx_username ON users;
7. 用户权限管理
7.1 用户管理
-- 创建用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password';-- 修改用户密码
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';-- 删除用户
DROP USER 'username'@'host';-- 查看用户
SELECT user, host FROM mysql.user;-- 示例
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'secure_password';
CREATE USER 'readonly'@'%' IDENTIFIED BY 'readonly_pass';
7.2 权限管理
-- 授予权限
GRANT privileges ON database.table TO 'username'@'host';-- 回收权限
REVOKE privileges ON database.table FROM 'username'@'host';-- 查看权限
SHOW GRANTS FOR 'username'@'host';-- 刷新权限
FLUSH PRIVILEGES;-- 示例
-- 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'webuser'@'localhost';-- 授予选择和插入权限
GRANT SELECT, INSERT ON mydb.users TO 'readonly'@'%';-- 授予特定表的权限
GRANT UPDATE(email, age) ON mydb.users TO 'limited_user'@'localhost';
8. 备份与恢复
8.1 使用mysqldump备份
# 备份单个数据库
mysqldump -u username -p database_name > backup.sql# 备份单个表
mysqldump -u username -p database_name table_name > table_backup.sql# 备份多个数据库
mysqldump -u username -p --databases db1 db2 > multiple_backup.sql# 备份所有数据库
mysqldump -u username -p --all-databases > all_backup.sql# 备份时添加额外选项
mysqldump -u username -p --single-transaction --routines --triggers database_name > backup.sql
8.2 恢复数据
# 恢复数据库
mysql -u username -p database_name < backup.sql# 在MySQL中执行SQL文件
mysql> SOURCE /path/to/backup.sql;
9. 性能优化命令
9.1 查询执行计划
-- 分析查询执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;-- 详细执行计划
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 25;-- 分析表
ANALYZE TABLE table_name;-- 优化表
OPTIMIZE TABLE table_name;
9.2 性能监控
-- 显示进程列表
SHOW PROCESSLIST;-- 显示状态变量
SHOW STATUS;
SHOW GLOBAL STATUS LIKE 'Connections';-- 显示系统变量
SHOW VARIABLES;
SHOW VARIABLES LIKE 'max_connections';-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
10. 系统信息查看
10.1 服务器信息
-- 查看MySQL版本
SELECT VERSION();-- 查看当前用户
SELECT USER();-- 查看当前数据库
SELECT DATABASE();-- 查看服务器状态
SHOW STATUS;-- 查看引擎信息
SHOW ENGINES;-- 查看字符集
SHOW CHARACTER SET;-- 查看排序规则
SHOW COLLATION;
10.2 连接和配置信息
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';-- 查看表大小
SELECT table_name,ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size in MB'
FROM information_schema.tables
WHERE table_schema = 'database_name';
11. MySQL操作流程图
总结
这份指南涵盖了MySQL的核心操作命令,从基础的连接和数据库管理,到高级的性能优化和权限管理。每个部分都包含了:
- 清晰的命令格式:标准化的语法结构
- 重要参数说明:关键参数的作用和用法
- 实用代码示例:真实场景中的应用
- 最佳实践建议:提高效率和安全性的技巧
通过流程图可以清楚地看到MySQL操作的整体流程,从连接到各种数据库操作的逻辑关系。建议根据实际需求选择相应的命令,并在实践中逐步掌握这些技能。
记住:
- 总是在生产环境中谨慎操作
- 定期备份重要数据
- 为敏感操作设置适当的权限
- 使用EXPLAIN分析查询性能
- 保持数据库和索引的优化