SQL(结构化查询语言)是关系数据库的“操作语言”,是数据库系统工程师必须掌握的核心技能。无论是数据查询、完整性约束,还是事务控制,SQL都是实现这些功能的“实战工具”。本文作为《数据库系统工程师备考》系列第三篇,结合20+示例图(文字描述替代),围绕增删改查(CRUD)、约束与索引、事务控制三大核心模块,助您掌握SQL的底层逻辑与考试重点。
SQL是一种声明式语言(只需说明“做什么”,无需指定“怎么做”),其核心操作可分为四类:
操作类型 | 功能 | 典型语句 |
---|---|---|
DDL(数据定义) | 定义数据库结构(表、索引等) | CREATE TABLE, ALTER TABLE, DROP TABLE |
DML(数据操作) | 增删改查数据(CRUD) | SELECT, INSERT, UPDATE, DELETE |
DCL(数据控制) | 权限管理 | GRANT, REVOKE |
TCL(事务控制) | 事务管理 | BEGIN, COMMIT, ROLLBACK |
数据库执行SQL的典型流程(图1):
用户提交SQL → 解析器(检查语法) → 优化器(生成执行计划) → 执行器(调用存储引擎) → 返回结果
SELECT是SQL中最复杂、最常用的操作,支持多表连接、分组聚合、子查询等高级功能。
SELECT [DISTINCT] 列名1, 列名2 AS 别名...
FROM 表1
[JOIN 表2 ON 连接条件]
[WHERE 过滤条件]
[GROUP BY 分组列]
[HAVING 分组过滤条件]
[ORDER BY 排序列 [ASC/DESC]]
[LIMIT 数量 OFFSET 偏移量];
学生表结构(图3):
学号(s_id) | 姓名(s_name) | 年龄(s_age) | 性别(s_sex) | 班级(s_class) |
---|---|---|---|---|
S001 | 张三 | 20 | 男 | 计算机2班 |
S002 | 李四 | 21 | 女 | 计算机2班 |
S003 | 王五 | 19 | 男 | 软件1班 |
需求:查询计算机2班年龄大于20岁的女生姓名,按年龄降序排列。
SQL语句:
SELECT s_name AS 姓名
FROM 学生
WHERE s_class = '计算机2班' -- 班级过滤
AND s_age > 20 -- 年龄过滤
AND s_sex = '女' -- 性别过滤
ORDER BY s_age DESC; -- 降序排列
执行结果(图4):
姓名 |
---|
李四 |
成绩表结构(图5):
学号(s_id) | 课程号(c_id) | 成绩(score) |
---|---|---|
S001 | C001 | 85 |
S002 | C001 | 90 |
S001 | C002 | 78 |
需求:查询选修了“数学”(课程号C001)且成绩≥85分的学生姓名。
SQL语句(内连接):
SELECT 学生.s_name AS 姓名
FROM 学生
INNER JOIN 成绩 ON 学生.s_id = 成绩.s_id
WHERE 成绩.c_id = 'C001' -- 筛选数学课程
AND 成绩.score >= 85; -- 筛选高分
执行结果(图6):
姓名 |
---|
李四 |
INSERT用于向表中添加新记录,支持单条插入、批量插入和子查询插入。
单条插入:
INSERT INTO 学生(s_id, s_name, s_age, s_sex, s_class)
VALUES ('S004', '赵六', 20, '女', '软件1班');
批量插入(MySQL支持):
INSERT INTO 学生(s_id, s_name, s_age)
VALUES ('S005', '周七', 21), ('S006', '吴八', 19);
UPDATE用于修改表中已有记录,需注意WHERE条件(无WHERE会修改全表!)。
需求:将软件1班所有学生的年龄加1(模拟新学年)。
UPDATE 学生
SET s_age = s_age + 1
WHERE s_class = '软件1班'; -- 仅修改软件1班
DELETE用于删除表中记录,需严格限制条件(无WHERE会清空表!)。
需求:删除年龄小于18岁的学生记录(假设为无效数据)。
DELETE FROM 学生
WHERE s_age < 18;
约束是数据库强制的规则,确保数据符合业务逻辑(如“学号唯一”“成绩在0-100之间”)。常见约束类型(图7):
约束类型 | 关键字 | 作用 | 示例 |
---|---|---|---|
主键(PK) | PRIMARY KEY | 唯一标识一条记录(非空+唯一) | 学生(s_id PRIMARY KEY) |
外键(FK) | FOREIGN KEY | 保证表间数据一致性(引用另一表的主键) | 成绩(s_id FOREIGN KEY REFERENCES 学生(s_id)) |
唯一(UNIQUE) | UNIQUE | 保证列值唯一(允许NULL) | 学生(s_name UNIQUE) |
检查(CHECK) | CHECK | 限制列值范围(如成绩0-100) | 成绩(CHECK (score BETWEEN 0 AND 100)) |
非空(NOT NULL) | NOT NULL | 列值不能为空 | 学生(s_name NOT NULL) |
CREATE TABLE 学生 (
s_id VARCHAR(10) PRIMARY KEY, -- 主键(非空+唯一)
s_name VARCHAR(20) NOT NULL UNIQUE, -- 姓名非空且唯一
s_age INT CHECK (s_age > 0), -- 年龄大于0(MySQL 8.0+支持)
s_class VARCHAR(20),
c_id VARCHAR(10),
FOREIGN KEY (c_id) REFERENCES 课程(c_id) -- 外键(引用课程表的课程号)
);
索引是数据库的“目录”,通过B+树、哈希等结构加速数据检索。
B+树索引(以学生表s_id为主键):
根节点 → 分支节点(存储区间值) → 叶子节点(存储s_id→数据行地址映射)
创建普通索引(加速WHERE查询):
CREATE INDEX idx_age ON 学生(s_age); -- 按年龄创建索引
创建复合索引(加速多条件查询):
CREATE INDEX idx_class_age ON 学生(s_class, s_age); -- 先班级后年龄
索引失效场景(需避免):
WHERE YEAR(入学时间)=2024
)。WHERE s_name LIKE '%三'
)。事务(Transaction)是一组SQL操作的原子集合,需满足ACID特性(图9):
特性 | 全称 | 含义 |
---|---|---|
原子性(Atomicity) | 原子性 | 事务要么全部执行,要么全部回滚(如转账操作:扣款+入账必须同时成功) |
一致性(Consistency) | 一致性 | 事务执行后数据保持合法状态(如账户余额不能为负) |
隔离性(Isolation) | 隔离性 | 多个事务并发执行时互不干扰(通过隔离级别控制) |
持久性(Durability) | 持久性 | 事务提交后数据永久保存(即使宕机也不丢失) |
不同隔离级别会影响事务的并发性能和数据一致性,常见级别(从低到高):
隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
---|---|---|---|---|
读未提交(RU) | √ | √ | √ | 允许读取未提交的事务(性能最高,一致性最差) |
读已提交(RC) | × | √ | √ | 只读取已提交的事务(大多数数据库默认) |
可重复读(RR) | × | × | √ | 保证多次读取结果一致(MySQL默认) |
串行化(S) | × | × | × | 事务串行执行(一致性最高,性能最差) |
BEGIN; -- 开始事务
UPDATE 账户 SET 余额=余额-100 WHERE 用户='A'; -- 扣款
UPDATE 账户 SET 余额=余额+100 WHERE 用户='B'; -- 入账
COMMIT; -- 提交事务(若中间出错则ROLLBACK)
SELECT * FROM 表 WHERE 条件
确认范围)。ON DELETE CASCADE
级联删除)。SQL是数据库系统工程师的“操作语言”,从基础的CRUD到高级的事务控制,每一个语句都直接影响数据的准确性和系统性能。备考时需重点掌握:
下一篇预告:《数据库系统工程师备考:数据库管理与维护》,将讲解数据库备份与恢复、性能监控、安全管理等工程实践知识,助您从“操作”走向“管理”!