软件测试必备之数据库知识
1. 数据库的重要性
数据库是一个容器,仓库存的是货物,而数据库存的是数据。数据库技术从诞生到现在,在不到半个世纪的时间里,形成了坚实的理论基础、成熟的商业产品和广泛的应用领域,成为企业、部门乃至个人日常工作、生产和生活的基础设施。我们用过的网站:淘宝,阿里巴巴,京东商城,12306,这些都是需要数据库来保存数据的,常用的APP:微信,QQ,支付宝,ofo,Mobike同样也是都需要数据库来储存数据的,数据很好的解决了数据到哪里去的问题,同样,咱们在购物网站上看到的商品信息也解释了数据从哪里来的问题。
2. 数据库工具的选择
现在,数据库的技术发展越来越快,越来越成熟,产品也越来越多,软件公司在做项目的时候到底该怎么去选择合适的数据库产品呢?在我个人看来,这个是根据项目特点,架构,以及其他很多相关因素决定的,包括数据安全性,数据量,易用性,项目经费等等。合适的数据库会利于项目的设计和开发,而不合适的数据库会导致项目开发受阻和提高项目各方面的成本。当然,一个项目使用什么样的数据库是属于项目架构的一部分了,一般测试人员不需要参与到这样的系统架构设计中去,但是我们测试人员需要了解当前市面上最受欢迎以及使用最多的几种数据库产品。
数据库通常分层次式数据库、网络式数据库和关系型数据库三种。而不同的数据库是按不同的数据结构来联系和组织的。
而在当今的互联网中,最常见的数据库模型主要是两种:
- 关系型数据库
关系型数据库的官方解释比较难理解,其实简单点来讲,关系型数据库就是以行和列的形式储存数据的组织结构,这里体现为二维结构的表,而且多个表之间可能会存在一些关系。
- 非关系型数据库
非关系型数据库的数据结构跟关系型的完全不同,它主要是以键值对的形式去存储数据。
2.1 常用关系型数据库产品
- Oracle
Oracle是美国oracle公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,oracle数据库的特点是安全、高速、稳定、并发性好,这些特点都使得很多大企业都选择数据库的时候毫不犹豫的选择了oracle,早些年的时候,世界500强几乎100%都是oracle的用户。但是oracle是收费的,而且不便宜,这也使得很多初创公司或者中小型企业是完全没有能力去负担这笔开支,而放弃使用oracle,转而选择简便易用,更轻量级且免费开源的MySQL,这个数据库我们后面会提到,也会是我们后面重点学习的内容。
- MySQL
MySQL是一种开发源代码的关系型数据库管理系统,并且因为其速度,可靠性和适用性备受中小型企业的青睐。虽然早期版本不支持事物操作、子查询、外键、存储过程和视图等功能,但是从02年发布的4.0beta版以来,MySQL外使用innoDB作为默认引擎,对事物处理能力及数据缓存能力又来极大的提高,05年的5.0版本有添加了存储过程、服务端游标、触发器、查询优化以及分布式事物功能,后面版本功能也在得到不断完善,在国内当前市场占有率有很大的一个比例,甚至超过了oracle。
- MariaDB
MariaDB数据库是MySQL的一个分支,由开源社区在维护,开发MariaDB有一部分原因是因为担心甲骨文收购MySQL后,会有将MySQL闭源的意图,因此社区采用分支的方式来避开这个风险。MariaDB完全兼容MySQL,包括API和命令行,是MySQL的完美替代品吧 ,至于储存引擎方面,MariaDB使用的是xtraDB替代了MySQL的InnoDB。
- Sqlserver
Sqlserver是由Microsoft开发和推广的数据库,它最初是由Microsoft、Sybase和Ashton-tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。Ms SQL server主要面向中小型企业。其最大的优势是在于集成了Ms公司的各类产品及资源,提供了强大的可视化界面、高度集成的管理开发工具,在快速构建商业智能(BI)方面颇有的建树。
2.2 常用非关系型数据库产品
- Memcached
Memcached是以livejournal旗下Danga Interactive 公司的Brad Fitzpatric为首开发的一款软件,它的出现很好的解决一系列数据库瓶颈问题,因为在web应用中频繁,集中的访问数据库,就会带来高并发带来的一系列问题,比如导致数据库负担加重、响应恶化、网站显示延迟等重大影响这些问题,而有了memcached提供的数据缓存机制,这些问题就都不是问题了,很多数据库可以放在缓存里,拿数据的时候就可以直接从缓存里拿,数据更新的时候,直接更新缓存就行了。
- Redis
Redis是一个key-value存储系统。和memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、和hash(哈希类型)等。Redis是一个高性能的key-value数据库。Redis的出现,很大程度补偿了memcached这类key/value储存的不足,在部分场合可以对关系数据库起到很好的补充作用。
- MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此课程储存比较复杂的数据库类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎都可以实现类似关系数据库表单查询的绝大部分功能,而且还支持对数据库建立索引。
3. 搭建数据库服务器
所有的数据库都是创建在数据库服务器上的,数据库服务器是跟数据库是一对多的关系,简单的打个比喻就是好比大树跟叶子的关系,一个大树上结了很多叶子,这里大树就是服务器,叶子就是数据库。在企业里做香满园的时候,项目的数据库服务器都是安装在虚拟机服务器上的,至于怎么在linux虚拟机上搭建MySQL数据库服务器请参考后面linux部分---MySQL的安装于配置。
4. 数据库客户端
MySQL客户端主要是用来连接数据库服务器来操作数据库的。常用的MySQL有Navicat,MySQL workbench等,这里咱们会使用Navicat这个客户端来进行后续数据库的操作演示。当然现在Navicat是收费的软件,大家可以去网上搜索下载安装包,包括注册码也是可以找到免费的。当然大家觉得麻烦可以直接去我分享的这个百度云连接:http://pan.baidu.com/s/lesmzubc密码:evnf 去下载安装。
5. 创建数据库和表
5.1 创建数据库
现在我们要通过Navicat客户端来创建一个数据库,第一步就是通过Navicat连接上我们的数据库服务器,首先,选择“连接”,在这个窗口里填写一个连接信息,这些连接信息包括:
1)连接名:给连接取一个名字
2)主机名或IP地址:数据库服务器地址信息,IP或者域名
3)端口:MySQL服务器监听的端口(默认监听3306)
4)用户名:登录用户名
5)密码:登录密码
连接测试完后,提示连接成功后点击确定,确定然后就可以在Navicat客户端的左边列表里看到刚新建的连接,双击打开即可看到下图结构:
我们展开连接名就可以看到connection1这个连接底下所有的数据库,现在我们要创建一个新的数据库,可以直接选中这个连接,点击鼠标右键_>新建数据库,在弹出来的提示框里输入数据库名字和字符集就可以了如图示:
点击确定,我们就可以在连接名底下看到新建的那个数据库“test”了,双击打开这个新建的数据库,我们就可以看到如下结构:
我们可以看到这个数据库底下包含了表,视图,函数,时间,查询,报表,备份等目录,不同的目录存放的是不同的数据表结构。表是数据库的真正储存单元,数据都是存储在表里的,所以我们接下来将给大家介绍如创建表,并来学习一系列数据库表的增(往表里插入数据)、删(删除表里的数据)、查(查询表里的数据)、改(修改表里的数据)操作。
5.2 创建表
从创建表开始到后面的数据库增删查改等操作我们都是用到一种特定的语言来学习,这个语言就是SQL,这个术语的全称是“structured query language”—结构化查询语言
首先我们来思考一个问题,以下是我在Excel里准备了几条学生数据,学生信息包括了学号,姓名,性别,班级编号,住址,创建时间,更新时间。
但是我们现在有了数据库表,我们就可以将数据库保存到表里面,大家试想一下,如要将上面Excel表格里的数据保存到一个学生student表,那这个表结构必须满足上面样的条件?
没错,如果想将Excel里的数据保存到数据库表里,那表的结构肯定要跟Excel一样,Excel有哪些列,我们的表也必须有,那么我们怎么去创建出来这样一个结构表的呢?
5.2.1字段类型
在学习建表语法之前,我们先来学习一下字段类型呢,上面准备的Excel,每一列都存储了数据,在MySQL中所有的数据都是有数据类型的,所以在定义表字段的时候,我们必须声明表字段的数据类型。MySQL中字段的类型很多,但是作为测试人员我们并不需要掌握所有的字段类型,大家重点熟悉以下的几种常见的字段类型就差不多了。
1) 整型(整数)
- tinyint:占1个字节,取值范围为-128~127,如果一个字段存储的整数比较小,且在这个范围内,建议此字段声明称这个类型。
- int:占4个字节,取值范围-2147483648~2147483648
注意:这两个类型所能表示的取值范围不同是由她们所占的字节数决定的,在计算机语言里,一个字节占八位,所以能表示一个八位的二进制数,转化为十进制数,我们就得到tinyint的取值范围,int同理。
2) 字符串
- char(n):不可变长度,声明了n的长度代表最大可以存储n个长度的字符。如果长度不够n,实际开辟内存空间也不会减少,这个就是不可变长度的意思,所以这个类型在存储字符串的时候有时候没有帮我们起到节省内存空间的作用,但是他的优点是,存取速度要优于varchar类型。
- varchar(n):可变长度,声明了n的长度代表最大可以存储n个长度的字符。如果长度不够n,实际开辟内存空间会按照实际数据去收缩空间,这个就是可变长度的意思,所以这个类型在存储字符串的时候有时候可以帮我们节省内存空间,但是也不是没缺点,整数因为这个特点,他的操作速度相对于char类型会稍微慢一些。
注意:两者各有优缺点,这也是两种类型能够共存的原因,大家在使用的时候,根据实际情况去选择就可以了。
3) 日期时间
- date:日期,此类型存储数据格式(yyyy-mm-dd,例如2018-12-3)
- time:时间,此类型存储数据格式(hh:mm:ssz,例如:18:40:32)
- datetime: 日期时间,此类型存储数据格式(yyyy-mm-dd hh:mm:ss,例如:2018-12-3 18:40:32)
总结:大家在定义一个时间类型的字段时,要根据此字段存储数据的格式来判断要声明的具体类型。
4) 浮点型(小数)
- float(m,n):单精度浮点型,m为小数的总位数,n为小数的位数。例:如果某字段被声明成立float(4,2),那这个字段就可以存储10.23这样的数据。
- double(m,n):双精度浮点型,m为小数的中位数,n为小数的位数。例:如果某个字段被声明成了double(4,2),那这个字段就可以存储10.23这样的数据。那双精度跟单精度的区别是什么呢?其实两种类型就是一个精确度不一样的差别,双精度的精确度比单精度要高,能够存储对于精确度要求高的数据,而使用单精度则不一样,可能会丢失进度,造成数据不准确。
- Decimal(m,n):m代表总位数,n小数位。Decimal数据类型用于精度要求非常高的计算中。比如语句decimal(7,3)规定看存储的值不会超过7位数,并且小数点后不超过3位。
总结:decimal是以上三种类型中进度最高类型。对于数据精确度要求较高的项目一般都是使用decimal来定义字段类型存储数据。
5.2.2 建表SQL语法:
create table<表名>(<字段名1><类型1>,<字段名2><类型2>……<字段名n><类型n>)default charset=utf8;
- create:SQL关键字,创建的意思
- table:表
- ()小括号里面声明字段以及字段的类型
- Default charset=utf8:声明默认字符集为UTF8(一种支持中文存储的编码格式)
- 字段名:标识表中的一列,又可以成为列名
- 每一条SQL语句都是以“;”作为结束符
- 表名和字段名都最好用字母或者字母加数字的方式来标识,比如表名可以去test,test1,test2等。
- 在书写SQL命令的时候,所有符号都是英文输入法底下的符号,像小括号,逗号,分号等都需要注意,否则执行SQL命令的时候会提示你语法错误。按照此语法,我们可以直接编写出来创建上student学生表的建表语句,值得注意的是我们要编写SQL脚本的话要首先打开一个编辑器,打开方法如下:
在编辑器里填入一下SQL再点击“运行”
Create table student(
ID int,
Name varchar(12),
Sex char(2),
Class_id int,
Address vaechar(12),
Createtime datetime,
Updatedate datetime
)default charset=utf8;
如下图所示:
我们可以从控制台看到SQL执行的结果,这里面会记录你刚执行过SQL,以及SQL执行的结果和时间。如果SQL执行有错误还会有额外的“err”错误信息。
然后我们刷新test数据库底下的“表目录就可以看到新建的student表。双击表名即可查看表结构和所以数据:
如果我们还想查看更多关于表的结构,可以选中表名右键选中对象信息DDL:
5.2.3主键
主键也是表的字段。主键的最突出的特点有以下几点:
- 唯一不可重复
- 可以单字段作为主键,也可以多字段作为联合主键
- 一个表只能有一个主键
- 主键是非必须的,一个表可以定义主键也可以不定义主键
- 声明语法:字段,类型,primary key
正是因为主键的唯一不可重复的特点,我们在设计表的时候要跟根据具体的业务区分析表中的数据哪些是字段是唯一不可重复的,那就可以把这个字段定义成主键。像上面的学生表,因为学号是唯一不可重复的数据,所以在设计表的时候可以将ID字段设置成主键,所以建表语句可以进一步改进为:
Create table student(
ID int primary key,
Name vaechar(12),
Sex char(2),
Class_id int ,
Address varchar(12),
Createtime datetime,
Updatedate datetime
)default charset=utf8;
5.2.4字段非空
语法: 字段 类型 not null
声明一个字段非空的意思是,此字段必须有值,往这个表里面插入数据的时候,这个字段肯定是要有值的。现在我们来通过修改student标的name字段为非空,然后插入一条name字段为空的数据来验证一下,修改表结构的SQL语法和往表添加数据的语法我们后期会进行深入学习,此处不用关注。
1. 修改 student 表的 name 为非空
Alter table student modify_column name varchar(12) not null;
2. 往数据库student 表插入一条数据,只初识话学号这个字段。
Insert into student(ID)values(1);
执行完插入SQL后台,控制台出现了一下错误信息:
这个错误的意思是name字段以及声明为了非空,往表里插入数据的时候,这个字段就必须要有一个默认值,或者你主动赋给它一个值。
总结:对于测试人员,数据库这一部分最重要最需要账务的就是数据库的查询,所以关于数据库的创建,表的创建,大家只需要了解,知道原理即可。
6. insert:添加表数据
作为测试人员在测试公司项目的时候可能需要做一些测试数据,比如往表插入一些测试数据,这种情况,我们通过SQL命令去完成呢?接下来我们学要学习insert命令就能帮你解决这个问题。这里我们会分两种情况一一为大家做语法的详解,第一种是插入单条数据语法,第二种是批量插入数据的语法。