MySQL的常用命令

目录

    • [1. 连接MySQL数据库](#1. 连接MySQL数据库)
    • [2. 数据库操作](#2. 数据库操作)
      • [2.1 查看数据库](#2.1 查看数据库)
      • [2.2 创建数据库](#2.2 创建数据库)
      • [2.3 删除数据库](#2.3 删除数据库)
    • [3. 表操作](#3. 表操作)
      • [3.1 查看表信息](#3.1 查看表信息)
      • [3.2 创建表](#3.2 创建表)
      • [3.3 常用数据类型](#3.3 常用数据类型)
      • [3.4 修改表结构](#3.4 修改表结构)
      • [3.5 删除表](#3.5 删除表)
    • [4. 数据操作 (CRUD)](#4. 数据操作 (CRUD))
      • [4.1 插入数据 (CREATE)](#4.1 插入数据 (CREATE))
      • [4.2 查询数据 (READ)](#4.2 查询数据 (READ))
      • [4.3 更新数据 (UPDATE)](#4.3 更新数据 (UPDATE))
      • [4.4 删除数据 (DELETE)](#4.4 删除数据 (DELETE))
    • [5. 高级查询](#5. 高级查询)
    • [6. 索引操作](#6. 索引操作)
      • [6.1 创建索引](#6.1 创建索引)
      • [6.2 查看索引](#6.2 查看索引)
      • [6.3 删除索引](#6.3 删除索引)
    • [7. 用户和权限管理](#7. 用户和权限管理)
    • [8. 常用函数](#8. 常用函数)
      • [8.1 字符串函数](#8.1 字符串函数)
      • [8.2 数值函数](#8.2 数值函数)
      • [8.3 日期时间函数](#8.3 日期时间函数)
      • [8.4 条件函数](#8.4 条件函数)
      • [8.5 聚合函数](#8.5 聚合函数)
    • [9. 事务处理](#9. 事务处理)
      • [9.1 事务基础](#9.1 事务基础)
      • [9.2 事务示例](#9.2 事务示例)
      • [9.3 保存点 (Savepoint)](#9.3 保存点 (Savepoint))
      • [9.4 事务隔离级别](#9.4 事务隔离级别)
    • [10. 备份和恢复](#10. 备份和恢复)
      • [10.1 使用 mysqldump 备份](#10.1 使用 mysqldump 备份)
      • [10.2 恢复数据库](#10.2 恢复数据库)
      • [10.3 二进制日志备份](#10.3 二进制日志备份)

1. 连接MySQL数据库

基本连接语法

bash 复制代码
# 本地连接
mysql -u root -p

# 远程连接
mysql -h hostname -u root -p demo

# 指定端口连接
mysql -h hostname -P 3306 -u root -p demo

连接参数说明

  • -u: 用户名
  • -p: 密码(会提示输入)
  • -h: 主机名或IP地址
  • -P: 端口号(默认3306)

2. 数据库操作

2.1 查看数据库

sql 复制代码
-- 显示所有数据库
SHOW DATABASES;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)


-- 使用特定数据库
USE mysql;

mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed


-- 显示当前使用的数据库
SELECT DATABASE();

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

2.2 创建数据库

sql 复制代码
-- 基本创建
CREATE DATABASE shop;

-- 创建时指定字符集
CREATE DATABASE IF NOT EXISTS shop 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_general_ci;

mysql> CREATE DATABASE IF NOT EXISTS shop 
    -> CHARACTER SET utf8mb4 
    -> COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shop               |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

2.3 删除数据库

sql 复制代码
-- 删除数据库
DROP DATABASE shop;

-- 安全删除(如果存在才删除)
DROP DATABASE IF EXISTS shop;

3. 表操作

3.1 查看表信息

sql 复制代码
-- 显示当前数据库中的所有表
SHOW TABLES;

-- 查看表结构
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;

-- 查看建表语句
SHOW CREATE TABLE table_name;

-- 查看表状态信息
SHOW TABLE STATUS LIKE 'table_name';

3.2 创建表

sql 复制代码
-- 基本建表语法
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,
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

mysql> use shop;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> 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,
    ->     is_active BOOLEAN DEFAULT TRUE,
    ->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_shop |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

3.3 常用数据类型

类型 说明 示例
INT 整数 age INT
VARCHAR(n) 可变长度字符串 name VARCHAR(50)
TEXT 长文本 description TEXT
DECIMAL(m,d) 精确小数 price DECIMAL(10,2)
DATE 日期 birth_date DATE
DATETIME 日期时间 created_at DATETIME
TIMESTAMP 时间戳 updated_at TIMESTAMP
BOOLEAN 布尔值 is_active BOOLEAN

3.4 修改表结构

sql 复制代码
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name data_type;
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE users DROP COLUMN phone;

-- 修改列数据类型
ALTER TABLE table_name MODIFY COLUMN column_name new_data_type;
ALTER TABLE users MODIFY COLUMN age SMALLINT;

-- 重命名列
ALTER TABLE table_name CHANGE old_name new_name data_type;
ALTER TABLE users CHANGE username user_name VARCHAR(50);

-- 重命名表
RENAME TABLE old_table_name TO new_table_name;

-- 添加主键
ALTER TABLE table_name ADD PRIMARY KEY (column_name);

-- 添加外键
ALTER TABLE table_name ADD FOREIGN KEY (column_name) 
REFERENCES other_table(column_name);


mysql> DESC users;
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| Field      | Type         | Null | Key | Default           | Extra                                         |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
| id         | int          | NO   | PRI | NULL              | auto_increment                                |
| user_name  | varchar(50)  | YES  | UNI | NULL              |                                               |
| email      | varchar(100) | NO   |     | NULL              |                                               |
| password   | varchar(255) | NO   |     | NULL              |                                               |
| age        | smallint     | YES  |     | NULL              |                                               |
| is_active  | tinyint(1)   | YES  |     | 1                 |                                               |
| created_at | timestamp    | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED                             |
| updated_at | timestamp    | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+------------+--------------+------+-----+-------------------+-----------------------------------------------+
8 rows in set (0.00 sec)

3.5 删除表

sql 复制代码
-- 删除表
DROP TABLE table_name;

-- 安全删除
DROP TABLE IF EXISTS table_name;

-- 删除多个表
DROP TABLE table1, table2, table3;

4. 数据操作 (CRUD)

4.1 插入数据 (CREATE)

sql 复制代码
-- 插入单行数据
INSERT INTO users (user_name, email, password) 
VALUES ('john_doe', 'john@example.com', 'hashed_password');

mysql> INSERT INTO users (user_name, email, password) 
    -> VALUES ('john_doe', 'john@example.com', 'hashed_password');
Query OK, 1 row affected (0.00 sec)


-- 插入多行数据
INSERT INTO users (user_name, email, password) VALUES 
('user1', 'user1@example.com', 'password1'),
('user2', 'user2@example.com', 'password2'),
('user3', 'user3@example.com', 'password3');

-- 插入并忽略重复
INSERT IGNORE INTO users (user_name, email) 
VALUES ('existing_user', 'existing@example.com');

-- 插入或更新(如果存在则更新)
INSERT INTO users (id, user_name, email, password)
VALUES (1, 'john', 'john@example.com', 'hashed_password')
ON DUPLICATE KEY UPDATE email = VALUES(email);

mysql> INSERT INTO users (id, user_name, email, password)
    -> VALUES (1, 'john', 'john@example.com', 'hashed_password')
    -> ON DUPLICATE KEY UPDATE email = VALUES(email);
Query OK, 0 rows affected, 1 warning (0.00 sec)

4.2 查询数据 (READ)

基本查询
sql 复制代码
-- 查询所有列
SELECT * FROM users;

mysql> SELECT * FROM users;
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name     | email                | password        | age  | is_active | created_at          | updated_at          |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
|  1 | john_doe      | john@example.com     | hashed_password | NULL |         1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
|  2 | user1         | user1@example.com    | password1       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  3 | user2         | user2@example.com    | password2       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  4 | user3         | user3@example.com    | password3       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  5 | existing_user | existing@example.com |                 | NULL |         1 | 2025-09-04 16:23:08 | 2025-09-04 16:23:08 |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
5 rows in set (0.00 sec)

-- 查询指定列
SELECT user_name, email FROM users;

mysql> SELECT user_name, email FROM users;
+---------------+----------------------+
| user_name     | email                |
+---------------+----------------------+
| john_doe      | john@example.com     |
| user1         | user1@example.com    |
| user2         | user2@example.com    |
| user3         | user3@example.com    |
| existing_user | existing@example.com |
+---------------+----------------------+
5 rows in set (0.00 sec)


-- 去重查询
SELECT DISTINCT email FROM users;

mysql> SELECT DISTINCT email FROM users;
+----------------------+
| email                |
+----------------------+
| john@example.com     |
| user1@example.com    |
| user2@example.com    |
| user3@example.com    |
| existing@example.com |
+----------------------+
5 rows in set (0.00 sec)
条件查询
sql 复制代码
-- 等值查询
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE user_name = 'john_doe';

mysql> SELECT * FROM users WHERE id = 1;
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email            | password        | age  | is_active | created_at          | updated_at          |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
|  1 | john_doe  | john@example.com | hashed_password | NULL |         1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users WHERE user_name = 'john_doe';
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email            | password        | age  | is_active | created_at          | updated_at          |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
|  1 | john_doe  | john@example.com | hashed_password | NULL |         1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)


-- 比较查询
SELECT * FROM users WHERE age = NULL;

-- 模糊查询
SELECT * FROM users WHERE user_name LIKE 'john%';
SELECT * FROM users WHERE email LIKE '%@gmail.com';

mysql> SELECT * FROM users WHERE user_name LIKE 'john%';
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name | email            | password        | age  | is_active | created_at          | updated_at          |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
|  1 | john_doe  | john@example.com | hashed_password | NULL |         1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
+----+-----------+------------------+-----------------+------+-----------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users WHERE email LIKE '%@example.com';
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
| id | user_name     | email                | password        | age  | is_active | created_at          | updated_at          |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
|  1 | john_doe      | john@example.com     | hashed_password | NULL |         1 | 2025-09-04 16:20:58 | 2025-09-04 16:20:58 |
|  2 | user1         | user1@example.com    | password1       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  3 | user2         | user2@example.com    | password2       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  4 | user3         | user3@example.com    | password3       | NULL |         1 | 2025-09-04 16:22:58 | 2025-09-04 16:22:58 |
|  5 | existing_user | existing@example.com |                 | NULL |         1 | 2025-09-04 16:23:08 | 2025-09-04 16:23:08 |
+----+---------------+----------------------+-----------------+------+-----------+---------------------+---------------------+
5 rows in set (0.00 sec)


-- 多条件查询
SELECT * FROM users WHERE age > 18 AND is_active = TRUE;
SELECT * FROM users WHERE user_name = 'john' OR email = 'john@example.com';

-- 空值查询
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE phone IS NOT NULL;

-- 范围查询
SELECT * FROM users WHERE id IN (1, 2, 3, 4, 5);
SELECT * FROM users WHERE user_name NOT IN ('admin', 'root');
排序和分页
sql 复制代码
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY age ASC, username DESC;

-- 分页
SELECT * FROM users LIMIT 10;                    -- 前10条
SELECT * FROM users LIMIT 10 OFFSET 20;          -- 跳过20条,取10条
SELECT * FROM users LIMIT 20, 10;                -- MySQL特有语法,跳过20条,取10条
聚合查询
sql 复制代码
-- 统计函数
SELECT COUNT(*) FROM users;                       -- 总记录数
SELECT COUNT(phone) FROM users;                   -- 非空phone字段数
SELECT MAX(age), MIN(age), AVG(age) FROM users;   -- 最大、最小、平均年龄
SELECT SUM(age) FROM users;                       -- 年龄总和

-- 分组统计
SELECT age, COUNT(*) as count FROM users GROUP BY age;
SELECT DATE(created_at) as date, COUNT(*) as daily_users 
FROM users 
GROUP BY DATE(created_at)
ORDER BY date DESC;

-- 分组过滤
SELECT age, COUNT(*) as count 
FROM users 
GROUP BY age 
HAVING count > 5;

4.3 更新数据 (UPDATE)

sql 复制代码
-- 更新单个字段
UPDATE users SET email = 'newemail@example.com' WHERE id = 1;

-- 更新多个字段
UPDATE users SET 
    email = 'updated@example.com',
    age = 25,
    updated_at = CURRENT_TIMESTAMP 
WHERE username = 'john_doe';

-- 批量更新
UPDATE users SET is_active = FALSE WHERE created_at < '2022-01-01';

-- 使用表达式更新
UPDATE users SET age = age + 1 WHERE birthday = CURDATE();

4.4 删除数据 (DELETE)

sql 复制代码
-- 删除特定记录
DELETE FROM users WHERE id = 1;

-- 批量删除
DELETE FROM users WHERE is_active = FALSE;

-- 删除所有数据(保留表结构)
DELETE FROM users;

-- 清空表(更快,重置AUTO_INCREMENT)
TRUNCATE TABLE users;

5. 高级查询

5.1 连接查询 (JOIN)

内连接 (INNER JOIN)
sql 复制代码
-- 基本内连接
SELECT u.username, p.title 
FROM users u 
INNER JOIN posts p ON u.id = p.user_id;

-- 多表连接
SELECT u.username, p.title, c.content
FROM users u
INNER JOIN posts p ON u.id = p.user_id
INNER JOIN comments c ON p.id = c.post_id;
左连接 (LEFT JOIN)
sql 复制代码
-- 左连接(显示所有用户,即使没有发布文章)
SELECT u.username, p.title 
FROM users u 
LEFT JOIN posts p ON u.id = p.user_id;
右连接 (RIGHT JOIN)
sql 复制代码
-- 右连接(显示所有文章,即使用户不存在)
SELECT u.username, p.title 
FROM users u 
RIGHT JOIN posts p ON u.id = p.user_id;
全外连接 (FULL OUTER JOIN)
sql 复制代码
-- MySQL不直接支持FULL OUTER JOIN,需要使用UNION
SELECT u.username, p.title 
FROM users u LEFT JOIN posts p ON u.id = p.user_id
UNION
SELECT u.username, p.title 
FROM users u RIGHT JOIN posts p ON u.id = p.user_id;

5.2 子查询

sql 复制代码
-- 标量子查询
SELECT * FROM users 
WHERE id = (SELECT user_id FROM posts WHERE title = 'My First Post');

-- 列表子查询
SELECT * FROM users 
WHERE id IN (SELECT user_id FROM posts WHERE created_at > '2023-01-01');

-- 相关子查询
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM posts p WHERE p.user_id = u.id);

-- 子查询在FROM中
SELECT avg_age.age_group, COUNT(*) as user_count
FROM (
    SELECT 
        CASE 
            WHEN age < 18 THEN 'Youth'
            WHEN age BETWEEN 18 AND 65 THEN 'Adult'
            ELSE 'Senior'
        END as age_group
    FROM users
) avg_age
GROUP BY avg_age.age_group;

5.3 窗口函数 (MySQL 8.0+)

sql 复制代码
-- ROW_NUMBER()
SELECT username, age, 
       ROW_NUMBER() OVER (ORDER BY age DESC) as rank
FROM users;

-- RANK() 和 DENSE_RANK()
SELECT username, age,
       RANK() OVER (ORDER BY age DESC) as rank,
       DENSE_RANK() OVER (ORDER BY age DESC) as dense_rank
FROM users;

-- 分区窗口函数
SELECT username, department, salary,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

5.4 公用表表达式 (CTE) - MySQL 8.0+

sql 复制代码
-- 基本CTE
WITH high_value_users AS (
    SELECT * FROM users WHERE age > 30
)
SELECT username, email FROM high_value_users;

-- 递归CTE
WITH RECURSIVE employee_hierarchy AS (
    SELECT id, name, manager_id, 1 as level
    FROM employees
    WHERE manager_id IS NULL
    
    UNION ALL
    
    SELECT e.id, e.name, e.manager_id, eh.level + 1
    FROM employees e
    INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

6. 索引操作

6.1 创建索引

sql 复制代码
-- 普通索引
CREATE INDEX idx_username ON users (username);

-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users (email);

-- 复合索引
CREATE INDEX idx_name_age ON users (username, age);

-- 前缀索引
CREATE INDEX idx_email_prefix ON users (email(10));

-- 在创建表时添加索引
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    INDEX idx_username (username),
    UNIQUE INDEX idx_email (email)
);

6.2 查看索引

sql 复制代码
-- 查看表的所有索引
SHOW INDEX FROM users;

-- 查看索引使用情况
EXPLAIN SELECT * FROM users WHERE username = 'john';

6.3 删除索引

sql 复制代码
-- 删除索引
DROP INDEX idx_username ON users;

-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;

7. 用户和权限管理

7.1 用户管理基础

查看当前用户信息
sql 复制代码
-- 查看当前用户
SELECT USER();

-- 查看当前用户的权限
SHOW GRANTS;

-- 以root用户身份查看所有权限
SHOW GRANTS FOR 'root'@'localhost';
用户信息查询
sql 复制代码
-- 切换到mysql系统数据库
USE mysql;

-- 查看user表的结构
DESC user;

-- 查看user表的主要字段
SELECT HOST, USER, authentication_string FROM user;

-- 查看所有用户
SELECT Host, User FROM mysql.user;

-- 查看当前数据库的所有用户
SELECT DISTINCT User FROM mysql.user;

-- 查看特定用户的详细信息
SELECT Host, User, authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv 
FROM mysql.user 
WHERE User = 'root';

-- 使用show命令查看用户权限
SHOW GRANTS FOR 'root'@'localhost';

7.2 创建用户

基本语法
sql 复制代码
-- 基本创建用户语法
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

-- 完整语法
CREATE USER [IF NOT EXISTS] '用户名'@'主机名'        -- 创建用户,如果已存在则忽略
IDENTIFIED BY '密码'                                -- 设置用户密码(默认使用 caching_sha2_password 插件)

[IDENTIFIED WITH 插件名 BY '密码']                  -- 可选:指定认证插件,如 mysql_native_password

[PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]] -- 密码过期策略
    -- DEFAULT  : 使用系统默认策略
    -- NEVER    : 密码永不过期
    -- INTERVAL N DAY : N 天后密码过期

[ACCOUNT [LOCK | UNLOCK]]                           -- 用户账户状态
    -- LOCK   : 锁定账户,禁止登录
    -- UNLOCK : 解锁账户,允许登录

[DEFAULT ROLE 角色名 [, 角色名] ...]                 -- 设置用户的默认角色

[REQUIRE { NONE | SSL | X509 | CIPHER 'str' | ISSUER 'str' | SUBJECT 'str'}] 
    -- TLS/SSL 登录要求
    -- NONE   : 不要求
    -- SSL    : 必须使用 SSL
    -- X509   : 必须有有效证书
    -- CIPHER/ISSUER/SUBJECT : 指定更严格的证书限制
创建用户时设置密码的加密处理
sql 复制代码
-- 查看默认的加密验证插件
SHOW VARIABLES LIKE 'default_authentication_plugin';

-- 创建用户时指定加密密码验证插件
CREATE USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
创建用户案例
sql 复制代码
-- 创建本地登录用户
CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'local_123';

-- 创建可以在任意主机登录的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'remote_123';

-- 创建只能在特定的IP下登录的用户
CREATE USER 'office_user'@'192.168.1.100' IDENTIFIED BY 'office_123';

-- 创建只能从特定的网段登录的用户
CREATE USER 'dept_user'@'192.168.1.%' IDENTIFIED BY 'dept_123';

-- 创建用户并设置密码永不过期
CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_123456' PASSWORD EXPIRE NEVER;

-- 验证用户创建成功
SELECT host, user FROM mysql.user WHERE user LIKE '%user%';
创建用户时常见报错的解决方法
sql 复制代码
-- 错误1:ERROR 1396 (HY000): Operation CREATE USER failed
-- 原因:用户已经存在
-- 解决方法:使用IF NOT EXISTS或先删除用户
CREATE USER IF NOT EXISTS 'existing_user'@'localhost' IDENTIFIED BY 'password';

-- 错误2:ERROR 1045 (28000): Access denied
-- 原因:当前用户没有CREATE USER权限
-- 解决方法:使用有足够权限的用户(如root)登录

-- 错误3:密码策略不符合要求
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';

-- 创建符合密码策略的用户
CREATE USER 'strong_user'@'localhost' IDENTIFIED BY 'StrongPass123!';

7.3 删除用户

基本语法
sql 复制代码
-- 基本语法
DROP USER '用户名'@'主机名';

-- 删除多个用户
DROP USER '用户1'@'主机1', '用户2'@'主机2';

-- 安全删除(如果用户不存在会报错)
DROP USER IF EXISTS '用户名'@'主机名';
删除用户案例
sql 复制代码
-- 示例1:删除单个用户
DROP USER 'test_user'@'localhost';

-- 示例2:删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'%';

-- 示例3:安全删除用户
DROP USER IF EXISTS 'maybe_not_exist'@'localhost';

-- 示例4:删除所有测试用户
-- 先查询要删除的用户
SELECT CONCAT('DROP USER ''', User, '''@''', Host, ''';') AS drop_command
FROM mysql.user 
WHERE User LIKE 'test_%';

-- 执行生成的删除命令
DROP USER 'test_user1'@'localhost';
DROP USER 'test_user2'@'%';

-- 验证用户删除成功
SELECT Host, User FROM mysql.user WHERE User LIKE 'test_%';

7.4 修改用户密码

基本语法
sql 复制代码
-- 使用ALTER USER(推荐mysql5.7+)
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';

-- 使用SET PASSWORD
SET PASSWORD FOR '用户名'@'主机名' = '新密码';

-- 修改当前用户密码
SET PASSWORD = '新密码';
使用PASSWORD()函数的注意事项
sql 复制代码
-- MySQL5.7以及以下版本(不推荐,已过时)
SET PASSWORD FOR 'user'@'host' = PASSWORD('新密码');

-- MySQL8+以上推荐
ALTER USER 'user'@'host' IDENTIFIED BY '新密码';
修改用户密码示例
sql 复制代码
-- 示例1:root用户修改其他用户密码
ALTER USER 'app_user'@'%' IDENTIFIED BY 'new_strong_password123!';

-- 示例2:用户修改自己的密码
ALTER USER USER() IDENTIFIED BY 'my_new_password123!';

-- 示例3:修改密码并设置过期策略
ALTER USER 'temp_user'@'localhost' 
IDENTIFIED BY 'temp_password123!' 
PASSWORD EXPIRE INTERVAL 30 DAY;

-- 示例4:强制用户下次登录时修改密码
ALTER USER 'new_employee'@'%' 
IDENTIFIED BY 'initial_password123!' 
PASSWORD EXPIRE;

-- 示例5:批量修改密码(生成SQL语句)
SELECT CONCAT('ALTER USER ''', User, '''@''', Host, ''' IDENTIFIED BY ''new_password_', User, ''';') AS alter_command
FROM mysql.user 
WHERE User LIKE 'temp_%';

-- 验证密码修改(通过重新登录测试)
-- mysql -u app_user -p -h localhost

7.5 权限管理

sql 复制代码
-- 授予所有权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.table_name TO 'username'@'localhost';

-- 授予创建权限
GRANT CREATE, DROP ON database_name.* TO 'username'@'localhost';

-- 查看用户权限
SHOW GRANTS FOR 'username'@'localhost';
SHOW GRANTS FOR CURRENT_USER();

-- 撤销权限
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'localhost';
REVOKE SELECT ON database_name.table_name FROM 'username'@'localhost';

-- 刷新权限表
FLUSH PRIVILEGES;

7.6 常用权限类型

权限 说明
ALL PRIVILEGES 所有权限
SELECT 查询权限
INSERT 插入权限
UPDATE 更新权限
DELETE 删除权限
CREATE 创建数据库/表权限
DROP 删除数据库/表权限
ALTER 修改表结构权限
INDEX 创建/删除索引权限
GRANT OPTION 授权权限

8. 常用函数

8.1 字符串函数

sql 复制代码
-- 连接字符串
SELECT CONCAT('Hello', ' ', 'World');
SELECT CONCAT_WS('-', '2023', '12', '25');  -- 使用分隔符连接

-- 字符串长度
SELECT LENGTH('Hello World');               -- 字节长度
SELECT CHAR_LENGTH('Hello World');          -- 字符长度

-- 大小写转换
SELECT UPPER('hello'), LOWER('WORLD');

-- 截取字符串
SELECT SUBSTRING('Hello World', 1, 5);      -- 从位置1开始取5个字符
SELECT LEFT('Hello World', 5);              -- 从左边取5个字符
SELECT RIGHT('Hello World', 5);             -- 从右边取5个字符

-- 去除空格
SELECT TRIM('  Hello World  ');
SELECT LTRIM('  Hello World  ');            -- 去除左边空格
SELECT RTRIM('  Hello World  ');            -- 去除右边空格

-- 替换字符串
SELECT REPLACE('Hello World', 'World', 'MySQL');

-- 查找字符串位置
SELECT LOCATE('World', 'Hello World');

-- 重复字符串
SELECT REPEAT('Hello', 3);

8.2 数值函数

sql 复制代码
-- 绝对值和四舍五入
SELECT ABS(-5), ROUND(3.14159, 2);

-- 向上和向下取整
SELECT CEIL(3.2), FLOOR(3.8);

-- 随机数
SELECT RAND();
SELECT RAND(1);                             -- 使用种子的随机数

-- 数学函数
SELECT SQRT(16), POWER(2, 3);               -- 平方根,幂运算
SELECT MOD(10, 3);                          -- 取余

-- 最大最小值
SELECT GREATEST(1, 5, 3), LEAST(1, 5, 3);

8.3 日期时间函数

sql 复制代码
-- 获取当前时间
SELECT NOW(), CURDATE(), CURTIME();
SELECT CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME;

-- 格式化日期
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');

-- 提取日期部分
SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW());
SELECT HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
SELECT DAYOFWEEK(NOW()), DAYOFYEAR(NOW());

-- 日期计算
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR);
SELECT DATE_SUB(NOW(), INTERVAL 1 WEEK);

-- 日期差值
SELECT DATEDIFF('2023-12-25', '2023-01-01');
SELECT TIMESTAMPDIFF(YEAR, '1990-01-01', NOW());

-- 时间戳转换
SELECT UNIX_TIMESTAMP(NOW());
SELECT FROM_UNIXTIME(1640995200);

8.4 条件函数

sql 复制代码
-- IF函数
SELECT username, IF(age >= 18, '成年', '未成年') as status FROM users;

-- CASE语句
SELECT username,
       CASE 
           WHEN age < 18 THEN '未成年'
           WHEN age BETWEEN 18 AND 65 THEN '成年'
           ELSE '老年'
       END as age_group
FROM users;

-- COALESCE函数(返回第一个非NULL值)
SELECT username, COALESCE(phone, email, '无联系方式') as contact FROM users;

-- NULLIF函数
SELECT NULLIF(age, 0) FROM users;           -- 如果age=0则返回NULL

8.5 聚合函数

sql 复制代码
-- 基本聚合
SELECT COUNT(*), COUNT(phone) FROM users;   -- 总数,非空phone数
SELECT SUM(age), AVG(age) FROM users;       -- 总和,平均值
SELECT MAX(age), MIN(age) FROM users;       -- 最大值,最小值

-- 分组聚合
SELECT department, COUNT(*), AVG(salary)
FROM employees
GROUP BY department;

-- 字符串聚合 (MySQL 5.7+)
SELECT department, GROUP_CONCAT(name) as employees
FROM employees
GROUP BY department;

9. 事务处理

9.1 事务基础

sql 复制代码
-- 开始事务
START TRANSACTION;
-- 或者
BEGIN;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

9.2 事务示例

sql 复制代码
-- 转账示例
START TRANSACTION;

-- 检查账户余额
SELECT balance FROM accounts WHERE account_id = 1;

-- 扣除转出账户金额
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 1;

-- 增加转入账户金额
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 2;

-- 如果一切正常,提交事务
COMMIT;

-- 如果出现错误,回滚事务
-- ROLLBACK;

9.3 保存点 (Savepoint)

sql 复制代码
START TRANSACTION;

INSERT INTO users (username, email) VALUES ('user1', 'user1@example.com');

-- 设置保存点
SAVEPOINT sp1;

INSERT INTO users (username, email) VALUES ('user2', 'user2@example.com');

-- 回滚到保存点
ROLLBACK TO SAVEPOINT sp1;

-- 释放保存点
RELEASE SAVEPOINT sp1;

COMMIT;

9.4 事务隔离级别

sql 复制代码
-- 查看当前隔离级别
SELECT @@transaction_isolation;

-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

10. 备份和恢复

10.1 使用 mysqldump 备份

bash 复制代码
# 备份单个数据库
mysqldump -u username -p database_name > backup.sql

# 备份多个数据库
mysqldump -u username -p --databases db1 db2 db3 > backup.sql

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

# 只备份表结构
mysqldump -u username -p --no-data database_name > structure.sql

# 只备份数据
mysqldump -u username -p --no-create-info database_name > data.sql

# 备份特定表
mysqldump -u username -p database_name table1 table2 > tables_backup.sql

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

10.2 恢复数据库

bash 复制代码
# 恢复数据库
mysql -u username -p database_name < backup.sql

# 恢复压缩备份
gunzip < backup.sql.gz | mysql -u username -p database_name

# 创建数据库并恢复
mysql -u username -p -e "CREATE DATABASE new_database;"
mysql -u username -p new_database < backup.sql

10.3 二进制日志备份

sql 复制代码
-- 查看二进制日志状态
SHOW MASTER STATUS;

-- 查看二进制日志列表
SHOW BINARY LOGS;

-- 刷新日志
FLUSH LOGS;
bash 复制代码
# 使用mysqlbinlog恢复
mysqlbinlog mysql-bin.000001 | mysql -u username -p database_name
相关推荐
FOLLOW ME3113 小时前
MySQL主从复制及进阶配置
数据库·mysql
博一波3 小时前
MySQL 核心文件解析:从配置到存储的 “说明书 + 记录仪” 系统
数据库·mysql
fatiaozhang95273 小时前
中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开启ADB ROOT安卓固件-方法3
android·xml·adb·电脑·电视盒子·刷机固件
TimberWill3 小时前
idea、服务器、数据库环境时区不一致问题
服务器·数据库·intellij-idea
✎﹏赤子·墨筱晗♪3 小时前
基于Nginx实现反向代理、负载均衡与动静分离完整部署指南
运维·nginx·负载均衡
CesareCheung3 小时前
JMeter压测过程中监控服务器CPU及内存的方法
运维·服务器·jmeter
叫我阿柒啊3 小时前
从Java全栈到前端框架的实战之路
java·数据库·微服务·typescript·前端框架·vue3·springboot
蒋星熠3 小时前
WebSocket网络编程深度实践:从协议原理到生产级应用
网络·数据库·redis·python·websocket·网络协议·微服务
傻傻虎虎3 小时前
【Docker】常用帮忙、镜像、容器、其他命令合集(1)
运维·docker·容器