大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

测试工程师面试宝典——2018-06-13

这个面试题会不定期进行整理,内容会采用无序的方式进行添加,但会根据时间来进行更新。

2018.06.13 更新

1.linux
题1:先来个难点的linux题,感觉这个题有点像考察运维的难度——计算IP Count。如题

某个目录下有两个文件a.txt和b.txt,文件格式为(ip username),例如:

a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.2 lisi
127.0.0.3 wangwu    

b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi

每个文件至少有100万行,请使用linux命令行完成如下工作:

1)两个文件各自的ip数,以及总ip数
2)出现在b.txt而没有出现在a.txt的ip
3)每个username出现的次数,以及每个username对应的ip数

解1):首先我们看文件内容每一行的格式为(ip username),其中两个参数用空格号“ ”分开,这里我用awk来获取第一个参数的内容,然后用sort和uniq命令进行排序和去重,为了后面的第二次去重着想,我们把内容输出到ip_a.txt和ip_b.txt中,代码如下

awk -F ' ' '{print $1}' a.txt | sort | uniq > ip_a.txt
awk -F ' ' '{print $1}' b.txt | sort | uniq > ip_b.txt

结果如下:


ip_a.txt.png
ip_b.txt.png

由上可以看到已经成功筛选。

那么下一步,我们就是统计a.txt和b.txt文件中ip的数量,以及总ip的数量
我们定义a.txt和b.txt中ip的数量分别为变量ip_count_a和ip_count_b,而总ip数量为变量ip_count,然后用wc命令来统计文件中ip的数量,则最终统计的shell脚本如下:

#!/bin/bash
#两个文件各自的ip数,以及总ip数

ip_count_a=0
ip_count_b=0
ip_count=0

awk -F ' ' '{print $1}' a.txt | sort | uniq > ip_a.txt
awk -F ' ' '{print $1}' b.txt | sort | uniq > ip_b.txt

ip_count_a=$(wc -l < ip_a.txt)
ip_count_b=$(wc -l < ip_b.txt)

echo "a.txt文件的IP数为$ip_count_a"
echo "b.txt文件的IP数为$ip_count_b"

ip_count=$(cat ip_a.txt ip_b.txt | sort |uniq | wc -l)

echo "总IP数为$ip_count"

结果如下:


ip_count.png

问题2)、3)待后续解

2.数据库MySQL
题目如下图:


Mysql图表.png

1).算出Table_A表中姓“张”的人员的平均薪资。
2).查询出两张表中Salary大于等于4000的所有人员Name和Salary。
3).如果用一句sql将Table_B表的数据插入Table_A表中。
4).写出一条sql语句:取出表Table_A中第31到第40的记录(SQLServer,以自动增长的ID,作为主键,注意:ID可能不是连续的,尽可能用多种思路)

在解题之前,因为我的数据库没有这些原始数据,需要先添加数据
添加Table_A数据

insert into table_a values(1,'张三',9000),(2,'李四',6000),(3,'王五',8000),(4,'张艳',3000),(5,'李祥',5000);

添加Table_B数据

mysql> insert into table_b (ID,Name,Salary) values (6,'乐明生',4000),(7,'喻关英'
,3000),(8,'骆保秀',2000);

然后我们查询一下Table_A

select * from table_a;

结果如下

+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
|  1 | 张三   |   9000 |
|  2 | 李四   |   6000 |
|  3 | 王五   |   8000 |
|  4 | 张艳   |   3000 |
|  5 | 李祥   |   5000 |
+----+--------+--------+
5 rows in set (0.00 sec)

再查询一下Table_B

select * from table_b;

结果如下

+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
|  1 | 张三   |   9000 |
|  2 | 李四   |   6000 |
|  3 | 王五   |   8000 |
|  4 | 张艳   |   3000 |
|  5 | 李祥   |   5000 |
+----+--------+--------+
5 rows in set (0.00 sec)

可见数据输入正确,接下来是解题:
问题1).算出Table_A表中姓“张”的人员的平均薪资。
解:
思路:这一题就是考察基本的mysql语句,select、from、where、like几个语句的结合使用,还有一个就是平均数函数avg的使用

select avg(Salary) from table_a where Name like '张%';
+-------------+
| avg(Salary) |
+-------------+
|   6000.0000 |
+-------------+
1 row in set (0.00 sec)

问题2).查询出两张表中Salary大于等于4000的所有人员Name和Salary。
解:
思路:这道可以分别查询Table_A和Table_B,然后把查询结果放到一起,其实就是考察union的使用

select Name,Salary from table_a where Salary >= 4000 union select Name,Salary from table_b where Salary >= 4000;
+-----------+--------+
| Name      | Salary |
+-----------+--------+
| 张三      |   9000 |
| 李四      |   6000 |
| 王五      |   8000 |
| 李祥      |   5000 |
| 乐明生    |   4000 |
+-----------+--------+
5 rows in set (0.00 sec)

问题3).如果用一句sql将Table_B表的数据插入Table_A表中。
解:
思路:其实就是考察插入语句insert into的使用

 insert into table_A select * from Table_B;
+----+-----------+--------+
| ID | Name      | Salary |
+----+-----------+--------+
|  1 | 张三      |   9000 |
|  2 | 李四      |   6000 |
|  3 | 王五      |   8000 |
|  4 | 张艳      |   3000 |
|  5 | 李祥      |   5000 |
|  6 | 乐明生    |   4000 |
|  7 | 喻关英    |   3000 |
|  8 | 骆保秀    |   2000 |
+----+-----------+--------+
8 rows in set (0.00 sec)

也可以用以下语句实现,原理跟上面语句是一个意思

insert into table_a (id,name,salary) select id,name,salary from table_b;
+----+-----------+--------+
| ID | Name      | Salary |
+----+-----------+--------+
|  1 | 张三      |   9000 |
|  2 | 李四      |   6000 |
|  3 | 王五      |   8000 |
|  4 | 张艳      |   3000 |
|  5 | 李祥      |   5000 |
|  6 | 乐明生    |   4000 |
|  7 | 喻关英    |   3000 |
|  8 | 骆保秀    |   2000 |
+----+-----------+--------+
8 rows in set (0.00 sec)

问题4).写出一条sql语句:取出表Table_A中第31到第40的记录(SQLServer,以自动增长的ID,作为主键,注意:ID可能不是连续的,尽可能用多种思路)
解:
思路:这题考察order by、记录条数限制limit和下标offset的使用,我的想法是这样的

 select * from table_a order by id limit 10 offset 31;
+----+----------+--------+
| ID | Name     | Salary |
+----+----------+--------+
| 53 | 张艳
   |   3911 |
| 54 | 张艳
   |   3912 |
| 55 | 张艳
   |   3913 |
| 56 | 张艳
   |   3914 |
| 57 | 张艳
   |   3915 |
| 58 | 张艳
   |   3916 |
| 59 | 张艳
   |   3917 |
| 64 | 张艳
   |   3918 |
| 65 | 张艳
   |   3919 |
| 66 | 张艳
   |   3920 |
+----+----------+--------+
10 rows in set (0.00 sec)