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

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

相关推荐
青石路7 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还10 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev12 小时前
GreenDAO → Room
android·java·kotlin
jiayou6413 小时前
KingbaseES 表级与列级加密完全指南
数据库·后端
亦暖筑序17 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏17 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev19 小时前
ButterKnife → ViewBinding
android·java·kotlin
GBASE1 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构