软件测试——数据库

数据库常见分类

  • 关系型数据库

    以数据表为核心存储数据

    核心元素:
    在这里插入图片描述
    代表产品:
    在这里插入图片描述

  • 非关系型数据库

    不存在数据表的概念,数据以键值对、文本、图片等形式存储

    代表产品:
    在这里插入图片描述

数据库连接工具Navicat

连接:
在这里插入图片描述
写命令:
在这里插入图片描述
写查询:
在这里插入图片描述

数据类型与约束

  • 数据类型

    在这里插入图片描述

  • 约束

    在这里插入图片描述

    注:(在Navicat中的设置位置)
    主键
    在这里插入图片描述
    非空
    在这里插入图片描述
    唯一
    在这里插入图片描述
    在这里插入图片描述
    默认值
    在这里插入图片描述

SQL介绍

SQL(结构化查询语言):通过SQL语言可以对数据库进行操作

SQL语言的分类:
在这里插入图片描述
注!
1.SQL语言默认支持所有常见的关系型数据库
2.对测试而言,必须要掌握DQL
3.对MySQL而言,不区分字母大小写

SQL语句

  • 数据库增删改查

    -- 创建数据库
    -- create database 数据库名 charset=utf8 collate=utf8_general_ci;
    create database test charset=utf8 collate=utf8_general_ci;
     
     
    -- 使用数据库(切换当前数据库)
    -- use 数据库名;
    use test;
    
    
    -- 查看当前数据库
    select database();
    
    
    -- 修改数据库
    -- alter database 数据库名
    -- default character set 编码格式
    -- default collate 排序规则;
    alter database test
    default character set utf8mb4
    default collate utf8mb4_general_ci;
    
    
    -- 删除数据库
    -- drop database 数据库名;
    drop database test;
    
    
    -- 查看所有数据库
    show databases;
    
  • 扩展——Navicat操作数据库备份

    在测试⼯作中, 为了防⽌对数据库产⽣错误操作, 或产⽣垃圾数据, 都需要在操作前, 适当对数据库进⾏备份操作

    步骤(使用工具):
    1.选中数据库>>转储SQL文件>>结构+数据 在这里插入图片描述
    2.选择合适路径存储SQL文件 在这里插入图片描述
    3.选中数据库>>运行SQL文件 在这里插入图片描述
    4.找到存储的SQL文件进行还原 在这里插入图片描述
    步骤:(使用命令)
    在这里插入图片描述

  • 数据表增删改查

    -- 创建表(先判断表是否存在,若存在则先删除再创建,只需在直接创建表前加一个判断删除的语句)
    -- drop table if exists 表名
    -- create table 表名(
    -- 字段名 类型 约束(unsigned : ⽆符号;primary key : 主键;auto_increment : ⾃动增⻓),
    -- 字段名 类型 约束
    -- ...
    -- )
    drop table if exists students;
    create table students(
     id int unsigned primary key auto_increment,
     name varchar(20),
     age int unsigned,
     height decimal(5,2)
    );
    
    
    -- 查看表
    -- show create table 表名;
    show create table students;
    
    
    -- 查看表结构
    -- desc 表名;
    desc students;
    
    
    -- 删除表
    -- drop table 表名;
    drop table students;
    
    
    -- 增加数据
    
    -- 一.增加⼀⾏数据
    -- 1.增加一行完整数据
    -- insert into 表名 values(...)
    -- 注意: 数据值需要和表的字段⼀⼀对应(数据个数及数据类型);主键列是⾃动增⻓,插⼊时需要占位,通常使⽤ 0 或者 default 或者null 来占位,插⼊成功后以实际数据为准
    insert into students values(0, '张三', 28, 1.78);
    -- 2.增加一行部分数据
    -- insert into 表名(字段1,...) values(值1,...)
    insert into students(name, height) values('李四', 1.68);
    
    -- 二.增加多行数据
    -- ⽅式1: 将单⾏插⼊语句多句执⾏, 每句分号隔开
    insert into students values(0, '王五', 28, 1.78);
    insert into students(name, height) values('赵六', 1.68);
    -- ⽅式2: 在插⼊单⾏数据的语法基础上, 将 value 后边的数据进⾏多组化处-- insert into 表名 values(...),(...)...
    -- insert into 表名(列1,...) values(值1,...),(值1,...)...
    insert into students values(0, '王五1', 29, 1.78),(0, '王五2',
    30, 1.78);
    insert into students(name, height) values('赵六1', 1.78),('赵六
    2', 1.88);
    
    
    -- 修改数据
    -- update 表名 set 列1=值1,列2=值2... where 条件
    -- 注意: where 不能省略, 否则会修改全部数据
    update students set age=48 where id=9;
    
    
    -- 删除数据
    -- delete from 表名 where 条件;
    -- 注意: where 不能省略, 否则会删除全部数据
    delete from students where id=6;
    

    重中之重——单表查询

    **基本查询**
    
    -- 查询所有数据
    -- select * from 表名;
    select * from goods;
    
    -- 查询部分字段
    -- select 字段名1, 字段名2 from 表名;
    select goodsName, price from goods;
    
    -- 查询时起字段别名
    -- select 字段名 as '别名' from 表名;
    select goodsName as '商品名称', price as '价格' from goods;
    -- 注意: 别名的引号可以省略
    select goodsName as 商品名称, price as 价格 from goods;
    -- 注意: as也可以省略(常用)
    select goodsName 商品名称, price 价格 from goods;
    -- 起别名的作⽤:
    -- 1> 美化数据结果的显示效果 
    -- 2> 可以起到隐藏真正字段名的作⽤
    -- 另: 除了可以给字段起别名以外, 还可以给数据表起别名(连接查询时使⽤)
    
    -- 去重
    -- 目的: 将查询的⽬标字段内重复出现的数据只保留⼀份显示
    -- select distinct(字段名) from goods;
    select distinct(company) from goods;
    
    
    
    **复杂查询——条件查询**
    
    ⽐较运算符:
    等于:=
    大于:>
    大于等于:>=
    小于:<
    小于等于:<=
    不等于:!=<>
    
    逻辑运算符:
    与:and
    或:or
    非:not
    
    -- 例:查询价格等于30的商品信息
    select * from goods where price=30;
    
    -- 例:查询价格等于30并且出⾃并夕夕的所有商品信息
    -- 注意: 字符串作为查询条件使⽤必须带引号!
    select * from goods where price=30 and company='并夕夕';
    
    -- 例:查询价格等于30但不出⾃并夕夕的所有商品信息(以下两种顺序都行)
    -- 注意: not(右边连接条件) 与 and 和 or (左右两边连接条件)不同之处在于, not 只对⾃⼰右侧的条件有作⽤
    select * from goods where not company='并夕夕' and price=30;
    select * from goods where price=30 and not company='并夕夕'
    
    
    
    **复杂查询——模糊查询**
    
    like%(任意多个字符)、_(任意⼀个字符)
    
    -- 例:关键词在中间
    select * from goods where remark like '%⼀次性%';
    -- 例:关键词在末尾
    select * from goods where remark like '%⼀次性';
    -- 例:关键词在开头
    select * from goods where remark like '⼀次性%';
    -- 例:关键词在开头且字符长度为5的
    select * from goods where remark like '⼀次性__';
    
    
    
    **复杂查询——范围查询**
    
    ⾮连续范围: in(...,...)
    连续范围: between ... and ...
    
    -- 例:查询家乡是北京/上海/广东的学生
    select * from students where hometown in('北京','上海','广东');
    
    -- 例: 查询所有价格在30-100的商品信息
    -- 注意: between ... and ... 的范围必须是从⼩到⼤
    select * from goods where price between 30 and 100;
    
    
    
    **复杂查询——查询空**
    
    注意: 在MySQL中, 只有显示为 NULL 的才为空。其余空⽩可能是空格/制表符(tab)/换⾏符(回⻋键)等空⽩符号
    为空: is null
    不为空: is not null
    
    -- 例: 查询没有描述信息的商品信息、
    select * from goods where remark is null;
    
    -- 例: 查询有描述信息的所有商品
    select * from goods where remark is not null;
    
    
    
    **复杂查询——排序**
    
    -- select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
    -- 说明: asc是升序(默认), desc是降序
    select * from goods order by price desc;
    
    -- 注意: 排序过程中, ⽀持连续设置多条排序规则(往后的排序规则建立在之前的排序基础之上)
    -- 例: 查询所有商品信息, 按照价格从⼤到⼩排序, 价格相同时, 按照数量少到多排序
    select * from goods order by price desc, count asc;
    -- 注意: 默认排序为升序, asc 可以省略
    select * from goods order by price desc, count;
    
    
    
    **复杂查询——聚合函数**
    
    聚合函数: 系统提供的⼀些可以直接⽤来获取统计数据的函数
    常用聚合函数:
    count():计数
    max():最大值
    min():最小值
    sum():求和
    avg():平均值
    
    -- 商品信息总条数: count(字段): 查询总记录数
    -- 注意: 统计数据总数, 建议使⽤*, 如果使⽤某⼀特定字段, 可能会造成数据总数错误(比如要是某条数据该字段刚好为空呢)
    select count(*) from goods;
    
    -- 最⾼商品价格: max(字段): 查询最⼤值
    select max(price) from goods;
    
    -- 最低商品价格: min(字段): 查询最⼩值
    select min(price) from goods;
    
    -- 商品平均价格: avg(字段): 求平均值
    select avg(price) from goods;
    
    -- ⼀次性⼝罩的总数量: sum(): 求和
    select sum(count) from goods where remark like '%⼀次性%';
    
    -- 扩展: 在需求允许的情况下, 可以⼀次性在⼀条 SQL语句中, 使⽤所有的聚合函数
    select count(*), max(price), min(price), avg(price) from goods;
    
    
    
    **复杂查询——分组**
    
    说明:按照字段分组的话,该字段相同的数据会被放到一个组中
    注意:
    1> ⼀般情况, 使⽤哪个字段进⾏分组, 那么只有该字段可以在 * 的位置处使⽤,并不是说其他字段放那里会报错,只是没有实际意义
    2> 分组操作多和聚合函数配合使⽤
    
    -- select 字段1,字段2,聚合函数... from 表名 group by 字段1,字段2...
    -- 例: 查询每家公司的商品信息数量
    select company, count(*) from goods group by company;
    
    扩充: 分组后条件过滤,使⽤ having 关键字
    wherehaving 的异同:
    (同)having 关键字后侧可以使⽤的内容与 where 完全⼀致(⽐较运算符/辑运算符/模糊查询/判断空)
    (异)having 后⾯的条件中可以⽤聚合函数,where 后⾯不可以
    (异)where 是对 from 后⾯指定的表进⾏数据筛选,属于对原始数据的筛选;having 是对 group by 的结果进⾏筛选,属于对筛选数据的再次筛选
    
    -- 例:查询男生总人数
    select sex,count(*) from students group by sex having sex='男';
    -- 例:列出班级平均年龄大于22岁的班级
    select class from students group by class having avg(age)>22;
    
    
    
    **复杂查询——分页**
    
    数据量过大时,在一页中查看所查询到的数据会比较麻烦,所以需要分页展示
    
    -- 分⻚查询: select * from 表名 limit start,count
    -- 说明: limit 分⻚; start : 起始⾏号; count : 数据⾏数
    -- 注意: 计算机的计数从 0 开始, 因此 start 默认的第⼀条数据应该为 0
    
    -- 例: 获取前 5 条数据
    select * from goods limit 0, 5;
    -- 注意: 如果默认从第⼀条数据开始获取, 则 0 可以省略!
    select * from goods limit 5;
    -- 例:获取从第五行开始的6条数据:
    select * from goods limit 4, 6;
    
    -- 扩展 1: (典型应用场景)每⻚显示m条数据,求显示第n⻚的数据
    -- select * from 表名 limit (n-1)*m, m
    -- 例: 共12条数据,每⻚显示 4 条数据, 求展示前四页分别的数据内容
    select * from goods limit 0, 4; -- 第1⻚(有数据)
    select * from goods limit 4, 4; -- 第2⻚(有数据)
    select * from goods limit 8, 4; -- 第3⻚(有数据)
    select * from goods limit 12, 4; -- 第4⻚(无数据)
    
    -- 扩展 2: 其他应⽤场景
    -- 例: 要求查询商品价格最贵的数据信息
    select * from goods order by price desc limit 1;
    -- 例: 要求查询商品价格最贵的前三条数据信息
    select * from goods order by price desc limit 3;
    

    重中之重——多表查询

    在这里插入图片描述
    实际工作中一般最多三张表,从第三张表开始,若想与前两张表已经连接完的结果进行连接,那么只能左连接

    **内连接**
    
    -- select * from 表1 inner join 表2 on 表1.列=表2.列
    select * from goods
    inner join category on goods.typeId=category.typeId;
    
    -- 扩充: 给表起别名(1> 缩短表名利于编写 2> ⽤别名给表创建副本)
    select * from goods go
    inner join category ca on go.typeId=ca.typeId;
    
    -- 扩展: 内连接的另⼀种写法(旧式写法,查询效率略低,查询结果一样)
    -- select * from 表1, 表2 where 表1.字段名=表2.字段名;
    select * from goods, category where goods.typeId=category.typeId;
    
    
    
    **左连接**
    
    -- 注意: 如果要保证⼀张数据表的全部数据都存在, 则⼀定不能选择内连接,可以选择左连接或右连接
    
    -- select * from 表1 left join 表2 on 表1.列=表2.列
    select * from goods go
    left join category ca on go.typeId=ca.typeId;
    
    
    
    **右连接**
    
    -- select * from 表1 right join 表2 on 表1.列=表2.列
    select * from goods go
    right join category ca on go.typeId=ca.typeId;
    
    **自关联**
    
    前提: 1> 数据表只有⼀张 2> 数据表中⾄少有两个字段之间有某种联系
    ⽅式: 通过给表起别名的形式, 将原本只有⼀张的数据表变为两张, 然后通过对
    应字段实现连接查询
    
    -- 说明: ⽆论是使⽤内连接还是左连接, 都只影响中间数据表的内容多少, 由于最终的过滤条件相同, 因此查询结果⼀致
    
    -- 例: 查询河南省所有的市(这张表title字段包含全部的省市区)
    -- 使⽤内连接
    select * from areas a1
    inner join areas a2 on a1.aid=a2.pid
    where a1.atitle='河南省';
    -- 使⽤左连接
    select * from areas a1
    left join areas a2 on a1.aid=a2.pid
    where a1.atitle='河南省';
    
    -- 例: 查询河南省的所有的市和区
    -- 说明: 想要实现三级⾏政单位显示, 需要分别处理省和市及市和区(三表连)
    select * from areas a1
    left join areas a2 on a1.aid=a2.pid
    left join areas a3 on a2.aid=a3.pid
    where a1.atitle='河南省';
    
    
    
    **子查询**
    
    在⼀个 select 语句中,嵌⼊了另外⼀个 select 语句,那么嵌⼊的select 语句称之为⼦查询语句,子查询语句需要用括号括起来。
    ⼦查询是辅助主查询的,要么充当[条件],要么充当[数据源]
    
    -- ⼦查询语句充当条件:
    -- 例:查询价格高于平均价的商品
    select * from goods where price > (select avg(price) from
    goods);
    
    -- ⼦查询语句充当数据源:
    -- 注意:需给新形成的数据源表起个别名
    -- 例: 查询所有来⾃并夕夕的商品信息, 包含商品分类
    select * from (select * from goods go left join category ca on go.typeId=ca.typeId) new
    where new.company='并夕夕';
    
  • 扩展——对分组查询的理解

    例:
    初始数据:
    在这里插入图片描述
    按公司分组后查询全部(此时查询出的数据想象垂直屏幕来看,看作有三组队伍【因为一共三个公司】,展示出来的分别是站在队伍最前方的,实际屏幕后面还有数据):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 扩展——逻辑删除

    对于重要的数据,不能轻易执⾏ delete 语句进⾏删除。因为⼀旦删除,数据⽆法恢复,这时可以进⾏逻辑删除。

    1、给表添加字段,代表数据是否删除,⼀般起名 isdelete(或者delflag),0代表未删除,1代表删除,默认值为0
    2、当要删除某条数据时,只需要设置这条数据的 isdelete 字段为1
    3、以后在查询数据时,只查询出 isdelete 为0的数据

  • 扩展——三种表删除的区别

    – delete from 表名 : 删除表数据,保留表结构(自增字段不会从1开始)
    – truncate table 表名 : 删除表数据,保留表结构(自增字段会从1开始)
    – drop table 表名 : 删除表数据及结构 在这里插入图片描述

扩展——E-R模型

E(entry):实体,描述具有相同特征事物的抽象[数据表]。每个实体的具有的各种特征称为属性[数据表字段]
R(relationship):联系,实体之间存在各种关系。包括⼀对⼀、⼀对多、多对多[表和表之间的联系]
在这里插入图片描述

扩展——外键

在这里插入图片描述
说明:
避免单方面移除数据, 导致关联表产⽣垃圾数据(两张表数据对不上)的⼀种⽅法
注意:
如果⼤量增加外键设置, 会严重影响除数据查询操作以外的其他(增/ 删/改)操作的效率, 因此在实际项⽬中很少会被采⽤,

扩展——索引

说明:
可以⼤幅度提⾼查询语句的执⾏效率
注意:
如果⼤量增加索引设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率,不⽅便过多添加.
在这里插入图片描述

扩展——查看创表语句和表注释

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值