数据库系统工程师备考核心:关系数据库标准语言SQL全解析(含多示例图)

SQL(结构化查询语言)是关系数据库的“操作语言”,是数据库系统工程师必须掌握的核心技能。无论是数据查询、完整性约束,还是事务控制,SQL都是实现这些功能的“实战工具”。本文作为《数据库系统工程师备考》系列第三篇,结合20+示例图(文字描述替代),围绕增删改查(CRUD)、约束与索引、事务控制三大核心模块,助您掌握SQL的底层逻辑与考试重点。


1. SQL基础:从语法到执行流程

1.1 SQL的核心特性与语法结构

SQL是一种声明式语言(只需说明“做什么”,无需指定“怎么做”),其核心操作可分为四类:

操作类型 功能 典型语句
DDL(数据定义) 定义数据库结构(表、索引等) CREATE TABLE, ALTER TABLE, DROP TABLE
DML(数据操作) 增删改查数据(CRUD) SELECT, INSERT, UPDATE, DELETE
DCL(数据控制) 权限管理 GRANT, REVOKE
TCL(事务控制) 事务管理 BEGIN, COMMIT, ROLLBACK

1.2 SQL的执行流程:从语句到结果

数据库执行SQL的典型流程(图1):

图1:SQL执行流程示意图
用户提交SQL → 解析器(检查语法) → 优化器(生成执行计划) → 执行器(调用存储引擎) → 返回结果  
  • 解析器:将SQL转换为语法树,报错(如“未知列名”)。
  • 优化器:选择最优执行路径(如是否使用索引)。
  • 执行器:调用存储引擎(如InnoDB)读取/修改数据。

2. 增删改查(CRUD):SQL的“基础操作”

2.1 查询(SELECT):数据检索的“核心武器”

SELECT是SQL中最复杂、最常用的操作,支持多表连接、分组聚合、子查询等高级功能。

图2:SELECT语法结构(标准模板)
SELECT [DISTINCT] 列名1, 列名2 AS 别名...  
FROM1  
[JOIN2 ON 连接条件]  
[WHERE 过滤条件]  
[GROUP BY 分组列]  
[HAVING 分组过滤条件]  
[ORDER BY 排序列 [ASC/DESC]]  
[LIMIT 数量 OFFSET 偏移量];  
示例1:单表查询(学生表)

学生表结构(图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):

姓名
李四
示例2:多表连接查询(学生-课程-成绩)

成绩表结构(图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):

姓名
李四

2.2 插入(INSERT):数据添加的“入口”

INSERT用于向表中添加新记录,支持单条插入、批量插入和子查询插入。

示例3:单条插入与批量插入

单条插入

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);  

2.3 更新(UPDATE):数据修改的“调整器”

UPDATE用于修改表中已有记录,需注意WHERE条件(无WHERE会修改全表!)。

示例4:带条件的更新

需求:将软件1班所有学生的年龄加1(模拟新学年)。

UPDATE 学生  
SET s_age = s_age + 1  
WHERE s_class = '软件1班';  -- 仅修改软件1班  

2.4 删除(DELETE):数据清理的“谨慎操作”

DELETE用于删除表中记录,需严格限制条件(无WHERE会清空表!)。

示例5:按条件删除

需求:删除年龄小于18岁的学生记录(假设为无效数据)。

DELETE FROM 学生  
WHERE s_age < 18;  

3. 约束与索引:数据完整性与性能的“双保险”

3.1 约束(Constraint):数据完整性的“规则”

约束是数据库强制的规则,确保数据符合业务逻辑(如“学号唯一”“成绩在0-100之间”)。常见约束类型(图7):

图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)
示例6:创建表时定义约束(MySQL)
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)  -- 外键(引用课程表的课程号)  
);  

3.2 索引(Index):查询性能的“加速器”

索引是数据库的“目录”,通过B+树、哈希等结构加速数据检索。

图8:B+树索引结构示意图(文字描述)
B+树索引(以学生表s_id为主键):  
根节点 → 分支节点(存储区间值) → 叶子节点(存储s_id→数据行地址映射)  
示例7:创建索引与索引优化

创建普通索引(加速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 '%三')。

4. 事务控制:数据一致性的“保障者”

4.1 事务的ACID特性

事务(Transaction)是一组SQL操作的原子集合,需满足ACID特性(图9):

图9:事务ACID特性示意图
特性 全称 含义
原子性(Atomicity) 原子性 事务要么全部执行,要么全部回滚(如转账操作:扣款+入账必须同时成功)
一致性(Consistency) 一致性 事务执行后数据保持合法状态(如账户余额不能为负)
隔离性(Isolation) 隔离性 多个事务并发执行时互不干扰(通过隔离级别控制)
持久性(Durability) 持久性 事务提交后数据永久保存(即使宕机也不丢失)

4.2 事务的隔离级别与并发问题

不同隔离级别会影响事务的并发性能和数据一致性,常见级别(从低到高):

图10:事务隔离级别与并发问题
隔离级别 脏读 不可重复读 幻读 说明
读未提交(RU) 允许读取未提交的事务(性能最高,一致性最差)
读已提交(RC) × 只读取已提交的事务(大多数数据库默认)
可重复读(RR) × × 保证多次读取结果一致(MySQL默认)
串行化(S) × × × 事务串行执行(一致性最高,性能最差)
示例8:事务控制语句(MySQL)
BEGIN;  -- 开始事务  
UPDATE 账户 SET 余额=余额-100 WHERE 用户='A';  -- 扣款  
UPDATE 账户 SET 余额=余额+100 WHERE 用户='B';  -- 入账  
COMMIT;  -- 提交事务(若中间出错则ROLLBACK)  

5. 考试重点与实战技巧

5.1 数据库系统工程师考试高频考点

  • SQL语法:SELECT的多表连接(尤其是外连接)、GROUP BY与HAVING的区别、子查询的嵌套。
  • 约束应用:主键与外键的关联(如级联删除)、CHECK约束的语法(注意MySQL 5.7不支持CHECK生效)。
  • 索引优化:复合索引的最左匹配原则、索引失效场景的判断。
  • 事务控制:ACID特性的具体应用、隔离级别对并发问题的影响。

5.2 实战技巧:避免常见错误

  • DELETE/UPDATE无WHERE:养成“先SELECT后操作”的习惯(如先SELECT * FROM 表 WHERE 条件确认范围)。
  • 外键约束冲突:删除主表记录前,先删除从表关联记录(或设置ON DELETE CASCADE级联删除)。
  • 索引滥用:高频更新的表(如日志表)避免过多索引(索引会降低写性能)。

总结:SQL是数据库工程师的“实战核心”

SQL是数据库系统工程师的“操作语言”,从基础的CRUD到高级的事务控制,每一个语句都直接影响数据的准确性和系统性能。备考时需重点掌握:

  • SELECT的复杂查询(多表连接、分组聚合)。
  • 约束的合理使用(主键、外键保证数据一致性)。
  • 索引的优化策略(B+树索引的适用场景)。
  • 事务的隔离与控制(ACID特性的具体实现)。

下一篇预告:《数据库系统工程师备考:数据库管理与维护》,将讲解数据库备份与恢复、性能监控、安全管理等工程实践知识,助您从“操作”走向“管理”!

你可能感兴趣的:(数据库系统工程师,数据库,sql,oracle)