SQL(Structured Query Language,结构化查询语言)是操作关系型数据库的标准语言 ,广泛应用于MySQL、Oracle、SQL Server、PostgreSQL等数据库系统,也是掌握MyBatis框架的基础知识。关系型数据库(RDBMS)采用二维表格结构的关系模型来存储数据。所谓操作关系型数据库,就是通过特定工具或编程语言对数据库中的表、记录等对象进行创建、查询、更新、删除等管理操作,实现数据的存储、检索和维护。作为声明式语言,SQL专注于数据的定义、查询、更新和管理。本文不涉及数据库工具的安装配置,相关内容读者可自行查阅。
一、核心概念
在写 SQL 之前,需要先明确 "数据库、表、字段" 的关系,这是理解 SQL 操作的前提,我们可用"厨房、货架、食材的关系"来类比。
| 概念 | 专业定义 | 通俗类比 | 实例(用户数据场景) |
|---|---|---|---|
| 数据库(DB) | 存储数据的 "仓库",是多个表的集合,每个数据库有独立的权限和资源。 | 厨房的 "冷藏库"(专门放食材) | 创建mybatis数据库(存储 MyBatis 学习用的所有表) |
| 表(Table) | 数据库中存储数据的 "二维表格",每个表对应一个业务实体(如用户、商品),有固定的列(字段)和行(记录)。 | 冷藏库中的 "货架"(专门放一类食材) | 在mybatis数据库中创建users表(存储用户数据) |
| 字段(Column) | 表中的 "列",定义数据的类型和含义,每个字段有唯一名称和数据类型(如整数、字符串)。 | 货架上的 "格子标签"(标明格子放什么) | users表的uid(用户 ID,整数)、uname(用户名,字符串)、uage(年龄,整数) |
| 记录(Row) | 表中的 "行",是一条完整的数据,每个记录对应一个实体实例(如一个用户)。 | 货架格子里的 "食材"(具体的物品) | users表中 "uid=1,uname = 张三,uage=20" 就是一条 |
二、常见数据类型
| 数据类型 | 作用 | 实例场景 |
|---|---|---|
| INT | 存储整数(如 ID、年龄、数量),可指定是否自增(AUTO_INCREMENT)。 | uid INT PRIMARY KEY AUTO_INCREMENT(用户 ID 自增) |
| VARCHAR(n) | 存储字符串(如姓名、地址、标题),n 表示最大长度(如 VARCHAR (20) 最多存 20 个字符)。 | uname VARCHAR(20) NOT NULL(用户名非空,最多 20 字) |
| DATE | 存储日期(格式:YYYY-MM-DD),如生日、订单日期。 | birthday DATE(用户生日) |
| DATETIME | 存储日期 + 时间(格式:YYYY-MM-DD HH:MM:SS),如登录时间、创建时间。 | create_time DATETIME(用户注册时间) |
| DECIMAL(m,n) | 存储小数(如价格、金额),m 表示总位数,n 表示小数位数。 | price DECIMAL(10,2)(商品价格,最多 10 位,2 位小数) |
重要规则:必须明确指定字段是否允许为空(NOT NULL)。例如:
- 用户名(uname)必须设为NOT NULL,这是区分用户的必要字段;
- 用户备注(remark)可保留为空(默认允许),因为并非所有用户都需要填写备注。
三、SQL 基础语法与操作
SQL 的核心操作可以概括为 "CRUD"(Create 新增、Read 查询、Update 修改、Delete 删除),这也是 MyBatis 映射文件中最常用的四种 SQL 类型。我们以 users 表为例进行说明,该表结构包含:uid(INT 类型,主键自增)、uname(VARCHAR(20),非空字段)和 uage(INT,非空字段)。接下来将详细讲解每种操作的语法和实际应用案例。
1. 准备工作:创建数据库和表
右键点击 "本地 MySQL"→ 选择 "新建数据库":
- 数据库名:
eg; - 字符集:选择
utf8mb4(支持所有中文和特殊字符,避免乱码); - 排序规则:默认
utf8mb4_general_ci; - 点击 "确定",
eg数据库创建完成。
可视化工具的左侧导航栏是 "缓存显示",不是实时刷新的,需要手动刷新。
- 选中左侧导航栏中连接的 MySQL 实例;
- 右键点击该实例,选择 "刷新"(或按快捷键
F5); - 刷新后,在实例下的 "数据库" 目录中,就能看到 eg 数据库了。
右键点击 eg 数据库→ 选择 "新建查询",打开 SQL 编辑窗口;
先执行以下 SQL,创建后续操作所需的 "仓库" 和 "货架",这是所有实操的前提:
sql
-- 1. 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS eg;
-- 2. 使用该数据库(相当于"打开冷藏库")
USE eg;
-- 3. 创建users表(相当于"在冷藏库中放一个用户货架")
CREATE TABLE IF NOT EXISTS users (
uid INT PRIMARY KEY AUTO_INCREMENT, -- 主键(唯一标识一条记录),自增
uname VARCHAR(20) NOT NULL, -- 用户名,非空
uage INT NOT NULL -- 年龄,非空
);
选中所有 SQL,点击工具栏 "运行"(或按 Ctrl+R),下方提示 "执行成功";

刷新 eg 数据库下的 "表",就能看到 users 表。
2. 新增(Create):向表中插入数据
作用:往表中添加一条或多条新记录(如新增一个用户)。
格式如下:
sql
INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...);
-- 说明:1. 字段顺序需与值顺序一致;2. 字符串和日期值需用单引号包裹;3. 自增字段(如uid)可省略不写,数据库会自动生成
实例:
sql
-- 新增1个用户(uid自增,不用写)
INSERT INTO users(uname, uage) VALUES('张三', 20);
-- 新增多个用户(用逗号分隔多个VALUES)
INSERT INTO users(uname, uage) VALUES('李四', 18), ('王五', 22);

注:ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;的作用是修改users表的字符集为utf8mb4,并设置排序规则为utf8mb4_general_ci,让表能支持中文存储。uid 为7 8 9是因为手动删除了前六个数据。
3. 查询(Read):从表中获取数据
从表中筛选、获取需要的数据(如查所有用户、查年龄大于 20 的用户),是 SQL 中最常用、最灵活的操作。
语法:
sql
SELECT 字段1, 字段2, ... FROM 表名 WHERE 条件;
-- 说明:1. 用"*"表示查询所有字段;2. WHERE后接筛选条件(可选,不写则查所有记录);3. 可加ORDER BY排序(可选)
(1)查询所有记录
sql
-- 查询users表所有字段的所有记录
SELECT * FROM users;
结果:查询 users 表中所有用户的用户ID(uid)、用户名(uname)和年龄(uage)信息。
(2)查询指定字段
sql
-- 只查询用户名和年龄,不查uid
SELECT uname, uage FROM users;
结果:返回的记录只有 uname 和 uage 两列,减少数据传输量。

(3)带条件查询(核心)
用 WHERE 指定筛选条件,支持 "等于(=)、大于(>)、小于(<)、不等于(!=)、模糊查询(LIKE)" 等条件:
sql
-- 1. 查uid=7的用户(精准查询,常用)
SELECT * FROM users WHERE uid = 7; -- 结果:只返回张三的记录
-- 2. 查年龄大于18的用户
SELECT * FROM users WHERE uage > 18; -- 结果:返回张三(20)、王五(22)的记录
-- 3. 查用户名包含"李"的用户(模糊查询,%表示任意字符)
SELECT * FROM users WHERE uname LIKE '%李%'; -- 结果:返回李四的记录
以第二条语句为例:

(4)排序查询
使用 ORDER BY 字段名 [ASC|DESC] 进行排序:ASC 表示升序排列(默认方式,如年龄从小到大);DESC 表示降序排列(如年龄从大到小)。
sql
-- 按年龄升序查询所有用户(年轻的在前)
SELECT * FROM users ORDER BY uage ASC;
4. 修改(Update):更新表中已有数据
作用:修改表中符合条件的记录(如将张三的年龄改为 21)。
语法:
sql
UPDATE 表名 SET 字段1=新值1, 字段2=新值2, ... WHERE 条件;
-- 关键警告:必须加WHERE条件!否则会修改表中所有记录(如没加条件会把所有用户的年龄都改成21)
示例:
sql
-- 将uid=7的用户(张三)的年龄改为21
UPDATE users SET uage = 21 WHERE uid = 7;
-- 同时修改用户名和年龄(将uid=8的用户改为"李小四",年龄19)
UPDATE users SET uname = '李小四', uage = 19 WHERE uid = 8;

5. 删除(Delete):删除表中记录
作用:删除表中符合条件的记录(如删除 uid=9 的用户)。
语法:
sql
DELETE FROM 表名 WHERE 条件;
-- 关键警告:1. 必须加WHERE条件!否则会删除表中所有记录(清空表);2. 删除后数据无法恢复,需谨慎操作
示例:
sql
-- 删除uid=9的用户(王五)
DELETE FROM users WHERE uid = 9;

补充:如果需要 "清空表并重置自增字段"(如删除所有用户,且让下一个新增用户的 uid 从 1 开始),可用 TRUNCATE:
sql
TRUNCATE TABLE users; -- 清空users表,uid重置为1(注意:这是删除表中所有记录,无法恢复)
四、SQL 基础核心规范
SQL 规范旨在提高代码的可读性、可维护性和性能。以下是一些核心规范,读者可简要了解。
命名规范
- 表名、字段名使用小写字母,单词间用下划线分隔,例如
user_info。 - 避免使用 SQL 关键字作为表名或字段名,如
order、group。 - 主键通常命名为
id,外键命名为关联表名_id,如user_id。
语法规范
-
关键字使用大写,例如
SELECT、FROM、WHERE。 -
缩进和对齐保持一致,子句换行书写:
sqlSELECT id, user_name, email FROM user_info WHERE status = 'active' -
避免使用
SELECT *,明确列出所需字段。
索引规范
- 为频繁查询的字段创建索引,尤其是主键和外键。
- 避免过度索引,索引会降低写入性能。
- 复合索引遵循最左前缀原则。
事务规范
- 事务尽量简短,避免长时间占用锁资源。
- 明确提交或回滚事务,避免隐式提交。
- 使用
BEGIN TRANSACTION、COMMIT、ROLLBACK控制事务边界。
性能优化
- 使用
EXPLAIN分析查询执行计划。 - 避免在
WHERE子句中使用函数或计算,会导致索引失效。 - 分页查询使用
LIMIT和OFFSET,大数据量时考虑游标分页。
安全规范
- 使用参数化查询或预处理语句防止 SQL 注入。
- 避免动态拼接 SQL,必要时严格过滤输入。
- 限制数据库用户权限,遵循最小权限原则。
注释规范
-
复杂查询添加注释说明逻辑。
-
表结构注释使用
COMMENT关键字:sqlCREATE TABLE user_info ( id INT PRIMARY KEY COMMENT '用户ID', user_name VARCHAR(50) COMMENT '用户名' );
遵循这些规范可以显著提升 SQL 代码的质量和效率。
在后续 MyBatis 学习中,我们将涉及"多表查询"内容。下一篇文章将详细介绍 SQL 进阶知识------多表关联与约束。