数据库的含义
数据库(Database)是管理和储存数据的库。
常用的数据库有oracle、mysql…
测试人员学习数据库的必要性
- 数据验证:测试需验证应用与数据库交互的准确性,确保数据增删改查(CRUD)符合预期。
- 建构数据:使用数据库可以高效模拟大量的测试数据,比如需要测用户有100个订单,可以在数据库直接生成。
- 缺陷定位:通过直接查询数据库可快速定位数据层问题(如事务未提交、字段类型不符)。
常用SQL语言分类及示例
DDL(数据定义语言)
用于定义或修改数据库、表、列: - 查询所有数据库:show databases;
- 创建数据库:create database (if not exists)表名;
- 删除数据库:drop database (if exists)表名;
- 使用数据库:use 表名;
- 创建数据表:create table 表名(字段1 数据类型1, 字段2 数据类型2... 字段n 数据类型n);
- 删除数据表:drop table 表名
复制代码常用的数据类型:
DML(数据操作语言)
用于对数据增加,修改,删除: - INSERT INTO 表名 (字段1,字段2...字段n) VALUES ('值1','值2'...'值n');
- UPDATE 表名 SET name = 'Bob' WHERE id = 1;
- DELETE FROM 表名 WHERE 列名='值';
复制代码DQL(数据查询语言)
用于数据查询,分为简单查询、条件查询和高级查询。
select * from 表(where 条件)(group by 列 having 条件)(order by 列 asc/desc)(limit 开始索引,每页条数);
(1)简单查询:- 查询全部列 SELECT * FROM 表名 ;
- 查询部分列 SELECT 列名1,列名2 FROM 表名 ;
- 列别名 select 列名1 as a,列名2 as b FROM 表名 ;
复制代码(2)条件查询:
条件运算符
- -- 1)查询性别为女,并且年龄小于50的记录
- select * from t_student where s_gender ='female' and s_age <50;
- -- 2)查询学号为S_1001,或者姓名为liSi的记录
- select * from t_student where s_number ='S_1000' or s_name ='liSi';
- -- 3)查询学号为S_1001,或者姓名为liSi且性别为female的记录
- select * from t_student where s_number ='S_1000' or s_name ='liSi' and s_gender ='female';
- select * from t_student where s_number ='S_1000' (or s_name ='liSi' and s_gender ='female');
- -- 调整优先级
- select * from t_student where (s_number ='S_1000' or s_name ='liSi') and s_gender ='female';
- -- 4)查询学号为S_1001,S_1002,S_1003的记录
- select * from t_student where s_number ='S_1001' or s_number ='S_1002' or s_number ='S_1003';
- -- 用in改造多选一
- select * from t_student where s_number in ('S_1001','S_1002','S_1003');
- -- 5)查询学号不是S_1001,S_1002,S_1003的记录
- select * from t_student where s_number not in ('S_1001','S_1002','S_1003','S_12843245');
- select * from t_student where s_number != 'S_1001' and s_number != 'S_1002' and s_number != 'S_1003'and s_number != 'S_12843245';
- -- 6)查询年龄为null的记录
- select * from t_student where s_age is null;-- 查询null
- select * from t_student where s_gender = '';-- 查询空值
- -- 7)查询年龄不为null的学生记录
- select * from t_student where s_age is not null;-- 查询非null
- -- 8)查询年龄在20到40之间的学生记录
- select * from t_student where s_age BETWEEN 20 and 40;
- select * from t_student where s_age >= 20 and s_age <=40;
复制代码(3)高级查询:- -- (1)模糊查询 关键词like _代表一个字符,%代表多个或者0个字符
- -- 1)查询姓名由5个字母构成的学生记录
- select * from t_student where s_name like '_____';
- -- 2)查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
- select * from t_student where s_name like '____i';
- -- 3)查询姓名以“z”开头的学生记录
- select * from t_student where s_name like 'z%';
- -- 4)查询姓名中第2个字母为“i”的学生记录
- select * from t_student where s_name like '_i%';
- -- 5)查询姓名中包含“a”字母的学生记录
- select * from t_student where s_name like '%a%';
- -- (2)排序查询 关键词 order by asc 升序默认 desc 降序 null值列最小的
- -- 1)查询所有学生记录,按年龄升序排序
- select * from t_student order by s_age asc;
- -- 2)查询所有学生记录,按年龄降序排序
- select * from t_student order by s_age desc;
- -- 拓展 字符 编码 ASCII码 => unicode(万国码)utf-8 所以中文通常排在字母后面
- select * from t_student order by s_name desc;
- -- 多列排序
- select * from t_student order by s_gender , s_age desc;
- -- (3)聚合查询 关键词count/max/min/sum/avg
- /*
- count(列名) 统计数量(一般选用不为nuLL的列)
- max(列名) 最大值
- min(列名) 最小值
- sum(列名) 求和
- avg(列名) 平均值 */
- -- 1)查询emp表中记录数
- select count(*) from emp;
- -- 2)查询emp表中有佣金的人数
- select count(comm) from emp;
- -- 3)查询emp表中月薪大于2500的人数
- select count(*) from emp where sal>2500;
- -- 4)查询雇员月薪 ,公式为月薪=工资sal+佣金comm
- select ename,sal,comm,sal+ifnull(comm,0) from emp;
- select sum(sal+ifnull(comm,0)) as '工资+薪水' from emp;
- -- 5)统计所有员工平均工资
- select avg (sal) from emp;
- -- 6)查询最高工资和低工资
- select max(sal),min(sal) from emp;
- select max(sal) as 最高,min(sal) as 最低,sum(sal) as 总发工资 from emp;
- -- (4)分组查询 关键词group by having 过滤
- -- 1)查询每个部门员工人数
- select deptno from emp group by deptno;
- select deptno,count(*) from emp group by deptno;
- -- 2)查询每个部门员工工资总额
- select deptno,sum(sal+ifnull(comm,0)) from emp group by deptno;
- -- 3)查询部门员工工资总额平均工资,且平均工资大于2000,并按照平均工资从低到高排序
- select deptno,sum(sal),avg(sal) from emp group by deptno having avg(sal)>2000 order by avg(sal) asc;
- -- (5)分页查询 关键词limit 开始的位置页码-1*条数,每页的条数
- select * from emp limit 0,2; -- 第一页
- select * from emp limit 2,2; -- 第二页
- select * from emp limit 4,2; -- 第三页
- -- (6)去重操作 关键词DISTINCT
- -- 查询公司有哪些岗位?
- select distinct job from emp;
- -- 反例 去重失败
- select distinct * from emp;
- -- 分组效率比distinct高
- select job from emp group by job;
- /*distinct 和分组区别?
- 1.分组效率比distinct高
- 2.分组可以做聚合,比如排序,合计;但是distinct 不能
- */
- -- (7)子查询
- -- 1)查询部门名称是SALES的员工的编号和姓名
- -- 先查询sales部门的编号
- select deptno from dept where dname='销售部';
- -- 根据编号确定sales员工编号和姓名
- select empno,ename from emp where deptno=(select deptno from dept where dname='销售部');
- -- 2)查询工资大于BLAKE的员工信息
- -- 先找到blake的工资
- select sal from emp where ename= 'blake';
- -- 再查询比blake工资高的员工信息
- select * from emp where sal>(select sal from emp where ename= 'blake');
- -- 3)查询有员工工资大于1500的部门信息**`(in 关键字)`**
- -- 先找到工资大于1500的员工
- select distinct deptno from emp where sal>1500;
- -- 再查询这些员工的部门信息
- select dname from dept where deptno in (select distinct deptno from emp where sal>1500);
复制代码简单查询–单纯查看某一列、所有列
条件查询–要对表里的数据做筛选时,in/ between and /like/is null/and /or 大于小于
高级查询:
模糊查询–用于不确定数据的全称时,找相似 like
排序查询–排序 order by 列 asc
聚合查询–需要对数据做计算时,count/max/min/sum/avg 常和分组group by配合使用
分组查询–对数据分组group by ,分组后的条件过滤必须用having
分页查询–只展示某一页的信息 limit
去重查询–需要去掉重复项时 distinct
子查询–两个或者多个表数据要交互/需要分步进行的用嵌套,先找出子集,然后用更大级去套子集。
测试中的高频场景
子查询–两个或者多个表数据要交互/需要分步进行的用嵌套,先找出子集,然后用更大级去套子集。
测试中的高频场景
- 事务测试:验证COMMIT和ROLLBACK行为。
- 索引验证:检查索引是否加速查询。
- 约束测试:如主键冲突、外键约束。
- 数据一致性:比较应用界面与数据库实际存储是否一致。
掌握数据库操作可显著提升测试覆盖率和效率,尤其在接口测试和数据驱动测试中。 |