关系型数据库核心概念与 MySQL 操作

1. 核心术语

  • 关系:二维表结构,类似 Excel 表格,行列顺序无关紧要
  • :单条数据记录,例如"张三,20岁,男"
  • :数据字段,如"姓名"字段
  • 主键:表唯一标识,不可重复且非空(类似身份证号)
  • 唯一键:可设置多个,允许空值但不可重复(如邮箱、手机号)
  • :字段取值范围限定,如性别只能为"男"或"女"

表关系处理原则

  • 一对一:任选一方添加外键
  • 一对多:在"多"的一方添加外键
  • 多对多:必须建立中间关联表

2. 数据库三大范式

  • 第一范式(1NF):字段原子性,不可再分
  • 第二范式(2NF):非主键字段必须完全依赖主键(复合主键时需特别注意)
  • 第三范式(3NF):消除非主键字段间的传递依赖

提示:范式设计虽能减少冗余,但实际应用中可根据性能需求适当反范式化


3. 数据类型选择指南

3.1 字符串类型

类型 特性 适用场景
CHAR(n) 定长存储,速度快但占用空间固定 身份证号、手机号等固定长度数据
VARCHAR(n) 变长存储,节省空间 姓名、地址等长度不固定数据
TEXT 大文本存储 文章内容等长文本数据

3.2 数值类型修饰

  • AUTO_INCREMENT:自增属性,需配合主键或唯一键使用
  • UNSIGNED:无符号数值,可扩大正数存储范围

3.3 通用字段约束

  • NOT NULL:非空约束
  • DEFAULT:默认值设置
  • PRIMARY KEY / UNIQUE KEY:主键与唯一键约束

4. 常用管理命令

sql 复制代码
\s                      -- 查看服务器状态
SHOW DATABASES;         -- 列出所有数据库
SHOW TABLES;            -- 显示当前库所有表
DESC 表名;              -- 查看表结构
SHOW CREATE TABLE 表名; -- 查看建表语句
SELECT DATABASE();      -- 显示当前使用数据库

-- 实用技巧:使用\G竖向显示表信息
SHOW TABLE STATUS LIKE '表名'\G

5. 表结构操作

5.1 建表示例

sql 复制代码
CREATE TABLE students (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '学号',
    name VARCHAR(20) NOT NULL COMMENT '姓名',
    age TINYINT UNSIGNED COMMENT '年龄',
    gender ENUM('M','F') DEFAULT 'M' COMMENT '性别'
) AUTO_INCREMENT=10;

5.2 表复制方式

仅复制结构(保留约束):

sql 复制代码
CREATE TABLE 新表 LIKE 旧表;

复制结构及数据(不保留约束):

sql 复制代码
CREATE TABLE 新表 AS SELECT * FROM 旧表;

5.3 表结构修改

sql 复制代码
ALTER TABLE 表名 ADD 字段名 类型 AFTER 某字段;  -- 添加字段
ALTER TABLE 表名 DROP 字段名;                 -- 删除字段
ALTER TABLE 表名 MODIFY 字段名 新类型;        -- 修改字段类型
ALTER TABLE 表名 CHANGE 旧名 新名 类型;       -- 重命名字段及类型

-- 生产环境修改表结构前请务必备份数据

6. 数据操作

6.1 数据插入

sql 复制代码
-- 指定字段插入
INSERT INTO students (name, age) VALUES ('小明', 20);

-- SET语法插入
INSERT INTO students SET name='小红', age=18;

-- 从其他表导入数据
INSERT INTO students (name, age) SELECT name, age FROM teachers;

6.2 数据更新

sql 复制代码
UPDATE students SET age=21 WHERE name='wei';
-- 注意:未加WHERE条件将更新全表数据

6.3 数据删除

sql 复制代码
DELETE FROM students WHERE stuid=30;  -- 条件删除
TRUNCATE TABLE students;             -- 清空表并重置自增值

7. 数据查询

7.1 基础查询

sql 复制代码
SELECT name, age FROM students;                     -- 指定字段查询
SELECT DISTINCT age FROM students;                  -- 去重查询
SELECT * FROM students WHERE age BETWEEN 18 AND 25; -- 范围查询
SELECT * FROM students WHERE name LIKE '张%';       -- 模糊查询

7.2 排序与分页

sql 复制代码
SELECT * FROM students ORDER BY age DESC LIMIT 3,4;  -- 按年龄降序,跳过3条取4条

7.3 聚合与分组

sql 复制代码
SELECT gender, AVG(age) 
FROM students 
GROUP BY gender 
HAVING AVG(age) > 20;
-- WHERE用于行过滤,HAVING用于分组结果过滤

8. 多表关联查询

8.1 内连接

sql 复制代码
SELECT s.name, t.name 
FROM students s 
INNER JOIN teachers t ON s.teacherid = t.tid;

8.2 左外连接

sql 复制代码
SELECT s.name, IFNULL(t.name, '无老师') 
FROM students s 
LEFT JOIN teachers t ON s.teacherid = t.tid;

8.3 自连接

sql 复制代码
SELECT e.name 员工, IFNULL(l.name, '无上级') 领导
FROM emp e 
LEFT JOIN emp l ON e.leader_id = l.emp_id;

8.4 联合查询

sql 复制代码
SELECT stuid, name FROM students 
UNION 
SELECT tid, name FROM teachers;

8.5 三表关联

sql 复制代码
SELECT s.name, c.Course, sc.Score
FROM students s
JOIN scores sc ON s.StuID = sc.StuID
JOIN courses c ON sc.CourseID = c.CourseID;

9. 视图应用

将复杂查询保存为虚拟表:

sql 复制代码
CREATE VIEW v_score_detail AS
SELECT s.name, c.Course, sc.Score
FROM students s
JOIN scores sc ON s.StuID = sc.StuID
JOIN courses c ON sc.CourseID = c.CourseID;

-- 视图使用
SELECT * FROM v_score_detail WHERE Score > 80;

10. 实用技巧

  1. 养成添加COMMENT注释的习惯
  2. NULL值判断必须使用IS NULL而非= NULL
  3. 使用\G竖向显示多字段查询结果
  4. 避免在索引列上使用函数或前导通配符,以免索引失效
相关推荐
fly spider2 小时前
MySQL事务详解
数据库·mysql
啦啦啦_99992 小时前
1. MySQL
数据库·mysql·oracle
随风,奔跑2 小时前
MySQL性能调优
数据库·mysql·oracle
fly spider3 小时前
MySQL之Buffer Pool
数据库·mysql
羊小蜜.3 小时前
Mysql 14: 存储引擎——架构、引擎对比与锁机制
数据库·mysql·架构
fīɡЙtīиɡ ℡4 小时前
【Mysql——MVCC】
数据库·mysql
白毛大侠4 小时前
# MySQL InnoDB 隔离级别与 MVCC 完全解析
android·数据库·mysql
草莓熊Lotso5 小时前
MySQL 从入门到实战:视图特性 + 用户权限管理全解
linux·运维·服务器·数据库·c++·mysql
小猿姐10 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生