软件测试工程师必备 SQL 完整学习笔记
摘要:SQL 是软件测试工程师的核心基础技能,接口测试、数据校验、bug 定位、构造测试数据都离不开 SQL。本文面向测试人员,从基础概念、语法分类、常用语句、测试实战场景、注意事项做完整整理,适合面试复习、日常工作查阅。
标签:SQL软件测试MySQL测试工程师接口测试
一、SQL 介绍
SQL(Structured Query Language,结构化查询语言),是管理和操作关系型数据库的标准语言,可以完成数据查询、新增、更新、删除等操作,常见如 MySQL 数据库。
🧪 对测试工程师的意义
我们在前端做下单、注册等操作,后端数据库会同步发生变化。
测试人员不能只依赖前端页面展示结果,可以直接执行 SQL 查询数据库,校验底层数据是否符合预期。
SQL 语法特征
- 大小写不敏感:
SELECT和select效果一样;行业习惯关键字大写提升可读性。 - 语句结尾分号:单行 / 多行书写,末尾使用
;结束。 - 子句结构化:由不同子句组成,
FROM指定表,WHERE指定过滤条件。 - 注释写法
-- 单行注释 /* 多行注释 可以写多行内容 */测试工程师的 SQL 使用场景
- ✅ 数据验证(核心)
测试注册功能,查询用户表确认用户信息正确插入;测试支付流程,校验订单表、余额表金额、订单状态。 - ✅ 后端 & 接口测试
接口只返回 “操作成功”,但不确定底层数据是否全部落库;通过 SQL 查询数据库,校验接口完整数据操作结果。 - ✅ 缺陷定位与分析
出现 bug 快速区分问题层级:
- 如果数据库数据本身错误 → 业务逻辑 / 后端问题
- 如果数据库数据正确,前端显示异常 → 前端展示或者接口传输问题
- ✅ 构造测试数据
构造很难通过前端操作生成的数据:过期订单、特殊状态用户,直接使用INSERT、UPDATE语句可以高效、精准地构造这些数据。 - ✅ 数据迁移测试
新旧系统切换,校验迁移后数据完整性、一致性。
SQL通用语法及分类
由于数据库管理系统(数据库软件)功能非常多,不仅仅是存储数据,还要包含:数据的管理、表的管理、库的管理、账户管理、权限管理等等。
所以,操作数据库的SQL语言,也基于功能,可以划分为4类:
| 分类 | 全称 | 作用 | 测试重点 |
|---|---|---|---|
| DDL | 数据定义语言 | 定义数据库、表、字段、索引结构 | 了解,一般测试没有权限执行 |
| DML | 数据操作语言 | 对表里数据做新增、删除、修改 | ⭐⭐⭐⭐⭐ 高频造数、改测试数据 |
| DQL | 数据查询语言 | 查询表中记录数据 | ⭐⭐⭐⭐⭐ 日常校验、定位 bug 最常用 |
| DCL | 数据控制语言 | 创建用户、分配权限、管理账号 | 了解,DBA 运维负责 |
三、DDL 数据定义语言(库、表、索引操作)
⚠️ 提示:生产环境测试账号一般没有 DDL 权限,本地练习环境使用。
常用关键字:SHOW、USE、CREATE、DROP、ALTER
- 数据库操作
-- 查看所有数据库 SHOW DATABASES;-- 使用指定数据库 USE 数据库名;-- 创建数据库,设置utf8字符集 CREATE DATABASE[IF NOT EXISTS]db_name CHARSET utf8;-- 删除数据库 DROP DATABASE[IF EXISTS]db_name;- 数据表操作
-- 查看当前库下所有表 SHOW TABLES;-- 查看表结构 DESC 表名;-- 删除表 DROP TABLE[IF EXISTS]表名称;-- 创建表示例 CREATE TABLE student(idINT, sn INT COMMENT'学号', name VARCHAR(20)COMMENT'姓名', qq_mail VARCHAR(20)COMMENT'QQ邮箱')COMMENT'学生表';-- 修改表:添加字段 ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT'注释'];-- 修改字段数据类型 ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);-- 修改字段名+字段类型 ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型(长度)[COMMENT'注释'];-- 删除字段 ALTER TABLE 表名 DROP 字段名;-- 修改表名 ALTER TABLE 表名 RENAME TO 新表名;3. 索引操作
索引相当于书籍目录,加快查询速度
-- 创建索引 CREATE INDEX idx_username ON users(username);-- 查看表索引 SHOW INDEX FROMusers;-- 删除索引 DROP INDEX idx_username ONusers;四、DML 数据操作语言:新增、删除、修改数据
测试造测试数据高频使用!切记:生产环境禁止直接执行 delete/update
1. INSERT 插入数据
-- 指定列插入 INSERT INTO student(id,sn,name,qq_mail)VALUES(001,2019001,'张三','223389546');-- 全列插入,值顺序必须和表字段顺序完全对应 INSERT INTO student VALUES(002,2019002,'李四','12345678');-- 插入部分字段,未赋值字段为NULL INSERT INTO student(id,name)VALUES(003,'王五');-- 批量插入多条记录 INSERT INTO student(id,sn,name)VALUES(004,2019004,'赵六'),(005,2019005,'钱七');- DELETE 删除数据
-- 带条件删除(推荐!) DELETE FROM 表名 WHERE 列名=值;-- 删除表全部数据(逐行删除,日志会记录) DELETE FROM 表名;-- 清空整张表,删除重建表结构,速度快 TRUNCATE TABLE 表名;3. UPDATE 更新数据
⚠️ 不带 where 条件会修改全表所有行!操作前先用 SELECT 校验 where 条件!
-- 带条件修改(实际工作使用) UPDATE 表名 SET 列名=值 WHERE 列名=值;-- 危险:不带条件,修改整张表所有记录,严禁生产执行 UPDATE 表名 SET 列名=值;五、DQL 数据查询语言【测试最高频】
查询语法,测试校验数据、定位 bug 必学。
基础简单查询
-- 查询指定列 SELECT id,name FROM student;-- 查询全部列 SELECT * FROM student;-- 设置别名 as可以省略 SELECT pname AS pn FROM product;SELECT p.pname FROM product AS p;-- 查询做运算 SELECT pname, price+10 FROM product;条件查询WHERE
-- between and 区间查询 SELECT * FROM student WHERE age BETWEEN20AND30;--in在集合内 SELECT * FROM student WHERE age IN(18,22,25);-- is not null 不为空 SELECT * FROM student WHERE english IS NOT NULL;-- distinct 去重 SELECT DISTINCT NAME FROM student;-- like模糊查询 -- % 匹配任意多个字符,_匹配单个字符 SELECT * FROM student WHERE NAME LIKE'李%';--姓李 SELECT * FROM student WHERE NAME LIKE'_英%';--第二个字是英 SELECT * FROM student WHERE NAME LIKE'%英%';--名字包含英排序 ORDER BY
ASC升序(默认),DESC降序;多字段排序,前面条件相同时才走后面条件
SELECT * FROM person ORDER BY math;--升序 SELECT * FROM person ORDER BY math DESC;--降序 SELECT * FROM person ORDER BY math DESC, english ASC;聚合函数(纵向统计)
count()统计行数max()最大值min()最小值sum()求和avg()平均值
SELECT COUNT(*)FROM Employee;SELECT MAX(Age)FROM Employee;SELECT MIN(Age)FROM Employee;SELECT SUM(Salary)FROM Employee;SELECT AVG(Salary)FROM Employee;分组查询 GROUP BY
where分组前过滤;having分组之后过滤,having 可以使用聚合函数,where 不能
-- 按性别分组,查询平均分 SELECT sex , AVG(math)FROM student GROUP BY sex;-- 分数大于70再分组,分组后组内人数大于2才展示 SELECT sex , AVG(math),COUNT(id)FROM student WHERE math>70GROUP BY sex HAVING COUNT(id)>2;分页 LIMIT(MySQL 方言)
公式:
开始索引 = (页码-1)*每页条数
-- 每页3条 SELECT * FROM student LIMIT0,3;--第1页 SELECT * FROM student LIMIT3,3;--第2页 SELECT * FROM student LIMIT6,3;--第3页多表连接查询
隐式内连接 where
SELECT t1.name,t1.gender,t2.name FROM emp t1,dept t2 WHERE t1.dept_id=t2.id;显式内连接 inner join
SELECT * FROM emp INNER JOIN dept ON emp.dept_id=dept.id;左外连接 LEFT JOIN
保留左表全部数据,匹配不到右表字段为 null
SELECT t1.*,t2.name FROM emp t1 LEFT JOIN dept t2 ON t1.dept_id=t2.id;右外连接 RIGHT JOIN
保留右表全部数据
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.dept_id=t2.id;子查询(查询嵌套查询)
-- 标量子查询,单行单列 SELECT * FROM emp WHERE emp.salary=(SELECT MAX(salary)FROM emp);-- 多行单列子查询配合in SELECT * FROM emp WHERE dept_id IN(SELECTidFROM dept WHERE NAME IN('财务部','市场部'));-- 多行多列子查询,作为虚拟表 SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.join_date>'2011-11-11')t2 WHERE t1.id=t2.dept_id;六、DCL 权限管理(了解)
一般测试人员不会操作,DBA 运维使用。
-- 创建用户 CREATEUSER'test_user'@'%'IDENTIFIED BY'SecurePass123!';-- 删除用户 DROPUSER'test_user'@'%';-- 查询权限 SHOW GRANTS FOR'test_user'@'%';-- 授予查询权限 GRANT SELECT ON test_db.* TO'test_user'@'%';-- 回收权限 REVOKE SELECT ON test_db.* FROM'test_user'@'%';七、测试工程师 SQL 最佳实践 & 注意事项
- 禁止生产直接执行
UPDATE/DELETE,仅在测试环境执行; - 先 SELECT 校验,再 DML 修改:写好 where 条件先用 select 确认数据,确认无误再 update/delete;
- 测试修改数据可以使用事务,执行完可以回滚不改动真实数据
BEGIN TRANSACTION;-- 这里写update delete测试语句 ROLLBACK;--回滚,放弃修改 -- COMMIT;--确认提交修改4.客户端工具推荐:DBeaver(免费)、Navicat、MySQL Workbench,语法高亮、可视化结果集,提升测试效率
八、写在最后
对于软件测试岗位:
✅ DQL 查询语句是重中之重,面试高频考点;
✅ DML 主要用来构造测试数据;
✅ DDL/DCL 了解概念即可,工作中很少会给到权限。
掌握 SQL,可以让你从只会点点点的手工测试,进阶到接口、自动化测试,是测开岗位必备基础。
版权声明:本文为个人学习整理笔记,仅供学习参考。