关系型数据库核心概念与 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. 避免在索引列上使用函数或前导通配符,以免索引失效
相关推荐
数据库小学妹17 分钟前
MySQL高可用架构选型实战:MHA vs MGR vs InnoDB Cluster原理对比与性能实测
mysql·mgr·mha·架构选型·mysql高可用
ywl4708120871 小时前
Mysql,使用B+树存储的索引增删改查效率(七)
数据库·b树·mysql
我叫黑大帅11 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
我会尽全力 乐观而坚强12 小时前
MySQL零基础入门(二)
数据库·mysql·adb
龙石数据15 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
白露与泡影19 小时前
慢 SQL 不一定是 SQL 慢:一次 MySQL 连接池耗尽的故障定位
数据库·sql·mysql
还是鼠鼠21 小时前
AI掘金头条新闻系统 (Toutiao News)-缓存相关推荐新闻
后端·python·mysql·fastapi·web
宠友信息1 天前
Redis 内容社区源码架构优化与即时通讯数据一致性处理
spring boot·后端·websocket·mysql·uni-app
霸道流氓气质1 天前
Kiro 配置 MySQL MCP Server 通用教程
数据库·mysql·adb·mcp·kiro
灯澜忆梦1 天前
【MySQL1】| DDL 数据定义语言
数据库·sql·mysql