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 表开始)

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

相关推荐
坚定信念,勇往无前3 分钟前
mongodb的日志分割
数据库·mongodb
学长毕业设计3 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西3 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西3 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
oradh3 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结
数据库·oracle·tx 锁 mode 4·oracle tx 锁
许彰午4 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065254 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
yi.Ist4 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚
小范同学_4 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
予昊5 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket