SQL 怎么学(工程实战总纲|用一套用户模型打穿全流程)

一、先把话说清楚

大部分人 SQL 学不会,不是因为难,而是因为:

  • 学的是语法,不是业务
  • 会写 SELECT,不会写接口
  • 会 JOIN,不知道怎么落到项目

👉 本质问题:

❗ 没有"主线案例"


二、这套专栏的核心思路

这套 SQL 系列只做一件事:

复制代码
用一套用户模型,打穿 SQL 全流程

三、核心案例(三张表)

整个系列只围绕这三张表展开:


1️⃣ user(用户主表)

sql 复制代码
CREATE TABLE user (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(64) NOT NULL UNIQUE,
  password VARCHAR(128) NOT NULL,
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

👉 作用:

复制代码
存登录信息(账号体系核心)

2️⃣ user_detail(用户详情表)

sql 复制代码
CREATE TABLE user_detail (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL UNIQUE,
  real_name VARCHAR(50),
  phone VARCHAR(20),
  email VARCHAR(100),
  gender TINYINT DEFAULT 0,
  birthday DATE,
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

👉 作用:

复制代码
存用户扩展信息(资料、属性)

3️⃣ user_address(用户地址表)

sql 复制代码
CREATE TABLE user_address (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  receiver_name VARCHAR(50),
  phone VARCHAR(20),
  province VARCHAR(50),
  city VARCHAR(50),
  district VARCHAR(50),
  detail_address VARCHAR(200),
  is_default TINYINT DEFAULT 0,
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

👉 作用:

复制代码
存用户收货地址(一个用户多个地址)

四、三张表关系(核心理解)

复制代码
user 1 ------ 1 user_detail
user 1 ------ N user_address

为什么这样设计?

👉 因为:

复制代码
账号信息 ≠ 用户资料 ≠ 地址信息

拆表后:

  • 结构清晰
  • 扩展性强
  • 符合企业设计

五、SQL 学习主线(围绕这三张表)


第1阶段:CRUD(操作 user)

你要做到:

复制代码
注册用户
查询用户
删除用户

👉 SQL:

sql 复制代码
INSERT INTO user(...)
SELECT * FROM user WHERE id = ?

第2阶段:建表(理解结构)

你要搞懂:

  • 为什么要有 id
  • 为什么 username 要 UNIQUE
  • 为什么有 create_time

🔗 第3阶段:表关系(拆表能力)

你要搞懂:

复制代码
user_id 是干嘛的?

关键:

复制代码
user_detail.user_id UNIQUE → 一对一
user_address.user_id 可重复 → 一对多

第4阶段:JOIN(业务查询)

你要会写:

sql 复制代码
SELECT
  u.username,
  d.real_name,
  a.receiver_name
FROM user u
LEFT JOIN user_detail d ON u.id = d.user_id
LEFT JOIN user_address a ON u.id = a.user_id;

👉 这一步开始做"真实接口"


第5阶段:项目落地(企业重点)

SQL 不再单独存在,而是进入分层:

复制代码
Controller
  ↓
Service(事务 + 缓存)
  ↓
QueryMapper(JOIN)
  ↓
Mapper(CRUD)

👉 企业实践:

  • MyBatis-Plus → 单表 CRUD
  • XML → 联表查询
  • Service → 业务 + 事务
  • Converter → 对象转换

第6阶段:索引(性能基础)

围绕这三张表:

复制代码
username → 唯一索引
user_id → 普通索引

👉 目标:

复制代码
让查询更快

六、你必须这样学(重点)

复制代码
写接口 → 不会SQL → 补SQL → 回来继续写

❌ 错误方式:

复制代码
背语法
刷题
看教程

七、你学完能达到什么水平?

你应该能做到:

✔ 用户注册(多表 + 事务)

✔ 用户详情(JOIN 查询)

✔ 地址列表(多表)

✔ Mapper 分层设计

✔ 基础索引优化


👉 这就是:

复制代码
企业可用级 SQL 能力

八、最终一句话总结

❗ SQL 不难

难的是:你有没有一套"表结构 + 关系 + 查询 + 项目"的完整链路


九、下一篇

👉 第1篇:CRUD 实战(从 user 表开始)

直接带你写接口,不讲废话。

相关推荐
白露与泡影2 小时前
从区间锁到行锁:一次高并发写入死锁治理实战
java·开发语言
村口张大爷2 小时前
01 — MVC 与 DDD 的思维差异
java·后端
abc123456sdggfd2 小时前
如何统一SQL视图报错信息_使用异常处理机制包装视图
jvm·数据库·python
qq_460978402 小时前
如何处理SQL循环逻辑_探索递归CTE实现复杂计算
jvm·数据库·python
码农阿豪2 小时前
Django接金仓数据库:我踩过的坑和填坑指南
数据库·python·django
疯狂成瘾者2 小时前
Prompt分层策略
前端·数据库·prompt
2401_831419442 小时前
C++如何利用YAML存储复杂的数学矩阵_Eigen库结合yaml-cpp用法【实战】
jvm·数据库·python
疯狂成瘾者2 小时前
对比JAR 包部署 vs Docker 部署方式
java·docker·jar
2401_898717662 小时前
如何进行SQL数学计算_运用ROUND与CEIL处理数值精度
jvm·数据库·python