Skip to content

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 条件的 statuscreate_time

不要给低选择性字段(如性别只有男/女)滥建索引。

软删除

物理删除 DELETE FROM users WHERE id = 1 会丢数据。脚手架采用 软删除deleted = 1 表示已删,查询时默认 deleted = 0。MyBatis-Plus 可通过 @TableLogic 自动过滤已删记录。

事务(了解即可)

多条 SQL 必须同时成功或同时失败时用事务,例如转账:扣 A 账户、加 B 账户。Spring 的 @Transactional 会在 Service 方法上开启事务,任一步失败则回滚。

在本地执行 data.sql

  1. 安装并启动 MySQL。
  2. 用 Navicat、DBeaver 或命令行连接。
  3. 执行 templates/luote-backend/src/main/resources/data.sql
  4. 在后端 .env 中配置 DB_HOSTDB_PORTDB_NAMEDB_USERNAMEDB_PASSWORD

与 luote 脚手架的关系

文件/类作用
data.sql初始化库表与默认 admin 账号
domain/po/User.javausers 表字段一一对应
mapper/UserMapper.java继承 BaseMapper<User> 获得基础 CRUD
UserServiceImpl业务层组合多次数据库操作

下一章:Java 基础

MIT Licensed