乐于分享
好东西不私藏

软件测试必懂SQL全集|从零到实战,日常查数据、造数据、查bug全覆盖

软件测试必懂SQL全集|从零到实战,日常查数据、造数据、查bug全覆盖
📢测试有方 · 干货第68期
编辑:f | 适用人群:功能测试/接口测试/自动化测试零基础、进阶测试工程师

💬前言

很多测试小伙伴经常吐槽:
  • 不会写SQL,只能等着开发帮忙查数据,工作效率极低
  • 接口返回数据不对,不会核对数据库底层数据,定位不了bug
  • 造测试数据太慢,不会批量插入,加班造数据成为常态
  • 一不小心写错删改语句,差点删库跑路,心慌一整天
作为软件测试工程师,SQL是刚需技能,不用精通开发级复杂语句,只要吃透日常高频语法,就能搞定99%的测试工作场景
今天【测试有方】整理了测试人员专属完整版SQL教程,全程贴合测试真实工作:数据校验、造测试数据、排查异常订单、联表对账、清理脏数据、定位接口bug,所有代码直接复制就能跑,零基础也能一键上手!

📌一、测试先须知:数据库基础+测试操作红线

1. 测试常用核心名词

  • 数据库:独立业务库,比如订单库、用户库、支付库
  • 数据表:拆分业务数据,用户表、订单表、流水表
  • 字段:表内具体数据,用户名、手机号、订单状态、创建时间
  • 主键:数据唯一标识,精准定位单条测试数据
  • 事务:下单、支付联动业务,测试数据回滚、异常场景必备

2. 测试SQL操作红线

绝对禁止线上执行以下语句:

1. DELETE / UPDATE 不带WHERE条件(全表清空/全表修改,线上重大事故)

2. 线上随意执行TRUNCATE清空整张数据表

3. 大表不加LIMIT全表查询,直接拖垮数据库,接口全部超时

通用规范:改数据前,先用SELECT查询核对数据,无误再执行更新/删除

🗂️二、DDL库表操作:测试临时建表、改表结构

使用场景:搭建临时测试表、验证接口新增字段兼容性、备份业务数据表

sql-- 查看所有数据库SHOW DATABASES;-- 切换业务库(所有SQL执行前必写)USE order_db;-- 查看库内所有数据表SHOW TABLES;-- 查看表结构(日常高频:核对字段类型、长度、是否允许为空)DESC user_info;-- 快速复制表结构+数据(备份线上数据到测试库)CREATE TABLE user_info_bak AS SELECT * FROM user_info;-- 只复制表结构,不复制数据CREATE TABLE user_info_temp LIKE user_info;-- 新增字段(验证接口新增字段兼容)ALTER TABLE user_info ADD email VARCHAR(100) COMMENT '邮箱';

🔍三、DML核心增删改查(测试90%工作都用这里)

重中之重!测试日常查数据、造数据、改状态、清脏数据全部依赖这部分语法

1. SELECT 查询语句(测试最最最高频!数据核对、bug排查)

✅ 基础查询

sql-- 指定字段查询(工作规范,禁止无脑SELECT *)SELECT id,user_name,phone,status FROM user_info;-- 结果去重(排查重复注册、重复订单bug)SELECT DISTINCT phone FROM user_info;-- 分页查询(防止查询数据过多卡死工具)SELECT * FROM user_info LIMIT 100;

✅ WHERE条件过滤(精准定位异常数据)

常用关键字:=、!=、>、<、AND、OR、IN、LIKE、IS NULL

sql-- 查询指定手机号用户SELECT * FROM user_info WHERE phone = '13800138000';-- 多条件:正常状态 + 成年用户SELECT * FROM user_info WHERE status=1 AND age >= 18;-- 模糊查询:查询所有测试账号SELECT * FROM user_info WHERE user_name LIKE '测试%';-- 查询手机号为空的异常数据(注意:空值不能用=NULL)SELECT * FROM user_info WHERE phone IS NULL;

✅ 排序 + 聚合统计(对账、报表接口测试)

sql-- 查询最新100条订单,倒序查看SELECT * FROM order_info ORDER BY create_time DESC LIMIT 100;-- 聚合函数:统计用户总数、订单总金额SELECT COUNT(*) 用户总数 FROM user_info;SELECT SUM(order_amount) 订单总金额 FROM order_info;-- 分组统计:按天统计每日下单量(对账刚需)SELECT DATE(create_time) 下单日期,COUNT(order_id) 订单数量FROM order_infoGROUP BY DATE(create_time)ORDER BY 下单日期 DESC;

✅ 联表查询(测试高阶必备:排查整条业务链路bug)

业务数据分表存储:用户表、订单表、支付表分离,必须联表核对全流程数据

sql-- 左联三表:查询用户-订单-支付完整链路,找出漏支付异常订单SELECT u.user_name,o.order_id,p.pay_statusFROM user_info uLEFT JOIN order_info o ON u.id = o.user_idLEFT JOIN pay_record p ON o.order_id = p.order_idWHERE DATE(o.create_time) = CURDATE();

2. INSERT 插入数据(批量造测试数据)

sql-- 单条插入测试用户INSERT INTO user_info(user_name,phone,age) VALUES('测试001','13800011111',22);-- 【测试神器】批量插入,一键造多条测试数据INSERT INTO user_info(user_name,phone,age)VALUES('测试002','13800011112',23),('测试003','13800011113',24),('测试004','13800011114',25);

3. UPDATE 更新数据(修改订单状态、重置测试账号)

核心提醒:UPDATE必须加WHERE!!!

sql-- 修改指定用户手机号UPDATE user_info SET phone='13900022222' WHERE id=1001;-- 批量修改所有测试账号为禁用状态UPDATE user_info SET status=0 WHERE user_name LIKE '测试%' LIMIT 200;

4. DELETE 删除数据(清理测试环境脏数据)

测试环境优先逻辑删除(update改状态),尽量少物理删除数据

sql-- 删除单条异常数据DELETE FROM user_info WHERE id=9999;-- 批量清理7天前过期测试数据DELETE FROM order_info WHERE create_time < DATE_SUB(NOW(),INTERVAL 7 DAY) LIMIT 1000;

🧰四、测试高频内置函数

1. 时间函数(使用率最高,时间段查询必备)

sql-- 查询今日所有订单SELECT * FROM order_info WHERE DATE(create_time) = CURDATE();-- 查询近7天订单数据SELECT * FROM order_info WHERE create_time >= DATE_SUB(NOW(),INTERVAL 7 DAY);

2. 状态转换函数(数字状态转文字,对账一目了然)

sql-- 订单状态数字转中文,不用对照文档看懂状态SELECT order_id,CASE order_statusWHEN 0 THEN '待下单'WHEN 1 THEN '待支付'WHEN 2 THEN '已支付'WHEN 3 THEN '已取消'ELSE '异常订单' END AS 订单状态FROM order_info;

🔎五、测试专属实战SQL模板

整理日常工作5大高频场景,收藏这一段,日常工作不用再查语法

模板1:排查已下单但是未支付的漏单bug(高频)

sqlSELECT o.order_id,o.user_id,o.create_timeFROM order_info oLEFT JOIN pay_record p ON o.order_id = p.order_idWHERE p.id IS NULL;

模板2:每日订单对账统计

sqlSELECT DATE(create_time) 日期,COUNT(order_id) 订单数,SUM(order_amount) 交易总额FROM order_infoGROUP BY DATE(create_time)ORDER BY 日期 DESC;

模板3:批量重置所有测试账号状态

sqlUPDATE user_info SET status=1 WHERE user_name LIKE '测试%' LIMIT 500;

模板4:查询接口超时的大数量脏数据

sqlSELECT * FROM order_info WHERE create_time < DATE_SUB(NOW(),INTERVAL 15 DAY);

📊六、MySQL/Oracle/SQLServer语法差异(多数据库项目必看)

功能

MySQL(测试最常用)

Oracle

SQLServer

获取当前时间

NOW()

SYSDATE

GETDATE()

分页查询

LIMIT

ROWNUM

OFFSET FETCH

自增主键

AUTO_INCREMENT

序列SEQUENCE

IDENTITY

❌ 七、测试写SQL避坑10条清单(拒绝删库跑路)

  1. UPDATE、DELETE 永远不要省略WHERE条件
  2. 线上环境严禁使用TRUNCATE清空数据表
  3. 大表查询必须加LIMIT,避免全表扫描压垮服务
  4. 判断空值只能用IS NULL,禁止 = NULL
  5. 尽量不用前后模糊查询%xxx%,不会走索引,接口容易超时
  6. 批量更新、删除一定要加LIMIT分批操作,防止锁表
  7. 时间查询不要用函数包裹索引字段,会导致索引失效
  8. 改数据前先SELECT校验条件,确认无误再执行
  9. 测试环境可以随意操作,线上仅允许只读查询
  10. 复杂修改语句,优先让开发review之后再执行

✍️ 文末小结

对于软件测试工程师而言,不需要写复杂的存储过程、触发器,掌握本文所有语法,足以覆盖功能测试、接口测试、自动化测试、性能测试全部日常数据库场景。
SQL能力直接决定你定位bug的速度、独立工作的能力,摆脱依赖开发查数据的困境,升职加薪第一步,从学好SQL开始!

🎁粉丝福利

后台回复关键词:SQL速查表
免费领取【测试人员SQL极简速查单页】,手机随时翻看,不用再翻长文!
👇点赞+在看,转给身边还在不会写SQL的测试小伙伴~
关注【测试有方】,持续分享测试干货、面试真题、职场技巧,陪你从小白进阶高级测试工程师!