MySQL 数据库管理

目录

前言

一、数据库基本操作

[1. 查看数据库信息](#1. 查看数据库信息)

[2. 切换数据库](#2. 切换数据库)

[3. 查看数据库中的表](#3. 查看数据库中的表)

[4. 查看表结构](#4. 查看表结构)

二、常用数据类型

三、数据库文件存储结构

[四、SQL 语句分类](#四、SQL 语句分类)

[五、DDL 操作(数据库和表管理)](#五、DDL 操作(数据库和表管理))

[1. 数据库操作](#1. 数据库操作)

创建数据库

删除数据库

修改数据库字符集

[2. 表操作](#2. 表操作)

创建表

删除表

修改表结构

重命名表

[3. 约束管理](#3. 约束管理)

添加主键

添加外键

删除约束

[4. 索引操作](#4. 索引操作)

创建索引

删除索引

[六、DML 操作(表数据管理)](#六、DML 操作(表数据管理))

[1. 插入数据(INSERT)](#1. 插入数据(INSERT))

[2. 更新数据(UPDATE)](#2. 更新数据(UPDATE))

[3. 删除数据(DELETE)](#3. 删除数据(DELETE))

[4. 合并数据(MERGE/UPSERT)](#4. 合并数据(MERGE/UPSERT))

关键要点

[七、DQL 操作(数据查询)](#七、DQL 操作(数据查询))

[1. 限制查询结果数量](#1. 限制查询结果数量)

[2. 竖向显示结果](#2. 竖向显示结果)

[3. 结合使用](#3. 结合使用)

注意事项

八、用户管理

一、创建用户

二、查看用户

三、删除用户

四、修改密码

[五、忘记 root 密码处理](#五、忘记 root 密码处理)

注意事项

九、用户授权管理

[1. 用户授权管理基础](#1. 用户授权管理基础)

[2. 查看用户授权](#2. 查看用户授权)

数据库设计示例 (简化版)

查询用户权限示例 (SQL)

[3. 撤销用户权限](#3. 撤销用户权限)

撤销权限操作示例 (SQL)

关键注意事项

4.权限说明

总结


前言

MySQL作为一款成熟且广泛应用的关系型数据库管理系统,在数据存储、处理和分析领域发挥着重要作用。无论是支撑大型企业级应用,还是服务于中小型项目,其高效、稳定、灵活的特性都使其成为开发者和运维人员的首选工具之一。

在数据驱动的时代背景下,掌握MySQL的核心管理技能显得尤为关键。本内容旨在帮助读者系统性地理解MySQL的架构设计、优化策略及运维实践,涵盖从基础操作到高级调优的全流程知识体系。通过实际场景的案例解析与最佳实践的分享,期望能为数据库管理员、开发人员及相关技术人员提供实用的参考指南,助力构建高性能、高可用的数据服务架构。

一、数据库基本操作

1. 查看数据库信息

在 MySQL 或 PostgreSQL 中,查看所有数据库的列表:

sql 复制代码
SHOW DATABASES;  -- MySQL
\l              -- PostgreSQL
 

2. 切换数据库

选择需要操作的数据库:

sql 复制代码
USE database_name;  -- MySQL
\c database_name   -- PostgreSQL
 

3. 查看数据库中的表

列出当前数据库中的所有表:

sql 复制代码
SHOW TABLES;  -- MySQL
\dt           -- PostgreSQL
 

4. 查看表结构

查看指定表的字段、数据类型、约束等信息:

sql 复制代码
DESCRIBE table_name;     -- MySQL
\d table_name            -- PostgreSQL
 

或通过查询系统表(通用性更强):

sql 复制代码
SELECT column_name, data_type, is_nullable 
FROM information_schema.columns 
WHERE table_name = 'table_name';
 

注意

  1. 命令末尾的分号(;)在 MySQL 中必须,在 PostgreSQL 的 psql 命令行中可省略。
  2. 部分命令需在特定数据库环境下执行(如切换数据库后)。

二、常用数据类型

类型 说明 示例
INT 整型,用于存储整数数据,不包含小数部分。 id INT
FLOAT 单精度浮点类型,占用 4 字节内存,可以表示小数,但可能存在精度损失。 score FLOAT
DOUBLE 双精度浮点类型,占用 8 字节内存,比 FLOAT 精度更高,适合更大范围的小数。 price DOUBLE
CHAR(n) 固定长度字符类型,长度固定为 n 个字符,如果实际长度不足,会以空格填充。 name CHAR(10)
VARCHAR(n) 可变长度字符类型,最大长度限制为 n 个字符,存储时只占用实际字符的空间。 address VARCHAR(50)
TEXT 文本类型,用于存储大量文本数据,长度可变,适合长字符串。 description TEXT
IMAGE 图片类型,专门用于存储图像文件,通常以二进制形式保存。 photo IMAGE
DECIMAL(p,s) 精确数值类型,p 表示总位数(包括整数和小数部分),s 表示小数位数。适合需要高精度的数值计算。 salary DECIMAL(5,2)

注意

  • 对于 DECIMAL(p,s) 类型,例如 DECIMAL(5,2),p=5 表示总位数为 5(整数部分最多 3 位,小数部分固定 2 位),因此它能存储的值如 123.45,但不能存储 55555.000(因为整数部分超出了 3 位)。在实际应用中,请根据数据范围合理选择 p 和 s。
  • 这些数据类型在 SQL 数据库、编程语言(如 Python 或 Java)中广泛使用。选择类型时,需考虑数据大小、精度需求和存储优化。

三、数据库文件存储结构

MySQL 数据目录: /usr/local/mysql/data
每个数据库对应一个子目录,每个表对应若干文件:
MyISAM
.frm (表结构)、 .MYD (数据)、 .MYI (索引)
InnoDB
独享表空间: .ibd 文件(每表一个文件)
共享表空间: ibdata 文件(多个表共用)

四、SQL****语句分类

类别 核心命令 功能描述 典型示例
数据定义语言 (DDL) CREATE, ALTER, DROP, TRUNCATE, RENAME 用于定义、修改或删除数据库对象(如表、索引、视图、存储过程等)的结构。 CREATE TABLE Students (id INT, name VARCHAR(50));
数据操作语言 (DML) SELECT, INSERT, UPDATE, DELETE, MERGE 用于对数据库中的数据进行查询、插入、更新和删除操作。 SELECT * FROM Students WHERE grade > 90;
数据控制语言 (DCL) GRANT, REVOKE 用于管理数据库用户的访问权限和安全性控制。 GRANT SELECT ON Students TO user1;
事务控制语言 (TCL) COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION 用于管理数据库事务,确保数据操作的原子性和一致性。 COMMIT;(提交事务)<br>ROLLBACK;(回滚事务)

说明

  1. DDL 操作通常会自动提交事务,不可回滚。
  2. DML 是日常使用最频繁的语句,尤其是 SELECTINSERT/UPDATE/DELETE
  3. TCL 在需要保证数据一致性的业务场景中至关重要。

五、DDL****操作(数据库和表管理)

1. 数据库操作

创建数据库
sql 复制代码
CREATE DATABASE db_name;
 
删除数据库
sql 复制代码
DROP DATABASE db_name;
 
修改数据库字符集
sql 复制代码
ALTER DATABASE db_name CHARACTER SET utf8mb4;
 

2. 表操作

创建表
sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 
删除表
sql 复制代码
DROP TABLE users;
 
修改表结构
  • 添加字段

    sql 复制代码
    ALTER TABLE users ADD COLUMN age INT;
     
  • 修改字段类型

sql 复制代码
ALTER TABLE users MODIFY COLUMN email VARCHAR(150);
 

删除字段

sql 复制代码
ALTER TABLE users DROP COLUMN age;
 

重命名字段

sql 复制代码
ALTER TABLE users RENAME COLUMN email TO user_email;
 
重命名表
sql 复制代码
ALTER TABLE users RENAME TO customers;
 

3. 约束管理

添加主键
sql 复制代码
ALTER TABLE orders ADD PRIMARY KEY (order_id);
 
添加外键
sql 复制代码
ALTER TABLE orders 
ADD CONSTRAINT fk_user_id 
FOREIGN KEY (user_id) REFERENCES users(id);
 
删除约束
sql 复制代码
ALTER TABLE orders DROP CONSTRAINT fk_user_id;
 

4. 索引操作

创建索引
sql 复制代码
CREATE INDEX idx_name ON users (name);
 
删除索引
sql 复制代码
DROP INDEX idx_name ON users;
 

六、DML****操作(表数据管理)

1. 插入数据(INSERT)

向表中添加新记录:

sql 复制代码
INSERT INTO 表名 (列1, 列2, ...) 
VALUES (值1, 值2, ...);
 

示例 :向students表插入数据

sql 复制代码
INSERT INTO students (id, name, age) 
VALUES (101, '张三', 20);
 

2. 更新数据(UPDATE)

修改现有记录:

sql 复制代码
UPDATE 表名
SET 列1=新值1, 列2=新值2, ...
WHERE 条件;
 

注意WHERE子句避免全表更新
示例 :将id=101的学生年龄改为21

sql 复制代码
UPDATE students
SET age = 21
WHERE id = 101;
 

3. 删除数据(DELETE)

移除符合条件的记录:

sql 复制代码
DELETE FROM 表名
WHERE 条件;
 

示例 :删除age>25的学生

sql 复制代码
DELETE FROM students
WHERE age > 25;
 

4. 合并数据(MERGE/UPSERT)

根据条件插入或更新(SQL方言差异):

sql 复制代码
MERGE INTO 目标表 USING 源表
ON (匹配条件)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;
 

关键要点

  1. 事务控制 :DML操作需通过COMMIT提交或ROLLBACK回滚
  2. 条件精准WHERE子句缺失可能导致全表误操作
  3. 性能影响:批量操作时建议使用事务分批提交

七、DQL****操作(数据查询)

1. 限制查询结果数量

在数据查询语言中,通常使用 LIMIT 子句来限制返回的记录数。语法格式如下:

sql 复制代码
SELECT 字段1, 字段2 
FROM 表名 
WHERE 条件 
LIMIT 数量;
 

示例:返回前 5 条记录

sql 复制代码
SELECT * 
FROM employees 
LIMIT 5;
 

2. 竖向显示结果

在命令行工具中(如 MySQL),可通过在查询语句末尾添加 \G 替代分号 ; 实现竖向格式化输出:

sql 复制代码
SELECT * 
FROM employees 
WHERE department_id = 10 
LIMIT 3 \G
 

输出效果:

markdown 复制代码
*************************** 1. row ***************************
        id: 1001
      name: 张三
department: 技术部
*************************** 2. row ***************************
        id: 1002
      name: 李四
department: 技术部
 

3. 结合使用

同时实现结果限制与竖向显示:

sql 复制代码
SELECT id, name, salary 
FROM employees 
WHERE salary > 5000 
LIMIT 2 \G
 

注意事项

  1. LIMIT 子句在不同数据库中的语法可能略有差异(例如 SQL Server 使用 TOP
  2. 竖向显示功能 (\G) 主要在 MySQL 命令行客户端中有效
  3. 在可视化工具(如 Navicat)中结果通常以表格形式展示

八、用户管理

一、创建用户

通过命令行工具创建新用户,需设置用户名和初始密码

bash 复制代码
sudo useradd -m username  # 创建用户并生成家目录
sudo passwd username      # 设置密码
 

二、查看用户

  1. 列出所有用户

    bash 复制代码
    cut -d: -f1 /etc/passwd
     
  2. 查看用户详细信息

    bash 复制代码
    id username  # 查看用户ID及组信息
    finger username  # 查看登录信息(需安装finger包)
     

    三、删除用户

    删除用户并清理关联文件:

    bash 复制代码
    sudo userdel -r username  # -r参数同时删除家目录和邮件
     

四、修改密码

  1. 当前用户自主修改

    bash 复制代码
    passwd  # 按提示输入新旧密码
     
  2. 管理员修改其他用户密码

    bash 复制代码
    sudo passwd username
     

五、忘记 root 密码处理

通过引导菜单进入单用户模式重置:

  1. 重启系统,在GRUB菜单按e编辑启动项

  2. 找到linux行,在行尾添加 init=/bin/bash

  3. Ctrl+X启动进入bash

  4. 执行挂载和密码重置:

    bash 复制代码
    mount -o remount,rw /
    passwd root  # 设置新密码
    exec /sbin/init  # 正常重启
     

    注意事项

  5. 所有敏感操作需sudo提权

  6. 删除用户前确认数据备份

  7. root密码重置后立即恢复SELinux状态(如启用)

九、用户授权管理

1. 用户授权管理基础

用户授权管理通常涉及三个核心实体:

  • 用户(User):系统的使用者。
  • 权限(Permission):用户可以在系统内执行的具体操作或访问的资源。
  • 角色(Role):权限的集合。用户可以被赋予角色,从而间接获得该角色包含的所有权限(可选,但常见)。

授权管理的关键在于记录 用户与权限/角色的关联关系


2. 查看用户授权

要查看某个用户当前拥有的权限,通常需要查询存储授权关系的表(如 user_permissionuser_role)。

数据库设计示例 (简化版)
sql 复制代码
-- 用户表
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE
);

-- 权限表
CREATE TABLE permissions (
    permission_id INT PRIMARY KEY AUTO_INCREMENT,
    permission_name VARCHAR(50) NOT NULL UNIQUE, -- 例如 'view_dashboard', 'edit_post'
    description VARCHAR(255)
);

-- 用户-权限关联表 (直接授权)
CREATE TABLE user_permissions (
    user_id INT,
    permission_id INT,
    PRIMARY KEY (user_id, permission_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (permission_id) REFERENCES permissions(permission_id)
);
 
查询用户权限示例 (SQL)
  • 查看用户 user123 拥有的所有权限:

    sql 复制代码
    SELECT p.permission_name, p.description
    FROM users u
    JOIN user_permissions up ON u.user_id = up.user_id
    JOIN permissions p ON up.permission_id = p.permission_id
    WHERE u.username = 'user123';
     

    检查用户 user123 是否拥有特定权限 edit_post

    sql 复制代码
    SELECT COUNT(*)
    FROM user_permissions up
    JOIN users u ON up.user_id = u.user_id
    JOIN permissions p ON up.permission_id = p.permission_id
    WHERE u.username = 'user123' AND p.permission_name = 'edit_post';
     
  • (结果大于 0 表示拥有该权限)


3. 撤销用户权限

撤销权限意味着移除用户与特定权限之间的关联关系。这通常通过从关联表中删除对应的记录来实现。

撤销权限操作示例 (SQL)
  • 撤销用户 user123edit_post 权限:

    sql 复制代码
    DELETE up
    FROM user_permissions up
    JOIN users u ON up.user_id = u.user_id
    JOIN permissions p ON up.permission_id = p.permission_id
    WHERE u.username = 'user123' AND p.permission_name = 'edit_post';
     

    撤销权限操作示例 (Python)

    python 复制代码
    def revoke_permission(username, permission_name):
        # 连接数据库 (假设使用类似mysql-connector的库)
        db = get_db_connection()
    
        cursor = db.cursor()
    
        try:
            # 先查询用户ID和权限ID (防止SQL注入)
            cursor.execute("SELECT user_id FROM users WHERE username = %s", (username,))
            user_id_result = cursor.fetchone()
            if not user_id_result:
                print(f"用户 {username} 不存在")
                return False
    
            user_id = user_id_result[0]
    
            cursor.execute("SELECT permission_id FROM permissions WHERE permission_name = %s", (permission_name,))
            permission_id_result = cursor.fetchone()
            if not permission_id_result:
                print(f"权限 {permission_name} 不存在")
                return False
    
            permission_id = permission_id_result[0]
    
            # 执行删除操作 (撤销授权)
            cursor.execute("DELETE FROM user_permissions WHERE user_id = %s AND permission_id = %s", (user_id, permission_id))
    
            # 检查是否成功删除了记录
            if cursor.rowcount > 0:
                print(f"成功撤销用户 {username} 的 {permission_name} 权限")
                db.commit()
                return True
            else:
                print(f"用户 {username} 原本就没有 {permission_name} 权限")
                return False
    
        except Exception as e:
            print(f"撤销权限时出错: {e}")
            db.rollback()
            return False
        finally:
            cursor.close()
            db.close()
     

    关键注意事项

  • 事务性 :撤销权限的数据库操作应该在一个事务中完成,以确保数据一致性(如上面的Python示例使用了 commitrollback)。

  • 验证存在性:在执行删除操作前,务必验证用户和权限是否存在,避免无效操作。

  • 日志记录:重要的权限变更(尤其是撤销)应该记录操作日志,包括操作者、被操作者、权限、时间等信息,便于审计。

  • 级联影响:如果系统使用角色管理,撤销角色成员资格可能等同于撤销该角色包含的所有权限。撤销直接授予的权限不会影响通过角色间接获得的权限。

  • 即时生效:权限撤销后,系统应确保该用户后续操作不再拥有该权限。这可能需要用户的会话失效(强制重新登录)或应用程序权限检查逻辑的实时生效。

4.权限说明

权限名称 功能描述
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
CREATE 创建数据库/表
DROP 删除数据库/表
INDEX 建立索引
ALTER 修改表结构
EXECUTE 执行存储过程
CREATE VIEW 创建视图
SHOW VIEW 查看视图
CREATE ROUTINE 创建存储过程
ALTER ROUTINE 修改存储过程
EVENT 创建事件
TRIGGER 创建触发器
ALL PRIVILEGES 所有权限

总结

综上所述,MySQL数据库管理不仅涉及基础的安装配置、数据操作,更需深入理解索引优化、事务控制、备份恢复等核心机制。高效的数据库运维要求管理员具备全局视角,能够结合业务需求合理设计表结构、编写高性能SQL语句,并通过监控工具实时诊断系统状态。

持续学习MySQL的新特性(如窗口函数、JSON支持等)并关注安全策略(如权限管理、加密传输),是保障数据服务稳定运行的关键。通过系统化的学习和实践,读者可逐步构建起完整的MySQL管理能力体系,为业务系统提供坚实可靠的数据支撑。

相关推荐
山水无间道1 小时前
redis的rdb文件迁移
数据库·redis·缓存
陈文锦丫1 小时前
Redis原理篇
数据库·redis·缓存
xuanloyer1 小时前
oracle从入门到精通--oracle基础
数据库·oracle
陈聪.1 小时前
MySQL全平台安装指南:Windows与Linux详细教程
linux·windows·mysql
老华带你飞1 小时前
动物救助|流浪狗救助|基于Springboot+vue的流浪狗救助平台设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·流浪动物救助平台
w***74172 小时前
MySQL压缩版安装详细图解
android·mysql·adb
曹牧2 小时前
Oracle中ROW_NUMBER() OVER()
java·数据库·sql
jnrjian2 小时前
MOS oracle rman backup 脚本
数据库·oracle
zhangfeng11332 小时前
KAT-Coder-Pro V1免费活动继续,免费原来定于北京时间 2025年11月11日 ,快手也加入了模型集成商的队伍了,支持国内各种开原模型
数据库