对“全方位”测试人员的需求正在增长。“全方位”是什么意思?这意味着测试人员除了具备传统的“点点点”测试方法来测试系统功能的能力,并能够利用技术专长来验证系统的各个方面。该技术专长包括操作系统,界面和数据库验证技能。之前我有介绍过测试为什么要学习 Linux,今天就来重点介绍 为什么要学习SQL。
SQL 由 IBM 的 Donald D. Chamberlin 和 Raymond F. Boyce 于1970年代开发,SQL 是指结构化查询语言。 最初,它被称为SEQUEL,该名称仍被用作 SQL 的替代发音,但后来被重命名为 SQL。
SQL 是用于关系数据库管理和数据操作的标准计算机语言。SQL 用于查询,插入,更新和修改数据。你可以将SQL 视为用户和数据库管理系统(DBMS)之间的通信媒介。
简而言之,SQL 是一种编程语言,我们可以用来与数据库进行交互和访问。
测试人员可能需要或可能不需要 SQL 技能;它取决于项目需求以及测试团队的需求。
如果项目是数据仓库项目,你需要将主要精力放在数据上。那么,在这种情况下,测试人员需要 SQL 技能。
但是,想象一下,如果团队中有另一位具有 SQL 技能的测试人员,这时候,作为测试的你可能不需要 SQL 技能。同一个项目,你也可以看到 测试人员扮演的角色取决于需求。
更需要 SQL 技能的项目包括:
平时工作中,我使用 SQL 的场景最多的就是前端页面填写完表单数据,验证数据是否已存储在后端(数据库)中以及是否存储正确 ;如果前端显示的数据值从后端更改了,更改是否显示在前端?在测试时应该对这些操作进行验证。
我认为测试人员应该具有以下数据库和 基本 SQL知识::
SQL 技能与其他技能一样,可能会帮助你找到工作,可能对项目有帮助。我们不需要精通它,学习一些基本的SQL 语句,对关系数据库的工作方式有一定的了解。
1、SELECT
首先,最常用的是查询语句。要从SQL数据库检索数据,我们需要编写 SELECT 语句。
选查询特定列
SELECT column, another_column, … FROM mytable;
选择查询所有列
SELECT * FROM mytable;
该查询特别有用,因为它是通过一次转储所有数据来检查表的简单方法。
注:SELECT是一个关键字;SQL 不需要将所有关键字都写成大写字母,但是作为一种约定,它可以帮助人们从列名和表名中区分出 SQL关键字,并使查询更易于阅读。
同时,分号是结束语句的意思。
举个例子,大家可能更加直观。
Table: movies
id | title | director | year | length_minutes |
1 | 玩具总动员 |
John Lasseter | 1995 | 81 |
2 |
玩具总动员2 |
John Lasseter | 1999 | 93 |
3 | 怪兽电力公司 |
Pete Docter | 2001 | 92 |
4 | 海底总动员 |
Andrew Stanton | 2003 | 107 |
5 | 超人总动员 |
Brad Bird | 2004 | 116 |
比如,需要查询所有电影名,我们可以
SELECT title FROM movies;
title |
玩具总动员 |
玩具总动员2 |
怪兽电力公司 |
海底总动员 |
超人总动员 |
2、WHERE
现在,我们知道了如何从表中选择特定的数据列,但是如果您的表具有一亿行数据,那么读取所有行将是低效率的,甚至是不可能的。为了过滤返回的某些结果,我们需要在查询中使用子句 WHERE 。
选择约束查询
SELECT column, another_column, …FROM mytable
WHERE condition
AND/OR another_condition
AND/OR …;
比如,需要查询出海底总动员的信息 ,我们可以
SELECT * FROM movies
WHERE title = "海底总动员";
id | title | director | year | length_minutes |
5 | 超人总动员 |
Brad Bird | 2004 | 116 |
3、DISTINCT
即使数据库中的数据可能是唯一的,但任何特定查询的结果都可能不是。以我们的电影表为例,同一导演可以发行许多不同的电影。在这种情况下,SQL提供了一种便捷的方法,可以通过使用DISTINCT
关键字来丢弃具有重复列值的行。
选择具有唯一结果的查询
SELECT DISTINCT column, another_column, …FROM mytableWHERE condition(s);
比如,想知道表中所有电影导演都有谁,可以:
SELECT DISTINCT director FROM movies;
director |
John Lasseter |
Pete Docter |
Andrew Stanton |
Brad Bird |
4、操作符:LIKE
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
选取 director 以字母 "J" 开始的所有数据
SELECT * FROM movies
WHERE director LIKE 'J%';
id | title | director | year | length_minutes |
1 | 玩具总动员 |
John Lasseter | 1995 | 81 |
2 |
玩具总动员2 |
John Lasseter | 1999 | 93 |
选取 director 以字母 "r" 结尾的所有数据
SELECT * FROM movies
WHERE director LIKE '%r';
id | title | director | year | length_minutes |
1 | 玩具总动员 |
John Lasseter | 1995 | 81 |
2 |
玩具总动员2 |
John Lasseter | 1999 | 93 |
3 | 怪兽电力公司 |
Pete Docter | 2001 | 92 |
通过使用 NOT 关键字,您可以选取不匹配模式的记录。
选取 director 不包含 "ss" 的所有数据
SELECT * FROM movies
WHERE director NOT LIKE '%ss%';
id | title | director | year | length_minutes |
3 | 怪兽电力公司 |
Pete Docter | 2001 | 92 |
4 | 海底总动员 |
Andrew Stanton | 2003 | 107 |
5 | 超人总动员 |
Brad Bird | 2004 | 116 |
5、ORDER BY
与上面的表整齐排序不同,真实数据库中的大多数数据没有特定的列顺序添加。当表的大小增加到数千甚至几百万行时,可能难以阅读和理解查询的结果。
为了解决这个问题,SQL 提供了一种使用 ORDER BY 子句对结果按升序或降序进行排序的方法。ASC 是升序,DESC 是降序,默认是升序。
选择查询结果排序
SELECT column, another_column, …FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC;
比如,想知道按年份降序的电影年份情况,可以:
SELECT year FROM movies ORDER BY year DESC;
year |
2004 |
2003 |
2001 |
1999 |
1995 |
6、LIMIT & OFFSET
和 ORDER BY 子句一起使用的有 LIMIT 和 OFFSET 子句,用于检索查询返回的行的一部分
选择行数有限的查询
SELECT column, another_column, …FROM mytableWHERE condition(s)ORDER BY column ASC/DESC LIMIT num_limit OFFSET num_offset;
如果要只返回前3
行数据,可以使用LIMIT
子句:
SELECT year FROM movies LIMIT 3;
year |
1995 |
1999 |
2001 |
OFFSET 则可以指定从哪里开始计数的行数,比如按年份降序,列出第 2 行到第4行的数据
SELECT * FROM movies ORDER BY year DESC LIMIT 3 OFFSET 1;
id | title | director | year | length_minutes |
4 | 海底总动员 |
Andrew Stanton | 2003 | 107 |
3 | 怪兽电力公司 |
Pete Docter | 2001 | 92 |
2 |
玩具总动员2 |
John Lasseter | 1999 | 93 |
注意:OFFSET 从 0 开始计数。
7、INNER JOIN…
到目前为止,我们一直在处理单个表,但是现实世界中的实体数据通常被分解为多个部分,并使用称为标准化的过程存储在多个正交表中。我们需要通过多表查询,得到想要的数据。
INNER JOIN
是一个过程,它匹配来自第一个表和第二个表的具有相同键(由ON
约束定义)的行,以使用两个表中的合并列创建结果行。
在多个表上使用INNER JOIN选择查询:
SELECT column, another_table_column, …FROM mytable
INNER JOIN another_table
ON mytable.id = another_table.id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
注:INNER JOIN
简写为JOIN
。这两个是等效的。
在 pixar 数据库中,我添加了一个新表,尝试练习一些联接。表 boxoffice,存储了电影的收视率以及国内国外的票房。字段 movie_id 与 movies 表的列编号 id 是一一对应的。
Table: boxoffice (Read-Only)
movie_id | rating | domestic_sales | international_sales |
5 | 8.2 | 380843261 | 555900000 |
14 | 7.4 | 268492764 | 475066843 |
8 | 8 | 206445654 | 417277164 |
12 | 6.4 | 191452396 | 368400000 |
3 | 7.9 | 245852179 | 239163000 |
6 | 8 | 261441092 | 370001000 |
9 | 8.5 | 223808164 | 297503696 |
比如,要查找每部电影的国内和国际销售:
SELECT title, domestic_sales, international_sales
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id;
显示每部在国际上胜于国内的电影的销量数字:
SELECT title, domestic_sales, international_sales
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id
WHERE international_sales > domestic_sales;
按等级降序列出所有电影:
SELECT title, rating
FROM movies
JOIN boxoffice
ON movies.id = boxoffice.movie_id
ORDER BY rating DESC;
是不是没有想象的那么复杂?还是我常说的,需要大家可以跟着我一起尝试!
在工作中,上面介绍的这些语句基本够用了。要记住,对于测试人员而言,这基本上不是核心知识。我们下次见!