中国机械网站一个主机怎么做两个网站
说明: 数据库是专门用来存储数据的软件
 注意: 对于测试工作而言, 如果项目页面没有实现, 但是我们又想要校验数据,则可以直接通过查询数据库实现
 关系: 具体存在的商品录入后 -> 产生对应的数据(存到数据库中) -> 最后会被加载到项目页面中
数据库的分类
分类:
 1> 关系型数据库: 以数据表为核心
 2> 非关系型数据库: 不存在数据表的概念
 关系型数据库: RDMS(Relational Database Management System)关系型数据库系统
 常见的关系型数据库:
 Oracle: 在大型项目中使用,例如:银行、电信等项目
 MySQL: Web 项目中使用最广泛的关系型数据库
 Microsoft SQL Server: 在微软的项目中使用
 SQLite: 轻量级数据库,主要应用在移动平台
 关系型数据库的核心要素:
 数据行(⼀一条记录)
 数据列(字段)
 数据表(数据行的集合)
 数据库(数据表的集合,⼀一个数据库中能够有 n 多个数据表)
关系型数据库核心要素示例

SQL 语言
说明: SQL:Structured Query Language(结构化查询语言),通过 SQL 语言可以对数据库进行操作
 注意:
- SQL 语言默认支持操作所有常见的关系型数据库
 - 作为测试人员, 必须要掌握 SQL 的查询语句
(DQL:数据查询语言,用于对数据进行查询,例如:select) - 对于 MySQL 而言, 编写 SQL 语句时, 不区分字母的大小写
 
MySQL 数据库介绍
说明: MySQL 是⼀一个关系型数据库管理系统,目前属于 Oracle 旗下产品, 目前为止 MySQL 社区版是可以免费使用的
 特点: 开源/免费/跨平台(Windows/macOS/Linux)/跨语言(Java/Python…)
数据库连接工具 Navicat
说明: 由于数据库软件处于服务器中, 想要操作数据库, 就必须使用工具远程连接数据库后, 进行操作
连接数据库操作步骤
说明: 将来在工作中, 想要远程连接数据库, 需要具备以下条件:
 1> 数据库所在服务器的 IP 地址及数据库的端口号
 2> 向相关人员获取数据库的账号和密码
 3> 使用数据库连接工具, 远程连接数据库即可
 注意: 远程连接需要注意网络连通性
数据类型和约束
数据类型
数据类型: 对于填⼊入的数据值本身进行控制, 保证数据准确性
 整数: int,有符号范围(-2147483648 ~2147483647),无符号(unsigned)范围(0 ~4294967295)
 小数: decimal,例如:decimal(5,2) 表示共存5位数,小数占2位,整数占3位
 字符串: varchar,范围(0~65533),例如:varchar(3) 表示最多存3个字符,一个中文或一个字母都占⼀一个字符
 日期时间: datetime,范围(1000-01-01 00:00:00 ~ 9999-12-3123:59:59),例如:‘2020-01-01 12:29:59’
约束
约束: 对于整张数据表进行限制, 确保对应字段的所有数据符合设计要求
 主键(primary key): 能唯一标识表中的每一条记录的属性组
 非空(not null): 此字段不允许填写空值
 唯一(unique): 此字段的值不允许重复
 默认值(default): 当不填写此值时会使用默认值,如果填写时以填写为准
 外键(foreign key): 一个表中的一个字段引用另一个表的主键
数据库操作
创建数据库
– 创建数据库
 – create database 数据库名 charset=utf8 collate=utf8_general_ci;
 create database python charset=utf8 collate=utf8_general_ci;
 – 查看数据库
 – show create database 数据库名;
 show create database python;
使用数据库
– 使⽤用数据库(切换数据库)
 – use 数据库名;
 use python;
 – 查看当前数据库: database() 是 SQL 的内置函数, 括号不不能省略略!
 select database();
修改数据库
– 修改数据库
 – 创建
 create database testpython charset = gb2312;
 – 修改
 – alter database 数据库名
 – default character set 编码格式
 – default collate 排序规则;
 alter database testpython
 default character set utf8mb4
 default collate utf8mb4_general_ci;
删除数据库和查看所有数据库
– 删除数据库
 – drop database 数据库名;
 drop database python;
 – 查看所有数据库
 show databases;
重点: 数据库备份
应用场景
 说明: 在测试工作中, 为了防止对数据库产生错误操作, 或产生垃圾数据, 都需要在操作前, 适当对数据库进行备份操作.
 垃圾数据: 例如在自动化测试中, 对注册模块操作生成的所有数据, 属于典型的垃圾数据, 应该清理
 备份方法
 利用⼯工具
 备份步骤
 数据库 -> 转储 SQL 文件 -> 结构+数据
 
自行选择存放位置
 
备份结束
 
还原操作
 数据库 -> 运行 SQL 文件
 
选择备份文件
 
还原结束
 
扩展: 使用命令备份
注意: 命令是不需要连接到数据库以后执行的!(非 mysql> 模式)
 mysql> 为 SQL 语句编写模式, 非 Linux 命令行模式
 
数据表操作
创建表
– 创建表
 – create table 表名(
 – 字段名 类型 约束,
 – 字段名 类型 约束
 – …
 – )
 – 简单创建
 create table stu(
 name varchar(5)
 );
 – 完整创建
 – unsigned : 无符号
 – primary key : 主键
 – auto_increment : 自动增长
 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;
 – 执行结果
 – CREATE TABLE students (
 – id int(10) unsigned NOT NULL AUTO_INCREMENT,
 – name varchar(20) DEFAULT NULL,
 – age int(10) unsigned DEFAULT NULL,
 – height decimal(5,2) DEFAULT NULL,
 – PRIMARY KEY (id)
 – ) ENGINE=InnoDB DEFAULT CHARSET=utf8
扩展: 判断表存在移除再创建
– 扩展: 判断表是否存在, 存在时先删除再创建
 – drop table : 删除表
 – if exists students : 如果 students 存在
 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)
 );
扩展: 通过 Navicat 工具获取创表语句的方法

查看表结构和删除表
– 查看表结构(字段)
 – desc 表名;
 desc students;
 – 删除表
 – drop table 表名;
 drop table students;
数据操作
增加数据
增加一行数据
 – 增加数据
 – 增加一行数据
 – insert into 表名 values(…)
 – 注意:
 – 1. 数据值需要和表的字段一一对应(数据个数及数据类型)
 – 2. 主键列是自动增长,插入时需要占位,通常使用 0 或者 default 或者null 来占位,插⼊入成功后以实际数据为准
 insert into students values(0, ‘张三’, 28, 1.78);
 – 增加部分值
 – 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;
 扩展 1: 逻辑删除
 逻辑删除: 对于重要的数据,不能轻易执行 delete 语句进行删除。因为⼀一旦删除,数据无法恢复,这时可以进行逻辑删除。
 1、给表添加字段,代表数据是否删除,⼀一般起名 isdelete,0代表未删除,1代表删除,默认值为0
 2、当要删除某条数据时,只需要设置这条数据的 isdelete 字段为1
 3、以后在查询数据时,只查询出 isdelete 为0的数据
 
– 扩展 1: 逻辑删除(假删/标记删除)
 – 1> 修改要删除的数据的特定字段为删除状态
 update students set isdelete=1 where id=4;
 – 2> 查询所有 isdelete 字段为 0 的所有数据
 select * from students where isdelete=0;
扩展 2: 其他删除数据的方法
– 扩展 2: 其他数据删除方法
 – delete from 表名 : 删除所有数据, 但是不重置主键字段的计数
 – truncate table 表名 : 删除所有数据, 并重置主键字段的计数
 – drop table 表名 : 删掉表(字段和数据均不再存在)
 delete from students;
 truncate table students;
 drop table students;
 
SQL 语句
查询语句
基本查询
– 需求1: 准备商品数据, 查询所有数据, 查询部分字段, 起字段别名, 去重
 – 查询所有数据: select * from 表名;
 select * from goods;
 – 查询部分字段: select 字段名1, 字段名2 from goods;
 select goodsName, price from goods;
 – 起字段别名: select 字段名 as ‘别名’ from goods;
 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;
条件查询
比较运算符&逻辑运算符
 – 需求2: 查询价格等于30并且出⾃自并夕夕的所有商品信息
 select * from goods;
 – 查询价格等于30 : 比较运算符(特殊: (大于等于)>=/(小于等于)<=/(不等于)!=/<>)
 select * from goods where price=30;
 – 并且出自并夕夕的所有商品信息 : 逻辑运算符(and(与)/or(或)/not(非))
 – 注意: 作为查询条件使用的字符串必须带引号!
 select * from goods where price=30 and company=‘并夕夕’;
 – 补充需求: 查询价格等于30但不出自并夕夕的所有商品信息
 select * from goods where not company=‘并夕夕’ and price=30;
 – 注意: not 与 and 和 or (左右两边连接条件)不同之处在于, not 只对自己右侧的条件有作用(右边连接条件)
 select * from goods where price=30 and not company=‘并夕夕’;
模糊查询
– 需求3: 查询全部⼀一次性⼝口罩的商品信息
 – 模糊查询: like 和符号 %(任意多个字符)/(任意⼀一个字符)
 – 注意: 作为查询条件使用的字符串必须带引号!
 – 注意: 如果需要控制字符数量, 需要使用, 并且有几个字符就使用几个_
 – %关键词% : 关键词在中间
 select * from goods where remark like ‘%⼀一次性%’;
 – %关键词 : 关键词在末尾
 select * from goods where remark like ‘%⼀一次性’;
 – 关键词% : 关键词在开头
 select * from goods where remark like ‘⼀一次性%’;
范围查询
– 需求4: 查询所有价格在30-100的商品信息
 – 范围查询: 1> 非连续范围: in 2> 连续范围: between … and …
 select * from goods where price between 30 and 100;
 – 注意: between … and … 的范围必须是从小到大
 select * from goods where price between 100 and 30;
判断空
– 需求5: 查询没有描述信息的商品信息
 – 注意: 在 MySQL 中, 只有显示为 NULL 的才为空! 其余空白可能是空格/制表符(tab)/换行符(回车键)等空白符号
 – 判断空: 1> 为空: is null 2> 不为空(双重否定表肯定): is not null
 select * from goods where remark is null;
 – 补充需求: 查询有描述信息的所有商品
 select * from goods where remark is not null;
其他复杂查询
排序
– 需求6: 查询所有商品信息, 按照价格从大到小排序, 价格相同时, 按照数量少到多排序
 – select * from 表名 order by 列1 asc|desc,列2 asc|desc,…
 – 说明: order by 排序, asc : 升序, desc : 降序
 – 注意: 排序过程中, ⽀支持连续设置多条排序规则, 但离 order by 关键字越近, 排序数据的范围越大!
 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;
聚合函数
– 需求7: 查询以下信息: 商品信息总条数; 最高商品价格; 最低商品价格;
 商品平均价格; 一次性口罩的总数量
 – 聚合函数: 系统提供的一些可以直接用来获取统计数据的函数
 – 商品信息总条数: count(字段): 查询总记录数
 select count() from goods;
 – 注意: 统计数据总数, 建议使用, 如果使用某⼀一特定字段, 可能会造成数据总数错误!
 select count(remark) from goods;
 – 最高商品价格: max(字段): 查询最大值
 select max(price) from goods;
 – 最低商品价格: min(字段): 查询最小值
 select min(price) from goods;
 – 商品平均价格: avg(字段): 求平均值
 select avg(price) from goods;
 – 一次性口罩的总数量: sum(): 求和
 – 注意: 此处的 count 是数据表中字段名!
 select sum(count) from goods where remark like ‘%⼀一次性%’;
 – 扩展: 在需求允许的情况下, 可以一次性在一条 SQL语句中, 使用所有的聚合函数
 select count(*), max(price), min(price), avg(price) from goods;
分组
– 需求8: 查询每家公司的商品信息数量
 – 分组: select 字段1,字段2,聚合… from 表名 group by 字段1,字段2…
 – 说明: group by : 分组
 – 注意:
 – 1> 一般情况, 使用哪个字段进行分组, 那么只有该字段可以在 * 的位置处使用, 其他字段没有实际意义(只要一组数据中的一条)
 – 2> 分组操作多和聚合函数配合使用
 select count() from goods group by company;
 select * from goods;
 select company, count() from goods group by company;
 – 说明: 其他字段没有实际意义(只要一组数据中的一条)
 select price, count(*) from goods group by company;
 – 扩充: 分组后条件过滤
 – 说明: group by 后增加过滤条件时, 需要使用 having 关键字
 – 注意:
 – 1. group by 和 having 一般情况下需要配合使用
 – 2. group by 后边不推荐使用 where 进行条件过滤
 – 3. having 关键字后侧可以使用的内容与 where 完全一致(比较运算符/逻辑运算符/模糊查询/判断空)
 – 3. having 关键字后侧允许使用聚合函数
 – where 和 having 的区别:
 – where 是对 from 后面指定的表进行数据筛选,属于对原始数据的筛选
 – having 是对 group by 的结果进行筛选
 – having 后面的条件中可以用聚合函数,where 后面不可以
分页查询
– 需求9: 查询当前表当中第5-10行的所有数据
 – 分页查询: select * from 表名 limit start,count
 – 说明: limit 分页; start : 起始行号; count : 数据行数
 – 注意: 计算机的计数从 0 开始, 因此 start 默认的第一条数据应该为 0,后续数据依次减1
 – 过渡需求: 获取前 5 条数据
 select * from goods limit 0, 5;
 – 注意: 如果默认从第一条数据开始获取, 则 0 可以省略!
 select * from goods limit 5;
 – 需求:
 select * from goods limit 4, 6;
 – 扩展 1: 根据公式计算显示某页的数据
 – 已知:每页显示m条数据,求:显示第n页的数据
 – select * from 表名 limit (n-1)*m, m
 – 示例: 每页显示 4 条数据, 求展示第 2 页的数据内容
 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页(一共 12 条数据, 每页显示4 条, 没有第 4 页数据)
 – 扩展 2: 分页的其他应用
 – 需求: 要求查询商品价格最贵的数据信息
 select * from goods order by price desc limit 1;
 – 进阶需求: 要求查询商品价格最贵的前三条数据信息
 select * from goods order by price desc limit 3;
连接查询
内连接
- 需求1: 查询所有存在商品分类的商品信息
select * from goods;
select * from category;
– 内连接: 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; 
左连接
– 需求2: 查询所有商品信息,包含商品分类
 – 左连接: select * from 表1 left join 表2 on 表1.列=表2.列
 – 注意: 如果要保证一张数据表的全部数据都存在, 则一定不能选择内连接,
 可以选择左连接或右连接
 – 说明:
 – 以 left join 关键字为界, 关键字左侧表为主表(都显示), 而关键字右侧的表为从表(对应内容显示, 不对应为 null)
 select * from goods go
 left join category ca on go.typeId=ca.typeId;
 – 扩充需求: 以分类为主展示所有内容(以哪张表为主表, 显示结果上是有区别的!)
 select * from category ca
 left join goods go on ca.typeId=go.typeId;
右连接
– 需求3: 查询所有商品分类及其对应的商品的信息
 – 右连接: select * from 表1 right join 表2 on 表1.列=表2.列
 – 说明:
 – 以 right join 关键字为界, 关键字右侧表为主表(都显示), 而关键字左侧的表为从表(对应内容显示, 不对应为 null)
 select * from goods go
 right join category ca on go.typeId=ca.typeId;
 – 扩充需求: 查询所有商品信息及其对应分类信息
 select * from category ca
 right join goods go on ca.typeId=go.typeId;
补充: 存在左右连接的必要性
说明: 能够体现左右连接必要性的场景为: 至少为三张表进行连接查询
 注意: 实际工作中, 最多也就三张表连接查询
 
连接查询的小结

自关联
前提: 1> 数据表只有一张 2> 数据表中至少有两个字段之间有某种联系
 方式: 通过给表起别名的形式, 将原本只有一张的数据表变为两张, 然后通过对应字段实现连接查询
查询河南省下所有市的信息
 – 需求4: 查询河南省所有的市
 – 说明: 无论是使用内连接还是左连接, 都只影响中间数据表的内容多少, 由于最终的过滤条件相同, 因此查询结果一致
 – 使用内连接
 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=‘河南省’;
查询河南省下所有的市和区的信息
 – 需求5: 查询河南省的所有的市和区
 – 说明: 想要实现三级行政单位显示, 需要分别处理省和市及市和区(三表连查)
 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 语句称之为子查询语句
 作用: 子查询是辅助主查询的,要么充当[条件],要么充当[数据源]
子查询语句充当条件
– 需求6: 查询价格高于平均价的商品信息
 – ⼦子查询语句充当条件:
 – 求取平均价
 select avg(price) from goods;
 – 说明: 充当子查询的语句需要使用括号括起来(运算优先级括号最⾼高!)否则报错
 select * from goods where price > (select avg(price) from goods);
子查询语句充当数据源
– 需求7: 查询所有来自并夕夕的商品信息, 包含商品分类
 – 子查询语句充当数据源:
 – select * from goods go
 – left join category ca on go.typeId=ca.typeId;
 – select * from (select * from goods go left join category ca
 on go.typeId=ca.typeId) new
 – where new.company=‘并夕夕’;
 – 问题: 连接查询的结果中, 表和表之间的字段名不能出现重复, 否则无法直接使用
 – 解决: 将重复字段使用别名加以区分(表名.* : 当前表的所有字段)
 select * from (select go.*, ca.id cid, ca.typeId ctid,
 ca.cateName from goods go left join category ca on
 go.typeId=ca.typeId) new where new.company=‘并夕夕’;
数据库高级扩展内容(了解)
ER 模型
E 表示 entry,实体: 描述具有相同特征事物的抽象[数据表]
 属性: 每个实体的具有的各种特征称为属性[数据(表内的字段)]
 R 表示 relationship,联系: 实体之间存在各种关系,关系的类型包括包括一对一、一对多、多对多[表和表之间的联系]
 
外键
说明: 通过外部数据表的字段, 来控制当前数据表的数据内容变更, 以避免单方面移除数据, 导致关联表数据产生垃圾数据的一种方法
 注意: 如果大量增加外键设置, 会严重影响除数据查询操作以外的其他操作(增/删/改)的操作效率, 因此在实际项目中很少会被采用, 但是在面试中容易被问到.
索引
说明: 可以大幅度提高查询语句的执行效率
 注意: 如果大量增加索引设置, 会严重影响除数据查询操作以外的其他操作(增/删/改)的操作效率, 不方便过多添加
验证索引效果案例实现步骤
说明: 提供的示例文件可以使用在数据库中使用运行 SQL 文件方式导入!
 – 开启运行时间监测
 set profiling=1;
 – 查找第一万条数据 10000
 select * from test_index where num=‘10000’;
 – 查看执行的时间
 show profiles;
 – 为表 text_index 的 num 列创建索引
 create index test_index on test_index(num);
 – 执行查询语句
 select * from test_index where num=‘10000’;
 – 再次查看执行的时间
 show profiles;
扩展: 实际项目中数据库中表的样式
实际项目的表名设计规律
 
查看创表语句中的字段注释
 
 SQL 练习题获取网站
 力扣: https://leetcode-cn.com
 牛客网: https://www.nowcoder.com
