当前位置: 首页 > news >正文

MySQL的常用命令

目录

    • 1. 连接MySQL数据库
      • 基本连接语法
      • 连接参数说明
    • 2. 数据库操作
      • 2.1 查看数据库
      • 2.2 创建数据库
      • 2.3 删除数据库
    • 3. 表操作
      • 3.1 查看表信息
      • 3.2 创建表
      • 3.3 常用数据类型
      • 3.4 修改表结构
      • 3.5 删除表
    • 4. 数据操作 (CRUD)
      • 4.1 插入数据 (CREATE)
      • 4.2 查询数据 (READ)
        • 基本查询
        • 条件查询
        • 排序和分页
        • 聚合查询
      • 4.3 更新数据 (UPDATE)
      • 4.4 删除数据 (DELETE)
    • 5. 高级查询
      • 5.1 连接查询 (JOIN)
        • 内连接 (INNER JOIN)
        • 左连接 (LEFT JOIN)
        • 右连接 (RIGHT JOIN)
        • 全外连接 (FULL OUTER JOIN)
      • 5.2 子查询
      • 5.3 窗口函数 (MySQL 8.0+)
      • 5.4 公用表表达式 (CTE) - MySQL 8.0+
    • 6. 索引操作
      • 6.1 创建索引
      • 6.2 查看索引
      • 6.3 删除索引
    • 7. 用户和权限管理
      • 7.1 用户管理基础
        • 查看当前用户信息
        • 用户信息查询
      • 7.2 创建用户
        • 基本语法
        • 创建用户时设置密码的加密处理
        • 创建用户案例
        • 创建用户时常见报错的解决方法
      • 7.3 删除用户
        • 基本语法
        • 删除用户案例
      • 7.4 修改用户密码
        • 基本语法
        • 使用PASSWORD()函数的注意事项
        • 修改用户密码示例
      • 7.5 权限管理
      • 7.6 常用权限类型
    • 8. 常用函数
      • 8.1 字符串函数
      • 8.2 数值函数
      • 8.3 日期时间函数
      • 8.4 条件函数
      • 8.5 聚合函数
    • 9. 事务处理
      • 9.1 事务基础
      • 9.2 事务示例
      • 9.3 保存点 (Savepoint)
      • 9.4 事务隔离级别
    • 10. 备份和恢复
      • 10.1 使用 mysqldump 备份
      • 10.2 恢复数据库
      • 10.3 二进制日志备份

1. 连接MySQL数据库

基本连接语法

# 本地连接
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 查看数据库

-- 显示所有数据库
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 -ADatabase changed-- 显示当前使用的数据库
SELECT DATABASE();mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

2.2 创建数据库

-- 基本创建
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 删除数据库

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

3. 表操作

3.1 查看表信息

-- 显示当前数据库中的所有表
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 创建表

-- 基本建表语法
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 修改表结构

-- 添加列
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 删除表

-- 删除表
DROP TABLE table_name;-- 安全删除
DROP TABLE IF EXISTS table_name;-- 删除多个表
DROP TABLE table1, table2, table3;

4. 数据操作 (CRUD)

4.1 插入数据 (CREATE)

-- 插入单行数据
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)

基本查询
-- 查询所有列
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)
条件查询
-- 等值查询
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');
排序和分页
-- 排序
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条
聚合查询
-- 统计函数
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)

-- 更新单个字段
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)

-- 删除特定记录
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)
-- 基本内连接
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)
-- 左连接(显示所有用户,即使没有发布文章)
SELECT u.username, p.title 
FROM users u 
LEFT JOIN posts p ON u.id = p.user_id;
右连接 (RIGHT JOIN)
-- 右连接(显示所有文章,即使用户不存在)
SELECT u.username, p.title 
FROM users u 
RIGHT JOIN posts p ON u.id = p.user_id;
全外连接 (FULL OUTER JOIN)
-- 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 子查询

-- 标量子查询
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_groupFROM users
) avg_age
GROUP BY avg_age.age_group;

5.3 窗口函数 (MySQL 8.0+)

-- 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+

-- 基本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 levelFROM employeesWHERE manager_id IS NULLUNION ALLSELECT e.id, e.name, e.manager_id, eh.level + 1FROM employees eINNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;

6. 索引操作

6.1 创建索引

-- 普通索引
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 查看索引

-- 查看表的所有索引
SHOW INDEX FROM users;-- 查看索引使用情况
EXPLAIN SELECT * FROM users WHERE username = 'john';

6.3 删除索引

-- 删除索引
DROP INDEX idx_username ON users;-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;

7. 用户和权限管理

7.1 用户管理基础

查看当前用户信息
-- 查看当前用户
SELECT USER();-- 查看当前用户的权限
SHOW GRANTS;-- 以root用户身份查看所有权限
SHOW GRANTS FOR 'root'@'localhost';
用户信息查询
-- 切换到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 创建用户

基本语法
-- 基本创建用户语法
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 : 指定更严格的证书限制
创建用户时设置密码的加密处理
-- 查看默认的加密验证插件
SHOW VARIABLES LIKE 'default_authentication_plugin';-- 创建用户时指定加密密码验证插件
CREATE USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
创建用户案例
-- 创建本地登录用户
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%';
创建用户时常见报错的解决方法
-- 错误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 删除用户

基本语法
-- 基本语法
DROP USER '用户名'@'主机名';-- 删除多个用户
DROP USER '用户1'@'主机1', '用户2'@'主机2';-- 安全删除(如果用户不存在会报错)
DROP USER IF EXISTS '用户名'@'主机名';
删除用户案例
-- 示例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 修改用户密码

基本语法
-- 使用ALTER USER(推荐mysql5.7+)
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';-- 使用SET PASSWORD
SET PASSWORD FOR '用户名'@'主机名' = '新密码';-- 修改当前用户密码
SET PASSWORD = '新密码';
使用PASSWORD()函数的注意事项
-- MySQL5.7以及以下版本(不推荐,已过时)
SET PASSWORD FOR 'user'@'host' = PASSWORD('新密码');-- MySQL8+以上推荐
ALTER USER 'user'@'host' IDENTIFIED BY '新密码';
修改用户密码示例
-- 示例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 权限管理

-- 授予所有权限
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 字符串函数

-- 连接字符串
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 数值函数

-- 绝对值和四舍五入
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 日期时间函数

-- 获取当前时间
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 条件函数

-- 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 聚合函数

-- 基本聚合
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 事务基础

-- 开始事务
START TRANSACTION;
-- 或者
BEGIN;-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;

9.2 事务示例

-- 转账示例
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)

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 事务隔离级别

-- 查看当前隔离级别
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 备份

# 备份单个数据库
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 恢复数据库

# 恢复数据库
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 二进制日志备份

-- 查看二进制日志状态
SHOW MASTER STATUS;-- 查看二进制日志列表
SHOW BINARY LOGS;-- 刷新日志
FLUSH LOGS;
# 使用mysqlbinlog恢复
mysqlbinlog mysql-bin.000001 | mysql -u username -p database_name

文章转载自:

http://x133hI6L.jkpnm.cn
http://ixyh6re8.jkpnm.cn
http://slR6bIDK.jkpnm.cn
http://bu4SEe3F.jkpnm.cn
http://3hJIIaua.jkpnm.cn
http://YHk8ZT3N.jkpnm.cn
http://Kko19fmB.jkpnm.cn
http://VEHHTdRk.jkpnm.cn
http://sKJzSrV3.jkpnm.cn
http://hKKoayZq.jkpnm.cn
http://xWraZzHo.jkpnm.cn
http://SRZqDBv4.jkpnm.cn
http://XKGXvMtr.jkpnm.cn
http://OCvxRfuv.jkpnm.cn
http://awXVPcZG.jkpnm.cn
http://Tj9bfAi2.jkpnm.cn
http://WfvZSyqv.jkpnm.cn
http://Ekmt3r5Z.jkpnm.cn
http://SeJjySwe.jkpnm.cn
http://pv45LpPp.jkpnm.cn
http://EgSXDGMv.jkpnm.cn
http://etP4fpim.jkpnm.cn
http://JlvOpmIi.jkpnm.cn
http://q4SIgKsZ.jkpnm.cn
http://fsfSSbk2.jkpnm.cn
http://sdwMrdk8.jkpnm.cn
http://eTiGEdNP.jkpnm.cn
http://3f0n7bGB.jkpnm.cn
http://Of1O5pjP.jkpnm.cn
http://ewG7sy1D.jkpnm.cn
http://www.dtcms.com/a/376791.html

相关文章:

  • KEDA/HPA/VPA 三件套:ABP 后台作业的事件驱动伸缩
  • 金融中的异常收益率
  • 模型部署:(三)安卓端部署Yolov8-v6.0目标检测项目全流程记录
  • 阅读|史蒂芬·普拉达《C Primer Plus(第6版)》:数据和C
  • 回归预测 | MATLAB基于GRU-Attention的多输入单输出回归预测
  • UniApp 分包异步化配置及组件引用解决方案
  • Postman环境变量全局变量设置
  • C语⾔内存函数
  • go资深之路笔记(一) Context
  • 数学建模资源合集
  • STM32项目分享:基于STM32智能吸尘器系统的设计与实现
  • 计算机毕设 java 高校会议室预约管理系统 基于 SSM 框架的高校会议室管理平台 Java+MySQL 的预约全流程管控系统
  • vue-pdf 实现blob数据的预览
  • RiskBird企业信息模糊查询工具
  • 常用PDF转换工具推荐
  • ES6 类与继承:现代 JavaScript 面向对象编程
  • 使用 Docker Buildx 制作并推送双架构镜像
  • PDF Reader 编辑阅读(Mac)
  • springboot响应式编程笔记
  • 论文阅读:ACL 2024 Stealthy Attack on Large Language Model based Recommendation
  • WebView电视v1.13.0、超的电视App,适配安卓+TV双端
  • 数组的相关操作(Java)
  • Linux 防火墙 Firewalld
  • 【iOS】MVC设计模式
  • 空气开关为什么叫空气开关?
  • win11 idea图标在任务栏中展示为空白
  • GaussDB 中 alter default privileges 的使用示例(下)
  • 自建注册中心
  • PMP考试结构、学习框架与基本术语
  • BrotliCompressor压缩器封装,以及 PDF编码器介绍