在软件测试里(尤其接口自动化的视角下),Mysql相当于是一个"巨大的、可以通过代码精准操控的Excel表格集合"。 我所有的操作都是在验证数据在这个表格集合里存得对不对、取得准不准
一、Mysql得层级架构(由外到内)
在mysql里,数据的归属是严格分层的。这也是为什么连接数据库时,需要指定的database。
1.实例(Instance)/服务器:实例指内存里运行的mysql进程+它管理的那些数据文件+占用的端口(3306)。买的云服务器上跑的Mysql软件(进程),也就是Mysql daemon。
2.数据库(Database):相当于一个个独立的文件夹。不同项目用不同的库。
3.表(Table):相当于Excel里的sheet页面。比如user_info表、order_info表。
4.行(Row)和列(Column):
行:数据的属性(如姓名年龄金额)。建表时定义好必须符合指定的数据类型(整数、字符串、小数等)。
列:一天具体的数据记录(如,张三,25岁,100元)。
在测试视角里,做接口自动化时,Python连过来第一件事就是USE xxx_test;(选定文件夹),然后才能对里面的表进行操作。
补充:本地用PyCharm敲python代码,那是客户端(Client)。连过去,就是通过TCP协议连到了云服务器上的3306端口,唤醒mysqld(服务端)干活。C/S架构对应客户端/服务端架构。
二、需要掌握的SQL核心分类
以下四种分类为核心,其他的(如建表、改表结构、分配权限)了解即可。
(一)、DML:数据操纵语言
这是最常用的,用来往表里塞假数据,或者清理测试产生的脏数据。
INSERT:插入新数据(造测试数据)。
UPDATE:修改已有数据(该状态,比如把订单从未支付改成已支付)。
DELETE:删除数据(清理脏数据)。
(二)、DQL:数据查询语言
测试岗的灵魂!几乎80%的数据库操作都在这里。用来验证接口返回的结果,在数据库里是不是真的存在。
核心是SELECT,但是是带着各种条件的:
基础查询:SELECT * FROM 表名 WHERE 条件;
排序:ORDER BY 字段 DESC(降序,测列表接口经常需要验证最新的排在最上面)
聚合统计:COUNT(*)(数条数)、SUM(金额)(算总和)。用来和前端展示的总数对账。
连接查询:LEFT JOIN 。用来验证主表和副表的数据是否一一对应。
(三)、DDL:数据定义语言
建库、建表、改表结构。
CRETE DATABASE,就是DDL
通常为了跑自动化脚本,在本地环境临时建个表,胡哦这误删了数据,需要TRUNCATE TABLE(清空表)重置环境。
(四)、DCL:数据控制语言
比如建一个testuser并给它远程访问权限的GRANT与据。了解概念即可。
三:SQL语句的执行顺序。
搞懂执行顺序,写复杂查询就不会乱。
例如SLECT......FROM......JOIN......WHERE......GROUP BY......HAVING......ORDER BY......LIMIT
MySQL的底层执行顺序:
1.FROM/JOIN:先确定去哪个表里找数据,把表拼起来。
2.WHERE:一行一行过滤,剔除不符合条件的行(这里不能跟聚合函数)(单行拦截)
3.GROUP BY:把剩下的行,按某个列的值进行合并打包(比如按用户ID分组)。(打包合并)
4.HAVING:对打包后的大包裹进行过滤(这里才能用聚合函数)。(整箱拦截)
5.SELECT:打开包裹,把需要的列挑出来。(拆箱拿货)
6.ORDER BY:把挑出来的排个序。(排队)
7.LIMIT:截取前几条。(截断)
总结一下:
三、LEFT JOIN的底层逻辑
现在有两张表,一张user_info(用户表),一张order_info(订单表)。现在需要查出所有用户以及他们买了多少钱。没钱的也要显示出来。
1.为什么不能用INNER JOIN?
首先INNER JOIN,叫内连接。底层逻辑是:只保留两张表里"相互匹配"的数据。
如果一个用户没买过东西,在订单表里找不到该用户的记录,INNER JOIN就会直接筛掉这个用户。这在前端展示的时绝对是个bug(用户列表少了人)。
2.那么为什么用LEFT JOIN?
LEFT JOIN的底层逻辑:左表
LEFT JOIN叫左连接。核心口诀:左边是老大,必须全保留。右边没有的,填NULL。
语法骨架:
SELECT 左表.列名, 右表.列名
FROM 左表
LEFT JOIN 右表
ON 左表.关联字段 = 右表.关联字段;
关键点:
ON 后面是连接条件。
只有 LEFT JOIN 和 INNER JOIN 才有 ON。(千万不要写 WHERE 左表.id = 右表.id,那会变成内连接,一方数据为空的话就会消失)。
那么怎么找出NULL的数据呢?
代码例子:
SELECT u.name
FROM user_info u
LEFT JOIN order_info o ON u.user_id = o.user_id
WHERE o.user_id IS NULL;
强行保留user_info拼order_info,然后加个过滤条件"只要order_info的id是空的",就能查出来哪些是user_info有、order_info没有的人。