数据库的含义
·
数据库的含义
数据库(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行为。 -
索引验证:检查索引是否加速查询。
-
约束测试:如主键冲突、外键约束。
-
数据一致性:比较应用界面与数据库实际存储是否一致。
去重查询--需要去掉重复项时 distinct
子查询–两个或者多个表数据要交互/需要分步进行的用嵌套,先找出子集,然后用更大级去套子集。
测试中的高频场景
- 事务测试:验证
COMMIT和ROLLBACK行为。 - 索引验证:检查索引是否加速查询。
- 约束测试:如主键冲突、外键约束。
- 数据一致性:比较应用界面与数据库实际存储是否一致。
掌握数据库操作可显著提升测试覆盖率和效率,尤其在接口测试和数据驱动测试中。
更多推荐
所有评论(0)