本文系统讲解 MySQL 数据库表操作核心知识,从 SQL 基础语法到复杂表结构设计,涵盖数据类型选择、完整性约束、范式设计、权限管理等关键内容。结合大量实战案例,帮助开发者掌握高效设计和管理数据库的核心技能。
摘要
目录
一、SQL 语句基础
1.1 SQL 语言概述
1.2 SQL 分类与常用命令
1.3 书写规范与最佳实践
二、数据库核心操作
2.1 数据库生命周期管理
创建数据库
查看与切换数据库
删除数据库
2.2 字符集与校对规则深度解析
三、表结构设计与数据类型
3.1 核心数据类型选型指南
数值类型对比
字符串类型选择
日期类型最佳实践
3.2 表操作实战案例
创建商品表(含约束)
修改表结构(新增 / 删除字段)
四、完整性约束实战
4.1 主键与外键深度应用
订单表与用户表关联(外键约束)
自增主键最佳实践
4.2 约束类型对比与适用场景
五、范式设计与反范式优化
5.1 数据库三范式深度解析
第一范式(1NF:字段原子性)
第二范式(2NF:消除部分依赖)
第三范式(3NF:消除传递依赖)
5.2 反范式设计场景与权衡
六、用户管理与权限控制
6.1 账户生命周期管理
创建用户(指定 IP 白名单)
权限分配与回收
查看权限与删除用户
6.2 密码策略与安全加固
配置强密码策略(MySQL 8.0+)
生产环境安全建议
七、企业级最佳实践
7.1 命名与索引规范
命名规则
索引优化核心原则
7.2 存储引擎选择
7.3 备份与监控策略
备份方案
性能监控
** 结构化查询语言(SQL)** 是操作关系型数据库的标准语言,具备三大核心能力:
类别 | 全称 | 核心功能 | 常用命令 |
---|---|---|---|
DDL | 数据定义语言 | 定义数据库对象 | CREATE /ALTER /DROP |
DML | 数据操作语言 | 操作数据记录 | INSERT /UPDATE /SELECT |
DCL | 数据控制语言 | 权限与事务管理 | GRANT /REVOKE /COMMIT |
SELECT
/FROM
);
结束,支持多行缩进书写-- 单行注释
/* 多行注释
支持跨越多行 */
CREATE DATABASE IF NOT EXISTS shop_db -- 避免重复创建
CHARACTER SET utf8mb4; -- 使用UTF-8全量字符集(支持Emoji)
CREATE DATABASE db_name; -- 基础语法
CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 带字符集和校对规则
SHOW DATABASES; -- 列出所有数据库
SHOW DATABASES LIKE 'test%'; -- 通配符过滤(支持%和_)
USE db_name; -- 切换当前操作数据库
DROP DATABASE IF EXISTS db_name; -- 安全删除(避免报错)
MySQL 8.0 默认使用utf8mb4
字符集,支持包括 Emoji 在内的所有 Unicode 字符。关键参数:
参数 | 说明 | 最佳实践 |
---|---|---|
character_set_database |
数据库默认字符集 | 统一设置为utf8mb4 |
collation_database |
数据库校对规则(排序规则) | 使用utf8mb4_unicode_ci (不区分大小写) |
character_set_client |
客户端输入编码 | 与连接工具保持一致(如 Navicat 设置) |
查看配置:
SHOW VARIABLES LIKE 'character%'; -- 查看所有字符集相关变量
SHOW COLLATION; -- 查看所有可用校对规则
类型 | 存储空间 | 典型场景 | 注意事项 |
---|---|---|---|
TINYINT |
1 字节 | 状态标识(0/1/2) | 无符号类型需显式声明UNSIGNED |
INT |
4 字节 | 自增主键、普通整数 | 推荐自增主键使用AUTO_INCREMENT |
DECIMAL(5,2) |
变长 | 精确小数(金额、百分比) | 避免使用FLOAT /DOUBLE 防止精度丢失 |
类型 | 存储方式 | 适用场景 | 性能对比 |
---|---|---|---|
CHAR(10) |
定长存储 | 固定长度数据(手机号、MD5 值) | 存取速度快,空间利用率低 |
VARCHAR(50) |
变长存储 | 动态长度数据(用户名、邮箱) | 节省空间,需额外 1-2 字节存储长度 |
TEXT |
大文本 | 文章内容、长评论 | 不建议在查询条件中使用 |
-- 推荐使用TIMESTAMP(自动记录更新时间)
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时自动赋值
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时自动刷新
);
CREATE TABLE products (
prod_id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键
prod_name VARCHAR(50) NOT NULL, -- 非空约束
price DECIMAL(10,2) CHECK (price > 0), -- 值域校验(MySQL 8.0+支持)
stock INT DEFAULT 0, -- 默认库存0
create_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- 默认当前时间
INDEX idx_price (price) -- 添加索引优化查询
) ENGINE=InnoDB; -- 指定存储引擎(支持事务)
ALTER TABLE products
ADD COLUMN category VARCHAR(20) AFTER prod_name; -- 在prod_name后新增字段
ALTER TABLE products
DROP COLUMN old_field; -- 删除无用字段
查看表结构与元数据
DESC products; -- 快速查看字段信息
SHOW CREATE TABLE products; -- 查看完整建表语句(含索引、约束)
-- 用户表(主表)
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) UNIQUE -- 唯一约束防止重复
);
-- 订单表(从表,外键关联user_id)
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id) -- 外键关联
ON DELETE CASCADE -- 级联删除(主表删除时从表自动删除相关记录)
);
ALTER TABLE users
MODIFY COLUMN user_id INT AUTO_INCREMENT; -- 将现有字段改为自增
约束类型 | 作用 | 示例 | 注意事项 |
---|---|---|---|
PRIMARY KEY |
唯一标识记录,非空 | id INT PRIMARY KEY |
每张表最多 1 个主键 |
UNIQUE |
字段值唯一(可空) | email VARCHAR(50) UNIQUE |
允许单个字段或多字段联合唯一 |
CHECK |
值域校验 | age INT CHECK(age >= 18) |
MySQL 8.0 + 正式支持 |
DEFAULT |
设置默认值 | status TINYINT DEFAULT 1 |
插入时未赋值则使用默认值 |
反例(错误设计):
CREATE TABLE students (
info VARCHAR(100) -- 包含"张三,男,20"等复合信息
);
正例(原子化拆分):
CREATE TABLE students (
name VARCHAR(20),
gender CHAR(1), -- 'M'/'F'
age INT
);
拆分订单表:
orders
(订单头信息): CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE
);
order_details
(订单详情): CREATE TABLE order_details (
detail_id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
拆分部门与学生表:
departments
: CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50),
dean VARCHAR(20) -- 部门负责人(避免在学生表重复存储)
);
students
: CREATE TABLE students (
stu_id INT PRIMARY KEY,
stu_name VARCHAR(30),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
适用场景:
案例:冗余作者信息提升查询效率
-- 反范式设计(冗余author_name字段)
CREATE TABLE articles (
article_id INT PRIMARY KEY,
title VARCHAR(100),
author_id INT,
author_name VARCHAR(20), -- 冗余字段避免联表查询
create_time TIMESTAMP
);
注意事项:
CREATE USER 'app_user'@'192.168.1.%' -- 允许192.168.1.0/24网段访问
IDENTIFIED BY 'SecurePwd123!'; -- 强密码策略(大小写+数字+符号)
GRANT SELECT, INSERT, UPDATE -- 授予查询、插入、更新权限
ON shop_db.* -- 作用于shop_db库下所有表
TO 'app_user'@'192.168.1.%';
REVOKE DELETE -- 回收删除权限
ON shop_db.products -- 仅作用于products表
FROM 'app_user'@'192.168.1.%';
SHOW GRANTS FOR 'app_user'@'192.168.1.%'; -- 查看用户权限
DROP USER IF EXISTS 'temp_user'@'%'; -- 删除废弃用户(%表示所有IP)
-- 查看当前策略
SHOW VARIABLES LIKE 'validate_password%';
-- 设置密码复杂度(至少8位,包含1个大写、1个小写、1个数字)
SET GLOBAL validate_password.length = 8;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SSL
加密连接:GRANT ... REQUIRE SSL;
root
用户远程登录:仅允许本地localhost访问order_details
)user
改为sys_user
,date
改为order_date
INT
/BIGINT
(保证索引有序性)WHERE
/JOIN
/ORDER BY
字段添加索引(user_id, order_date)
)引擎 | 事务支持 | 锁粒度 | 适用场景 |
---|---|---|---|
InnoDB |
支持 | 行锁 | 高并发读写(默认引擎) |
MyISAM |
不支持 | 表锁 | 只读 / 低并发场景(如日志表) |
Memory |
不支持 | 表锁 | 临时缓存数据(重启丢失) |
mysqldump -u root -p db_name > backup.sql
(适合小规模库)SHOW PROCESSLIST; -- 查看当前运行线程(排查慢查询)
EXPLAIN SELECT * FROM products WHERE price > 100; -- 分析SQL执行计划
SHOW STATUS LIKE 'Slow_queries'; -- 统计慢查询数量
通过掌握这些MySQL核心操作,您将能够设计出高效、稳定的数据库系统。在实际开发中,需要根据业务特点灵活运用范式理论,平衡数据一致性与查询性能。