Mysql(基于测试的学习)

在软件测试里(尤其接口自动化的视角下),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没有的人。

相关推荐
砚底藏山河1 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
宇宙无敌暴龙战士6662 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊2 小时前
MySQL 的四种隔离级别
java·数据库·mysql
say_fall2 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
共享家95273 小时前
408 操作系统第一章
服务器·数据库·windows
这个DBA有点耶3 小时前
连拿六年第一后宣布出海:国产数据库凭什么敢撕掉“平替”的标签?
数据库·人工智能·架构
云和恩墨4 小时前
数据库监控简史:从会回答到能交付——AI-DBA如何成为真正的数字同事
数据库·人工智能·dba
paopaokaka_luck4 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
这个DBA有点耶5 小时前
为什么删掉索引后,查询瞬间变快了?探讨MySQL的随机I/O与顺序I/O博弈
数据库·mysql·代码规范