主题
关系型数据库基础
一、核心概念
数据库 = 数据表(Table)的集合。一张表由**行(记录)和列(字段)**组成:
user 表
┌────┬──────────┬────────────────────────────┐
│ id │ username │ password │
├────┼──────────┼────────────────────────────┤
│ 1 │ 小明 │ $2a$10$Xy...(BCrypt 密文) │
│ 2 │ 小红 │ $2a$10$Ab... │
└────┴──────────┴────────────────────────────┘关键术语:
| 术语 | 含义 | 商城例子 |
|---|---|---|
| 表 Table | 同类数据的集合 | user、product、order |
| 主键 PK | 唯一标识一行 | id(自增) |
| 外键 FK | 引用别的表的主键(建模关系) | order.user_id → user.id |
| 索引 | 加速查询的数据结构 | 在 username 上建索引 |
| 约束 | 数据合法性规则 | NOT NULL、UNIQUE |
二、关系(面试重点)
表之间用主外键表达关系,有三种:
一对一
一个用户一个扩展资料 → 两个表通过相同主键关联。
一对多(最常见)
一个分类下有多个商品:
category (1) ──< (多) product多对多
一个用户买多个商品、一个商品被多个用户买 → 用中间表拆成两个一对多:
user ──< order_item >── product多对多必须拆中间表,这是建表的核心技巧。
三、常用数据类型
| 类型 | 用途 | 商城例子 |
|---|---|---|
BIGINT | 大整数,主键 | id |
VARCHAR(n) | 变长字符串 | 用户名、地址 |
TEXT | 长文本 | 商品描述 |
DECIMAL(10,2) | 精确小数(金额必用) | 价格 |
INT | 整数 | 库存、数量 |
DATETIME | 日期时间 | 创建时间 |
TINYINT | 小整数/布尔 | 状态、逻辑删除 |
金额不要用 FLOAT/DOUBLE
浮点存储小数有精度误差(0.1 + 0.2 ≠ 0.3)。金额一律用 DECIMAL。
四、建库建表入门
sql
-- 建库
CREATE DATABASE mall DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mall;
-- 建表
CREATE TABLE user (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
nickname VARCHAR(50) DEFAULT '',
phone VARCHAR(20) DEFAULT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;要点:
utf8mb4:支持中文和 emoji(utf8不够)InnoDB:支持事务和外键(MyISAM 不支持事务)AUTO_INCREMENT:主键自增NOT NULL / DEFAULT:字段约束
五、增删改查入门
sql
-- 新增
INSERT INTO user (username, password) VALUES ('xiaoming', '密文');
-- 查询
SELECT * FROM user WHERE username = 'xiaoming';
SELECT id, username FROM user WHERE id > 5 ORDER BY id DESC LIMIT 10;
-- 更新
UPDATE user SET nickname = '小明同学' WHERE id = 1;
-- 删除(建议逻辑删除:UPDATE deleted=1,而非 DELETE)
UPDATE user SET deleted = 1 WHERE id = 1;与 MyBatis-Plus 对应
MP 的 insert(entity) → INSERT,selectById → SELECT * WHERE id=?,selectPage → SELECT ... LIMIT ?,?。框架帮你生成的 SQL 就是这些。
六、本章自测
- 建一个
category表(id, name, sort, deleted)。 - 插入 3 条分类数据。
- 查询并按 sort 排序。
- 说出 user 和 order、product 和 order_item 各是什么关系。