SQL 与 MySQL 基础
作者: luote (luote) · 个人主页 luote996.cn
数据库是做什么的
业务数据需要持久化保存:用户信息、订单、文章等。关系型数据库 MySQL 用 表(table) 组织数据,表由 行(记录) 和 列(字段) 组成。后端通过 MyBatis-Plus 执行 SQL,不必手写大量 JDBC 代码。
核心 SQL 语句
建库建表
脚手架 data.sql 会创建 luote 库和 users 表。简化示例:
sql
CREATE DATABASE IF NOT EXISTS luote DEFAULT CHARSET utf8mb4;
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(64) NOT NULL UNIQUE,
password VARCHAR(128) NOT NULL,
nickname VARCHAR(64),
deleted TINYINT DEFAULT 0,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);增删改查(CRUD)
sql
-- 插入
INSERT INTO users (username, password, nickname) VALUES ('test', 'hash', '测试');
-- 查询
SELECT id, username, nickname FROM users WHERE deleted = 0 AND username = 'admin';
-- 更新
UPDATE users SET nickname = '管理员' WHERE id = 1;
-- 删除(脚手架用软删除)
UPDATE users SET deleted = 1 WHERE id = 2;条件与排序
sql
SELECT * FROM users
WHERE deleted = 0 AND nickname LIKE '%张%'
ORDER BY create_time DESC
LIMIT 10 OFFSET 0;LIKE 用于模糊搜索;LIMIT + OFFSET 用于分页(MyBatis-Plus 分页插件会自动生成类似 SQL)。
字段类型怎么选
| 类型 | 适用场景 |
|---|---|
| BIGINT | 主键 id |
| VARCHAR(n) | 短文本:用户名、手机号 |
| TEXT | 长文本:备注、内容 |
| TINYINT | 布尔或小枚举:deleted、status |
| DATETIME | 创建时间、更新时间 |
| DECIMAL | 金额,避免浮点误差 |
字符集统一用 utf8mb4,可存储 emoji 和完整中文。
索引
索引加快查询,但会增加写入成本。常见做法:
| 索引类型 | 示例 |
|---|---|
| 主键 | id |
| 唯一 | username 不可重复 |
| 普通 | 经常作为 WHERE 条件的 status、create_time |
不要给低选择性字段(如性别只有男/女)滥建索引。
软删除
物理删除 DELETE FROM users WHERE id = 1 会丢数据。脚手架采用 软删除:deleted = 1 表示已删,查询时默认 deleted = 0。MyBatis-Plus 可通过 @TableLogic 自动过滤已删记录。
事务(了解即可)
多条 SQL 必须同时成功或同时失败时用事务,例如转账:扣 A 账户、加 B 账户。Spring 的 @Transactional 会在 Service 方法上开启事务,任一步失败则回滚。
在本地执行 data.sql
- 安装并启动 MySQL。
- 用 Navicat、DBeaver 或命令行连接。
- 执行
templates/luote-backend/src/main/resources/data.sql。 - 在后端
.env中配置DB_HOST、DB_PORT、DB_NAME、DB_USERNAME、DB_PASSWORD。
与 luote 脚手架的关系
| 文件/类 | 作用 |
|---|---|
data.sql | 初始化库表与默认 admin 账号 |
domain/po/User.java | 与 users 表字段一一对应 |
mapper/UserMapper.java | 继承 BaseMapper<User> 获得基础 CRUD |
UserServiceImpl | 业务层组合多次数据库操作 |
下一章:Java 基础