从零开始的软件测试学习之旅(三)一篇搞定基础数据库知识

学习目的:1.几乎所有软件都需要操作数据, 数据都存储在数据库中

2.我们测试软件过程中, 不仅要在界面上操作, 还需检查数据库中的数据, 从而找出更深层的bug

数据库 (DB): 就是一个存储数据的地方

什么是数据库

DBDBMS (Database Managment System数据库管理系统) 所创建的管理数据的容器
如: (一个企业 (DBMS) 建了一个动物园 (DB) , 里面有各种动物 (Data))

数据库中 : 数据库中存储数据的基本单位, 数据按照分类存储到不同的表中(在同一个动物园 (DB) 里, 把一群狮子放在狮子分园 (table) 中)

数据库分为关系型数据库非关系型数据库

一. 关系型数据库

关系型数据库由对多张表有关联的数据库(核心要素:一库多表,表 (由行和列组成的二维表格),行 (记录),列 (字段))

在这里插入图片描述

学习数据库主要应用的语言为:SQL 结构化查询语言(SQL 是一门语言, 专门用来操作关系型数据库)

主要实用工具:Navicat需要连接MySQl的要素(1.协议 2.IP 3.端口 4.账号和密码)

在这里插入图片描述

快速体验

  1. 连接后, 创建一个数据库
    由于数据操作的特殊性, 创建数据库时需要设置 字符集 为 utf8
  2. 打开这个数据库, 找到在哪输入 SQL
  3. 运行一段 SQL (例如: select now(); ), 运行并查看结果

Navicat创建数据库

在这里插入图片描述

Mysql常见数据类型及基本操作

1.整数型 2.小整数 3.小数 4.字符串 5.日期时间 6.文本(用于存储长度无法确定的长度

创建表

语法: create table 表名 (字段名 数据类型, 字段名 数据类型);

例:创建表 b,字段要求如下:id:数据类型为 int (整数);
name 姓名:数据类型为 varchar(字符串)长度为 20,
age 年龄:数据类型为 tinyint unsigned(无符号小整数)

CREATE TABLE b (
id int,
name VARCHAR(20),
age TINYINT UNSIGNED
);

Navicat中的注释单行注释
#加上半角空格
多行注释
/* 注释内容 */

插入数据

语法: insert into 表名 values (值, 值, 值);

INSERT INTO b ( id, NAME )
VALUES
( 3, ‘曹操’ );

查询表数据
查询表 b 的id和age字段

SELECT id,age FROM b;

修改数据

update语法: update 表名 set 字段=值, 字段=值 where 条件

UPDATE b SET NAME = ‘狄仁杰’,age = 20 WHERE id = 3;

删除数据

1.delete语法: delete from 表名 where 条件

2.truncate删除表数据:truncate table 表名;

3.drop删除数据:drop table 表 / drop table if exists 表名;

面试题:delete / truncate / drop 三者的区别
delete: 删表数据, 保留主键记录和表结构
truncate: 删表数据和主键记录, 保留表结构
drop: 表结构, 主键记录, 表数据全部删除

字段约束

主键 (primary key): 值不能重复, auto_increment 代表自动增长
非空 (not null): 此字段不允许填写空值
默认值 (default): 当不填写此值时会使用默认值, 如果填写时以填写为准

create table b(
id int primary key auto increment,
name varchar(20) not null,
age tinyint unsigned default 18
);

条件查询

where:语法: select * from 表名 where 条件;

比较运算符

=, < , >, <= , >= , !=

逻辑运算符

and与 or 或 not非

例 1:查询 age 年龄小于 30,并且 sex 性别为’女’的同学记录SELECT * from student where age < 30 and sex = ‘女’;
例 2:查询 sex 性别为’女’或者 class 班级为’1 班’的学生记录SELECT * from student where sex = ‘女’ or class = ‘1班’;
例 3:查询 position 职业非’辅助’的学生记录
SELECT * from student where not position = “辅助”;

模糊查询

like 实现模糊查询: % 代表任意多个字符, _代表任意一个字符

例 1:查询 name 姓名中以’狂’开头的学生记录
SELECT * from student where name like ‘狂%’;SELECT * from student where name like '狂 ‘;
例 2:查询 name 为任意姓,名叫’铁’的学生记录SELECT * from student where name like ‘%铁’;SELECT * from student where name like ’ 铁’;
例 3:查询 name 姓名含有’周’的学生记录
SELECT * from student where name like ‘%周%’;

范围查询
in

例 1:查询 position 职业是’刺客’或’射手’或’辅助’的学生记录
SELECT * from student where position = “刺客” or position = “射手” or position = “辅
助”;
SELECT * from student where position in (“刺客”, “射手”, “辅助”);

between 开始值 and 结束值

例 2:查询 age 年龄为 25 至 30 的学生记录
SELECT * from student where age >= 25 and age <= 30;SELECT * from student where age BETWEEN 25 and 30;

null

null 在 SQL 中代表空, 不是0, 也不是"", 而是什么也没有
is null —判断为空
is not null —判断非空
null 不能用比较运算符判断

数据插入
INSERT INTO student VALUES (13, “干将”, null, null, 4, “法师”);
例 1:查询 sex 性别为 空 的学生记录
SELECT * from student where sex is null;
例 2:查询 sex 性别 非空 的学生记录
SELECT * from student where sex is not null;

别名

通过 as 给表 student 起一个别名
select * from student as s;

字段的别名

通过 as 给字段起一个别名
select name as 姓名, age as 年龄 from student;

排序

order by 字段名 [asc/desc] asc 代表升序, 默认 desc 代表降序

SELECT * from student ORDER BY age, id;

当一条 select 语句出现了 where 和 order by
select * from 表名 where 条件 order by 字段1,字段2;

聚合函数

count计数

查询学生总数(查询student表有多少记录)
select count() from student;select count(id) from student;
查询班级总数
select count(DISTINCT class) from student;
查询女同学数量
SELECT count(
) from student where sex = ‘女’;SELECT count(id) from student where sex = ‘女’;

distinct 去重

SELECT DISTINCT class from student;

max,min,sum,avg()

SELECT max(age) from student where sex = ‘女’;

SELECT min(age) from students where sex = ‘女’;

SELECT sum(age) from student where sex = ‘女’;

SELECT avg(age) from student where sex = ‘女’;

数据分组

group by 字段名
select 聚合函数 from 表名 group by 字段
select 聚合函数 from 表名 where 条件 group by 字段
select 分组字段, 聚合函数 from 表名 where 条件 group by 字段
group by 一般是配合聚合函数使用的

SELECT sex,count(*) FROM student GROUP BY sex;

SELECT sex,count(*) FROM student WHERE class = 3 GROUP BY sex;

SELECT class, sex,count(*) FROM student GROUP BY class, sex;

分组后的排序
select 分组字段, 聚合函数 from 表名 where 条件 group by 字段 order by 字段

分别查询不同班级不同性别的学生数量, 按班级降序
SELECT class,sex,count(*) FROM student GROUP BY class,sex ORDER BY class desc;

分组后的数据筛选

group by 字段 having 条件

having先分组聚合统计,在统计的结果中筛选
SELECT count(*) from student GROUP BY sex HAVING sex = ‘男’;

having 配合聚合函数的使用

求班级人数大于3人的班级名字
SELECT class FROM student GROUP BY class HAVING count(*) > 3;

having与where筛选的区别
where是对原始数据进行筛选
having是对group by之后已经分过组的数据进行筛选
having可以使用聚合函数, where不能用聚合函数

分页

查询前三条记录
SELECT * from student limit 0, 3;SELECT * from student limit 3;
查询从第4条记录开始的三条记录
SELECT * from student limit 3, 3;

连表查询

在这里插入图片描述

1.内连接 :select * from 表1 inner join 表2 on 表1.字段 = 表2.字段
内连接最重要的是, 找对两张表要关联的字段

SELECT * from a INNER JOIN b on a.id = b.id;

内连接查询, 显示指定的字段

student表与sc内连接,只显示name, c id, score
SELECT s.name,sc.c_id,sc.score FROM student
INNER JOIN sc ON student.id = sc.s id
where s.name=“猪八戒”;

多表内连接
SELECT*FROM student s
INNER JOIN sc ON s.id = sc.s idINNER JOIN course c ON sc.c id = c.id;

在这里插入图片描述

左连接:select * from 表1 left join 表2 on 表1.字段 = 表2.字段

包括了内连接, 同时还查询左表特有的内容

SELECT*FROM student s LEFT JOIN sc ON s.id = sc.s id;

在这里插入图片描述

右连接: select * from 表1 left join 表2 on 表1.字段 = 表2.字段

包括了内连接, 同时还查询右表特有的内容

在这里插入图片描述

自关联

在这里插入图片描述

查询一共有多少个省 SELECT count(*) from a where pid is null;

查询广东省的所有城市

SELECT* FROM a a1 INNER JOIN a a2 ON a1.id = a2.pid WHERE a1.name = ‘广东省’;

自关联, 是同一张表做连接查询 自关联下, 一定找到同一张表可关联的不同字段

通常用于查询关联有上下级的信息如:省市县,有从属关系的信息表

子查询

1.子查询是嵌套到主查询里面的2.子查询做为主查询的数据源或者条件

select * from
(select * from student where age > (SELECT avg(age) from student)) ss where position = “坦克”;

存储过程

存储在数据库服务端的SQL语句,对数据批量处理

创建存储过程d, 录入10000条数据

CREATE PROCEDURE d ()
BEGIN
DECLARE i INT DEFAULT 1; 定义一个变量i初始值为1WHILE i <= 10000
DO 接下来需要执行的语句
INSERT INTO user VALUES(i,concat( '张三', i ), 13000000000+i, "123456");SET i = i + 1;//字符串连接
END WHILE;
END

调用存储过程d
call d();

二.非关系型数据库

非关系型数据库, 也称 NoSql, 全称为 Not Only SQL , 是对关系型数据库的一种 补充

存储数据不是按队和列存储,为字符串存储({id:1,name:jim})

非关系型数据库的主要产品

Redis
优缺点: 内存数据库, 读写性能碾压mysql, 但耗资源, 存储数据量有限应用场景:(不用直接访问数据库,缓解数据库雪崩)
需要高频变更数据时, 如, 文章点赞数/阅读量
频繁访问数据库的高并发场景, 如, 秒杀

在这里插入图片描述

MongoDB
优缺点: 海量数据下, 性能优于mysql, 但对连表和事务等复杂业务的支持有限应用场景:
无复杂业务时, 替代mysql
拥有内存映射技术, 可当作内存数据库使用

面试题

你有用过Redis吗?有没有什么bug?

1.有 2.缓存雪崩:遇到一个bug Redis缓存在某一时刻失效,大量数据进入数据库导致缓存雪崩

建议:1.构建多级缓存,部署多个Redis,避免同时过期 2.建议后端做请求的队列机制

物理删除和逻辑删除

物理删除: 执行的是delete操作,数据从硬盘中删除

**逻辑删除:**执行的是update操作,数据还存在硬盘中

存中…(img-ebIs3BQj-1714266496624)]

MongoDB
优缺点: 海量数据下, 性能优于mysql, 但对连表和事务等复杂业务的支持有限应用场景:
无复杂业务时, 替代mysql
拥有内存映射技术, 可当作内存数据库使用

面试题:

你有用过Redis吗?有没有什么bug?

1.有 2.缓存雪崩:遇到一个bug Redis缓存在某一时刻失效,大量数据进入数据库导致缓存雪崩

建议:1.构建多级缓存,部署多个Redis,避免同时过期 2.建议后端做请求的队列机制

物理删除和逻辑删除

物理删除: 执行的是delete操作,数据从硬盘中删除

**逻辑删除:**执行的是update操作,数据还存在硬盘中

面试用于:物理删除无法判别"二进职",逻辑删除符合大数据时代保存数据的好习惯

打算从事软件测试的小伙伴注意啦!!领取软件测试零基础全套入门学习资料,扫码加微领取
添加wx好友时备注: 111 !!!

在这里插入图片描述

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值