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
相关推荐
好奇的菜鸟8 小时前
Ubuntu 18.04 启用root账户图形界面登录指南
数据库·ubuntu·postgresql
天桥下的卖艺者8 小时前
使用R语言编写一个生成金字塔图形的函数
开发语言·数据库·r语言
Tinyundg8 小时前
Linux系统分区
linux·运维·服务器
要做一个小太阳8 小时前
华为Atlas 900 A3 SuperPoD 超节点网络架构
运维·服务器·网络·华为·架构
江畔何人初8 小时前
service发现
linux·运维·云原生
Facechat8 小时前
鸿蒙开发入坑篇(九):本地数据库 (RDB) 深度解析
数据库·华为·harmonyos
Dxy12393102168 小时前
MySQL删除表语句详解
数据库·mysql
life码农8 小时前
Linux系统清空文件内容的几种方法
linux·运维·chrome
uoKent8 小时前
MySQL常见命令梳理大纲
数据库·mysql
zbguolei8 小时前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu