1
3.对测试的理解: 2
4 编程:两个栈实现一个队列(说思路) 2
7.线程和进程的区别?多线程和多进程的区别? 3
5. 数据库索引方面:MySQL 除了 B+树索引还有没有其他索引、索引优缺点分
析、B+树索引介绍 3
6. 数据结构方面,B 树和 B+树区别、数组和链表区别 4
7. 数据库事务理解 4
10. Python 的 List 和 Tuple 区别,怎么删除列表末尾的元素 5
19. 问了字符串去除空格的方法,感觉像翻转单词顺序那道题的思路,trim()
5
20. Python 假设 ab 字符转为 ef 字符,可以用什么方法 5
最后问了为什么选择做测试 5
2. 数据库:索引介绍、事务介绍(什么是事务)、ACID 属性 6
测试百度搜索页面(可能是嫌我像在背模板,问了一些深层次的) 6
测试的工具: 8
get 和 post 请求的方法之间的区别 8
web 测试和 app 测试什么区别 9
http 和 https 的区别:(对网络知识了解多少) 10
黑盒白盒有哪些方法,条件覆盖和判定覆盖区别是什么? 10
mysql 修改表的某一列 11
TCP 三次握手 11
数据库怎么设计的 11
python 正则匹配 11
有哪些排序算法,哪稳定,哪些不稳定 12
python 迭代器 12
数组和链表的区别: 13
数据库的三大范式 13
数据库查询的连接方式 132
2
面试官你好,我是来自西安电子科技大学的 XX,目前就读于 xx 专业,这次投
递咱们的 xx 岗位,自己觉得跟岗位的匹配度很高,然后我主要熟悉的编程语言
xx,在学校做过什么项目,项目细节,最后说一句希望能有机会加入咱们公司
你可以说,我在平时的开发中更喜欢发现 bug 的乐趣,然后自己对测试这一块
也看的比较多,有自己购买书籍,比如 Google 的测试之道
那你说,我也知道咱们测试行业的有名书籍,比如谷歌的测试之道
3.对测试的理解:
测试人员通常是做为软件质量控制的一个角色,不仅仅是找 bug,需要对整个
软件的质量负责,性能也属于质量的一部分,因此测试人员眼中的性能应该是
全面的,考虑的东西也需要全面:
1、测试人员需要考虑全面的性能,包括用户、开发、管理员等各个视角的性
能。
2、测试人员在做性能测试时除开要关注表面的现象如响应时间,也需要关注本
质,比如用户看不到的服务器资料利用率,架构设计是否合理?代码是否合理
等。
3.编程:topK 问题,时间复杂度(说思路)
4.编程:两个栈实现一个队列(说思路)
栈和队列的相同点以及不同点”,便于做题时的应用!
1.区别与联系
相同点:(1)栈和队列都是控制访问点的线性表;
(2)栈和队列都是允许在端点处进行数据的插入和删除的数据结构;
不同点:(1)栈遵循“后进先出(LIFO)”的原则,即只能在该线性表的一头
进行数据的插入和删除,该位置称为“栈顶”, 而
另外一头称为“栈底”;根据该特性,实现栈时用顺序表比较好;
(2)队列遵循“先进先出(FIFO)”的原则,即只能在队列的尾部
插入元素,头部删除元素。根据该特性,在实现队
列时用链表比较好
,假如我们要插入一些数据“abcd”,我们知道按照这个顺序队列出现的结果也是“abcd”,
而栈会出现“dcba”,刚好相反,因此将该栈的到的数据在插入另外一个栈中就会出现我们3
3
想要的结果。因此,我们定义两个栈为“stack1”和“stack2”,栈 1 只用来插入数据,栈 2 用
来删除数据栈 1 插入进来的数据。
7.线程和进程的区别?多线程和多进程的区别?
进程好比一个 cpu 中可以处理的单个任务(工厂),线程相当于工厂中的工人
做个简单的比喻:进程=火车,线程=车厢
- 线程在进程下行进(单
纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火 车,比如站点换乘
- 同一进程下不同线程间数据很易共享(A 车厢换到 B 车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更 耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车 不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影 响到所有车厢)
- 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨 道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其 他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥 锁"
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允 许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号 量” 多进程:允许多个任务同时进行 多线程:允许单个任务分成不同的部分进行 每个进程拥有自己的一整套变量,而线程则是共享数据,共享变量使得线程之 间的通信比进程之间的通信更有效,更容易 5. 数据库索引方面:MySQL 除了 B+树索引还有没有其他索引、索引优缺点分 析、B+树索引介绍 MySQL 数据库支持多种索引类型,如 BTree 索引,B+Tree 索引,哈希索引,全 文索引等等, B+Tree 是 BTree 的一个变种,设 d 为树的度数,h 为树的高度,B+Tree 和 BTree 的不同主要在于: B+Tree 中的非叶子结点不存储数据,只存储键值; B+Tree 的叶子结点没有指针,所有键值都会出现在叶子结点上,且 key 存储的 键值对应的数据的物理地址;4 4 B+Tree 的结构如下 一般来说 B+Tree 比 BTree 更适合实现外存的索引结构,因为存储引擎的设计专 家巧妙的利用了外存(磁盘)的存储结构,即磁盘的一个扇区是整数倍的 page (页),页是存储中的一个单位,通常默认为 4K,因此索引结构的节点被设计 为一个页的大小,然后利用外存的“预读取”原则,每次读取的时候,把整个 节点的数据读取到内存中,然后在内存中查找,已知内存的读取速度是外存读 取 I/O 速度的几百倍,那么提升查找速度的关键就在于尽可能少的磁盘 I/O, 那么可以知道,每个节点中的 key 个数越多,那么树的高度越小,需要 I/O 的 次数越少,因此一般来说 B+Tree 比 BTree 更快,因为 B+Tree 的非叶节点中不 存储 data,就可以存储更多的 key。 6. 数据结构方面,B 树和 B+树区别、数组和链表区别 B+树和 B 树的操作的优势在于 B+树的查找效率上,所以下面具体看查询 B 树中每个节点的关键字都有 data 域,而 B+树除了叶子节点,其他节点只有索 引,也就是说同样的磁盘页 B+树可以容纳更多的元素。 B+树的范围查询更加方便,可以先找到范围下限,然后通过叶子结点的链表顺 序遍历,直至找到上限即可。而 B 树只能先找到下限,通过中序遍历查找,直 到找到上限。 数组和链表的区别: 不同:链表是链式的存储结构;数组是顺序的存储结构。 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长 度扩充,但是寻找某个元素较为困难; 数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编 程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。 相同:两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。 7. 数据库事务理解 事务就是一段 sql 语句的批处理,但是这个批处理是一个 atom(原子),不可分割,要么都执 行,要么回滚(rollback)都不执行。5 5 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除 一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等 等,这样,这些数据库操作语句就构成一个事务! 10. Python 的 List 和 Tuple 区别,怎么删除列表末尾的元素 1、list 中是可变的,tuple 不可变 所以 tuple 没有 insert, pop,append 方法 2、定义只有一个元素的 tuple 的时候,必须加逗号,否则不会被认为是 tuple,而被识别为括号 比如,a = (1) 会被识别为数字 1, (1,)这样才被识别为一个元组,只有 一个元素,数字 1 3、元组可以转列表,但不可以转字典 不可变的 tuple 有什么意义?因为 tuple 不可变,所以代码更安全。如果可 能,能用 tuple 代替 list 就尽量用 tuple。 s.pop(4) #根据索引值删除元素 listname.pop(index) 19. 问了字符串去除空格的方法,感觉像翻转单词顺序那道题的思路,trim() 去两端空格,split+正则表达式去中间的空格,本来应该是想问 Python 怎么做 的我说 Java 熟悉点就答了 Java 怎么实现的 1.strip():把头和尾的空格去掉 2.lstrip():把左边的空格去掉 3.rstrip():把右边的空格去掉 4.replace('c1','c2'):把字符串里的 c1 替换成 c2。 故可以用 replace(' ','')来去掉字符串里的所有空格 5.split():通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则 仅分隔 num 个子字符串 20. Python 假设 ab 字符转为 ef 字符,可以用什么方法 df.columns = df.columns.str.replace('-','hehe',n = 1) 最后问了为什么选择做测试 1、创新思维----能够持续思考设计测试用例,丰富和优化测试用例 2、责任感----会了解所测试的产品是在怎么样的大环境下工作,如何影响顾客和最终用户 的,理清正在做的工作的重大意义; 另一方面,勇于承认自己的错误,线上出现了 bug,其他项目成员责备测试人员,这时候6 6 要勇于承认自己的错误,没有必要解释来浪费大家的时间和精力,让大家专注于如何解决 这个 bug 上; 3、交流:针对不同的人,说不同的话,总监只想知道项目的结果, 组长想知道具体的进 度,遇到的问题等; 邮件汇报工作:有条理性,把领导最关心的问题放在最前面(项目是否达到上线标准,是 否有遗留 bug),尽量用图表直观展示测试成功,分不同的维度(前端、后台、bug 严重程 度、bug 趋势(几轮、分别多少 bug,重新打开数) 测试的主要工作还是以推动问题解决为主 测试开发主要是为了提高测试的效率; 2. 数据库:索引介绍、事务介绍(什么是事务)、ACID 属性 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所 在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这 是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找 到该行数据对应的物理地址然后访问相应的数据。 二、索引的优缺点 优势:可以快速检索,减少 I/O 次数,加快检索速度;根据索引分组和排序, 可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间 的数据表的 1.5 倍;索引表的维护和创建需要时间成本,这个成本随着数据量 增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效 率,因为在修改数据表的同时还需要修改索引表; 原子性: 不可再分割,要么成功要么不成功 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个 环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务 从来没有执行过一样。 一致性: 最终执行结果一样,保证中途不出现状况 隔离性: 一个事务所所做的修改在最终提交前,对其他事务是不可见的 start transaction; 开启事务 commit 提交;rollback 回滚 持久性: 一旦事务提交,则所做的修改会永远保存在数据库 测试百度搜索页面(可能是嫌我像在背模板,问了一些深层次的) 我一般分:功能测试、性能测试、易用性测试、界面测试、安全性测试、兼容 性测试、其它测试7 7 功能测试 搜索内容为空,点击“百度一下”,看系统处理 搜索内容为空格,点击“百度一下”,看系统处理 搜索内容含有特殊字符的处理 搜索内容带有非法字符 搜索长度在规定范围之内 搜索长度在规定范围之外,看系统能否正确进行截取 搜索内容输入敏感词汇,查看系统处理 搜索框是否支持快捷键操作,比如:zhantie 是否支持回车键搜索 性能测试 在网络情况良好的前提下,页面的跳转需要多少时间 在网络不好的情况下,页面的跳转需要多少时间 对搜索引擎进行加压测试 兼容性测试 不同的平台:windows 系统,mac 系统 不同的浏览器:Firefox 浏览器、Chrome 浏览器、IE 不同的移动平台:android、ios 界面测试 查看 UI 是否显示正确,布局是否美观 页面上是否有错别字 查看错误提示信息的位置是否合理、是否有错别字 搜索结果的页面是否美观 搜索结果数量庞大的时候,是否分页处理,分页是否和需求说明书的要求保持 一致 光标的定焦是否准确 安全性测试 敏感内容的检索是禁止的 SQL 注入防范 编程:字符串中所有包含 baidu 的字符 字符串中是否包含子字符串:用 in if 百度 in site:print(Y) 统计个数: s.count(‘baidu’)8 8 测试的工具: Postman 是谷歌的一款接口测试插件,它使用简单,支持用例管理,支持 get、 post、文件上传、响应验证、变量管理、环境参数管理等功能,可以批量运 行,并支持用例导出、导入。 自己简单了解过 postman 对接口进行测试 其实它就是请求网址(这个不能说网址,你说域名,显的咱更专业),然后看 看能不能返回正确数据 get 和 post 请求的方法之间的区别 最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参 数。 GET 和 POST 是什么?HTTP 协议中的两种发送请求的方法。 HTTP 是什么?HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。 HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP,也就是说,GET/POST 都是 TCP 链接。GET 和 POST 能做的事情是一样一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。 GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。 get :http header 和 data 一并发送出去 post : 浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data 二面 12:00 左右(第一次熬到二面,紧张到不行) 项目问题9 9 web 测试和 app 测试什么区别 相同点: 1、测试流程相同 都需要 立项、反串讲、用例设计,测试执行,缺陷管理,测试报告、上线、线 上持续跟进。 2、从测试内容和方法也相同 都需要进行功能测试、性能测试、安全性测试、GUI 测试等测试类型。 他们的主要区别在于具体测试的细节和方法有区别,比如:性能测试,在 WEB 测试只需要测试响应时间这个要素,在应用测试中还需要考虑流量测试和耗电 量测试, 兼容性测试:在 WEB 端是兼容浏览器,在应用端兼容的是手机设备而且相对应 的兼容性测试工具也不相同 (WEB 因为是测试兼容浏览器,所以需要使用不同的浏览器进行兼容性测试 (常见的是兼容 IE6,IE8,铬,火狐)如果是手机端,那么就需要兼容不同品 牌,不同分辨率,不同的 Android 版本甚至不同操作系统的兼容。(常见的兼 容方式是兼容市场占 率前 Ñ 位的手机即可),有时候也可以使用到兼容性测试 工具,但 WEB 兼容性工具多用 IETester 等工具,而应用程序兼容性测试会使用 试验在这样的商业工具也可以做测试。) 安装测试:WEB 测试基本上没有客户端层面的安装测试,但是应用程序测试是 存在客户端层面的安装测试,就那么相关具备的测试点 (还有,应用测试基于手机设备,还有一些手机设备的专项测试。如交叉事件 测试,操作类型测试,网络测试(弱网测试,网络切换)) 交叉事件测试:就是在操作某个软件的时候,来电话,来短信,电量不足提示 等外部事件。 操作类型测试:如横屏测试,测试手势 网络测试:。包含弱网和网络切换测试需要测试弱网所造成的用户体验,重点 要考虑回退和刷新是否会造成二次提交弱网络的模拟,据说可以用 360wifi 实 现设置。 从系统架构的层面,WEB 测试只要更新了服务器端,客户端就会同步会更新。 而且客户端是可以保证每一个用户的客户端完全一致的。但是 APP 端是不能够 保证完全一致的,除非用户更新客户端如果是 APP 下修改了服务器端,意味着 客户端用户所使用的核心版本都需要进行回归测试一遍。 (还有升级测试:升级测试的提醒机制,升级取消是否会影响原有功能的使 用,升级后用户数据是否被清除了。)10 10 http 和 https 的区别:(对网络知识了解多少) http 协议和 https 协议的区别:传输信息安全性不同、连接方式不同、端口不同、证书申请 方式不同 一、传输信息安全性不同 1、http 协议:是超文本传输协议,信息是明文传输。如果攻击者截取了 Web 浏览器和网站 服务器之间的传输报文,就可以直接读懂其中的信息。 2、https 协议:是具有安全性的 ssl 加密传输协议,为浏览器和服务器之间的通信加密,确 保数据传输的安全。
二、连接方式不同
1、http 协议:http 的连接很简单,是无状态的。
2、https 协议:是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议。三、端口不同
1、http 协议:使用的端口是 80。
2、https 协议:使用的端口是 443.
黑盒白盒有哪些方法,条件覆盖和判定覆盖区别是什么?
黑盒测试的测试方法有:等价类划分、边界值分析法、猜错法、随机数法、因果图
白盒测试的测试方法有:代码检查法、程序变异、静态结构分析法、静态质量度量法、符号
测试法、逻辑覆盖法、域测试、Z 路径覆盖和基本路径测试法
判定覆盖只关心判定表达式的值(真/假),而条件覆盖涉及到判定表达式的每个条件的值(真
/假)。1111
mysql 修改表的某一列
Update 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称 = 新值(WHERE 列名称 = 某值)
mysql 姓李的女生总人数
Select count(*) From 数据表名 Where 姓名 Like '王%' and sex=‘女’TCP 三次握手
第一次
第一次握手:建立连接时,客户端发送 syn 包(seq=j)到服务器,并进入 SYN_SENT 状态,
等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。[3]
第二次
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN
包(seq=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。[3]
第三次
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包
发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。[3]
数据库怎么设计的
设计数据库实际上设计数据表,真正开发有很多设计数据库的软件
三范式:
范式:经过研究和对实际使用过程的总结,对数据库提供一些规范,这些规范称
为范式,一般遵循前三种范式
1NF:不可再拆,列不可再分
2NF:第一范式的基础上,必须有主键,没有包含主键的列必须完全依赖主键
主键有两个或者多个字段的时候,其余部分完全依赖于这些主键,不能依赖于部
分主键
3NF:在二范式基础上,另外非主键的字段必须直接依赖于主键而不能传递
python 正则匹配
‘.’ 匹配所有字符
匹配除换行符’/n’外的所有字符。如果使用了’S’选项,匹配包括’/n’的所有字符。
‘^’和’ ’ 匹 配 字 符 串 开 头 和 结 尾 ‘ / d ’ 匹 配 数 字 ‘ / D ’ 匹 配 非 数 字 1212 ‘ / w ’ 匹 配 字 母 和 数 字 ‘ / W ’ 匹 配 非 英 文 字 母 和 数 字 即 ’ / w ’ 的 补 集 , 等 价 于 [ a − z A − Z 0 − 9 ] 。 ‘ / s ’ 匹 配 间 隔 符 ‘ / S ’ 匹 配 非 间 隔 符 ‘ / A ’ 匹 配 字 符 串 开 头 ‘ / Z ’ 匹 配 字 符 串 结 尾 匹 配 字 符 串 的 结 尾 。 它 和 ’ ’ 匹配字符串开头和结尾 ‘/d’ 匹配数字 ‘/D’ 匹配非数字12 12 ‘/w’ 匹配字母和数字 ‘/W’ 匹配非英文字母和数字 即’/w’的补集,等价于[^a-zA-Z0-9]。 ‘/s’ 匹配间隔符 ‘/S’ 匹配非间隔符 ‘/A’ 匹配字符串开头 ‘/Z’ 匹配字符串结尾 匹配字符串的结尾。它和’ ’匹配字符串开头和结尾‘/d’匹配数字‘/D’匹配非数字1212‘/w’匹配字母和数字‘/W’匹配非英文字母和数字即’/w’的补集,等价于[a−zA−Z0−9]。‘/s’匹配间隔符‘/S’匹配非间隔符‘/A’匹配字符串开头‘/Z’匹配字符串结尾匹配字符串的结尾。它和’’的区别是,’/Z’只匹配整个字符串的结尾,即使在’M’模式下,它
也不会匹配其它各行的行尾。
有哪些排序算法,哪稳定,哪些不稳定
排序算法:是一种能将一串数据依照特定顺序进行排列的一种算法
冒泡排序 插入排序 归并排序 (稳定)
选择排序 希尔排序 堆排序 快速排序 (不稳定)
python 迭代器
什么是迭代器
迭代器是访问可迭代对象的工具
迭代器是指用 iter(obj)函数返回的对象(实例)
迭代器是指用 next(it)函数获取可迭代对象的数据
迭代器函数(iter 和 next)
iter(iterable)从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象
next(iterator) 从迭代器 iterator 中获取下一了记录,如果无法获取下一条记录,则触发
stoptrerator 异常
说明:
1.迭代器只能往前取值,不会后退13
13
2.用 iter 函数可以返回一个可迭代对象的迭代器
数组和链表的区别:
链表是通过结点把离散的数据链接成一个表,通过对结点的插入和删除操作实现对数据的存
取,而数组是通过开辟一段款徐的内存来存储数据
数据库的三大范式
设计数据库实际上设计数据表,真正开发有很多设计数据库的软件
三范式:
范式:经过研究和对实际使用过程的总结,对数据库提供一些规范,这些规范称
为范式,一般遵循前三种范式
1NF:不可再拆,列不可再分
2NF:第一范式的基础上,必须有主键,没有包含主键的列必须完全依赖主键
主键有两个或者多个字段的时候,其余部分完全依赖于这些主键,不能依赖于部
分主键
3NF:在二范式基础上,另外非主键的字段必须直接依赖于主键而不能传递
数据库查询的连接方式
–inner join … on
–在 on 后面写条件,两个表值对应的上那就取交集
select * from 表 A inner join 表 B;
–外连接:左连接,右连接
–left join
–查询每位学生对应的信息
select * from students as s left join classes as c on s.cls_id=c.id;
–谁写在左边,以谁为基准,有显示,没有默认显示为 null14
14
sql 汇总
sql 问题
cross join: 交叉连接,结果是笛卡尔积,就是第一个表符合查询条件的行数乘以第二个表
符合查询条件的行数。
▼索引的作用?
索引是为了提高数据库查询数据的速度而增加的标志符号(通过创建唯一性索引,可以保证
表中每一行数据的唯一性)。索引主要建立在①经常搜索的列;②主键所在列;③外键所
在列
索引包括聚集索引与非聚集索引,它们的区别在于索引记录的顺序与表记录的顺序是否一
致。
聚集索引: 可以理解为索引记录的顺序与表记录的顺序一致,SQL 默认在依次递增的主键上
建立聚集索引,例如,id 为 1 的数据在第一条,id 为 2 的数据在第二条。聚集索引会按照主
键的顺序来排序。(例如,用字典找字,对于认识的字可以通过拼音排序对应正文找到页码)
非聚集索引: 可以理解数据存储在一个地方,索引指向数据存储的位置,索引的顺序与表中
数据记录的顺序不一定一致。例如说,建立数据表登记学生考试成绩,字段包括姓名,学号
与分数。假定该表按照成绩排序、学号信息错乱,可以考虑构建非聚集索引,第一名对应 1,
第二名对应 2……,想要提取第 10 个学生的学号,查找索引 10 指向的数据即可。(用字典找
字,不认识的字可以采用部首结合笔画等信息在检字表中搜索,找到页码。比如查"张"字,
检字表中"张"的页码是 60 页,检字表中"张"的上面是"驰"字,但页码却是 100 页,"张"的下
面是"弩"字,页面是 200 页。很显然,在正文里面这些字并不是真正的分别位于"张"字的上
下方,而检字表中连续的"驰、张、弩"三字实际上就是他们在非聚集索引中的排序)
(关于聚集索引和非聚集索引的区别可以百度学习下,我记得好几家面试都直接问了……)
▼排名函数与排序函数?
排序函数:order by(默认 asc 升序,指定 desc 降序),例如将表格数据按照考试成绩从
低到高排序。
排名函数: rank, dense rank, row number ,得到的成绩的排序后,根据成绩的高低对学生排
名,100 分对应第一名,99 分第二名。它们的区别在于:
row number: 根据成绩排序生成连续的序列号,1,2,3,4,5……
rank: 和 row number 不同,rank 考虑了相同分数学生的排名问题。如第一名 100 分,第 2
名两个人并列 99 分,那么 98 分的同学排名第四。
dense rank: 和 rank 的区别在于,同样考虑了分区内的排名,但 dense rank 的输出结果是连
续的。如第一名 100 分,第 2 名两个人并列 99 分,那么 98 分的同学排名第三。15
15
▼on 和 where 的区别?
前提:数据库在连接多张表返回记录时,都会生成一个中间临时表。
在内连接中,使用 on 或者 where 没有区别。
在外连接里,例如使用 left join 时:
on 是在生成临时表时使用的条件,不管 on 的条件是否为真,都会返回左边表中的全部记
录。
where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含
义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
▼连接多个 select?
union: 连接 select,不允许重复值,而且 select 的对象要有相同的列以及数据类型;(例如
A 表中某字段的数据是 1,1,2,3,4,B 表中对应的数据是(0,0,0,0,0),则提取的数据是(1,0;
2,0;3,0;4,0),也就是说(1,0)这个组合只会出现一次。)
union all: 作用同 union,但是允许重复值(也就是说,与上面一样的操作里,(1,0)这个组合
会出现 2 次)
一般来说如果 select 字段大于 1 个,用 union all 比用 union 速度快,因为 union 会将多个结
果中重复的数据合并,union all 则是直接合并
Intersect: 和 union 指令类似,intersect 也是合并两个 select 语句结果的函数。不同的地方
是,union 的处理结果类似于全集 (如果这个值存在于第一个 select 或者第二个 select,它就
会被选出),而 intersect 则比较像取出交集 ( 值要同时存在于第一个 select 和第二个 select)。
minus: 先找出第一个 select 语句所产生的结果,然后看这些结果有没有在第二个 select 语
句的结果中。最后会输出第一个 select 中没有,但是第二个 select 中有的数据
▼主键和外键?
主键是一张表中能够确定一条记录的唯一标志(数据库中的一条记录中有若干个属性,若其
中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 ),比如身份
证号。
外键用于和另一张表进行关联。例如,A 字段是 A 表的主键,那么出现在 B 表中的 A 字段能
够作为 B 表的外键,实现 A,B 表的连接查询。
▼向表中插入数据?
insert into tablename values: 普通插入数据模式
insert or ignore into: 如果没有则插入数据,如果有则忽略
insert or replace into: 如果不存在就插入,存在就更新16
16
▼删除表中数据?
delete : 删除表中数据,可以指定具体数据(where)
drop column/ drop table : 删除列数据,与 delete 不同,drop 函数会将数据以及表的结构全
部删除。
truncate: 仅删除数据,且默认删除所有数据。和 delete 不同,truncate 不能用 where 进行
筛选,但删除速度比 delete 快
▼字符串常见操作函数?
concat(): 将多个字符串连接成一个字符串,连接符用“”包起来
concat_ws();将多个字符串连接成一个字符串,在最开始的位置指定连接符(指定一次即可)
group concat(): 将 group by 产生的同一个分组中的值连接起来,返回一个字符串。
like(): 需要与通配符一起使用(’%‘代表任意字符出现任意次数;’_’
仅能匹配单个字符)
substr(): 用于从字段中提取相应位置的字符合你。
regexp() : 正则表达式匹配函数
▼ In/exist 的联系与区别
子查询过程中,In 和 exist 函数效率比较:
当进行连接的两个表大小相似,效率差不多;
如果子查询的内表更大,则 exist 的效率更高(exist 先查询外表,然后根据外表中的每一个
记录,分别执行 exist 语句判断子查询的内表是否满足条件,满足条件就返回 ture)。
如果子查询的内表小,则 in 的效率高(in 在查询的时候,首先查询子查询的表,然后将内
表和外表做一个笛卡尔积 (表中的每一行数据都能够任意组合 A 表有 a 行,B 表有 b 行,最
后会输出 a*b 行),然后按照条件进行筛选。所以相对内表比较小的时候,in 的速度较快)。
Exist 的原理: 使用 exist 时,若子查询能够找到匹配的记录,则返回 true,外表能够提取查
询数据;使用 not exist 时,若子查询找不到匹配记录,则返回 true,外表能够提取查询数据。17
17
归并排序的最优最坏时间复杂读都是 nlogn
Q.30. 解释 Python 中的身份运算符
这是非常常见的 Python 面试题,用下面的示例来回答. is 和 not is 运算符可以判断两个对象
是否相同
Q.29. 解释 Python 中的成员运算符
使用 in 和 not in 运算符我们可以判断某个值是否在成员中。
Q.39.列出常见 MYSQL 数据存储引擎
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整
性要求比较高(比如银行),要求实现并发控制(比如售票),那选择 InnoDB 有很大的优势。
如果需要频繁的更新、删除操作的数据库,也可以选择 InnoDB,因为支持事务的提交(commit)
和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,
那么选择 MyISAM 能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使
用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的
读写速度,对数据的安全性要求较低,可以选择 MEMOEY。它对表的大小有要求,不能建立
太大的表。所以,这类数据库只使用在相对较小的数据库表。
Q.40.简述多线程、多进程
进程:
1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立 2、稳定性好,如果一
个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程: 1、CPU 进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能
独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源 2、如果 IO 操作
密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
应用: IO 密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待
的时间 CPU 密集的用多进程,因为假如 IO 操作少,用多线程的话,因为线程共享一个全局
解释器锁,当前运行的线程会霸占 GIL,其他线程没有 GIL,就不能充分利用多核 CPU 的优
势
Q.48.Python 里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式
修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如 list();3,
copy 模块的 copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不18
18
会改变){copy 模块的 deep.deepcopy()函数}
10、python 内建数据类型有哪些
整型–int
布尔型–bool
字符串–str
列表–list
元组–tuple
字典–dict
49、简述 mysql 和 redis 区别
redis: 内存型非关系数据库,数据保存在内存中,速度快
mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的 Io 操作,访问速度相对
慢
107、HTTP 请求中 get 和 post 区别
1、GET 请求是通过 URL 直接请求数据,数据信息可以在 URL 中直接看到,比如浏览器访问;
而 POST 请求是放在请求头中的,我们是无法直接看到的;
2、GET 提交有数据大小的限制,一般是不超过 1024 个字节,而这种说法也不完全准确,
HTTP 协议并没有设定 URL 字节长度的上限,而是浏览器做了些处理,所以长度依据浏览器
的不同有所不同;POST 请求在 HTTP 协议中也没有做说明,一般来说是没有设置限制的,但
是实际上浏览器也有默认值。总体来说,少量的数据使用 GET,大量的数据使用 POST。
3、GET 请求因为数据参数是暴露在 URL 中的,所以安全性比较低,比如密码是不能暴露的,
就不能使用 GET 请求;POST 请求中,请求参数信息是放在请求头的,所以安全性较高,可
以使用。在实际中,涉及到登录操作的时候,尽量使用 HTTPS 请求,安全性更好。19
19
监督学习:通过已经有的训练样本去训练得到一个最优模型,再利用这个模型将所有的输入
映射为相应的输出
监督学习根据输出数据划分为:
3-2 回归问题(输出一个连续的数值) – 线性回归
3-3 分类问题(输出几个特定的数值) — KNN 最邻近分类
非监督学习:根据类别未知的训练样本解决模式识别中的各种问题,主要为 3-4 聚类问题
主成分分析 K-means 聚类
随机算法:3-5,蒙特卡罗模拟(蒙特卡罗算法)
线性回归:回归分析指的是确定两种或者两种以上变量间相互依赖的定量关系的一种统计
分析方法
按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析
最邻近分类算法:简称 KNN,最简单的机器学习算法之一
核心逻辑:在距离空间里,如果一个样本的最接近的 k 个邻居里,绝大多数属于某个类别,
则该样本也属于这个类别
非监督学习 聚类:PCA 主成分分析
最广泛无监督算法 + 基础的降维算法、
通过线性变换将原始数据变换为一组各维度线性无关的表示,用于提取数据的主要特征分量
→ 高维数据的降维
比如拿到一个样本,特征非常多,而样例特别少,这样用回归去直接拟合非常苦难,容易过
渡拟合,所以如果可以通过降维的方法,把多维度变为核心的几个维度,用新的维度去做回
归即可
非监督学习 聚类:K-means 聚类
最常用的机器学习聚类算法,且为典型的基于距离的聚类算法
K 均值:基于原型的,划分的距离技术,它试图发现用户指定个数(K)的簇
以欧式距离作为相似度测度
随机算法-蒙特卡罗模拟
蒙特卡罗方法,又称随机抽样或统计试验方法,是以概率和统计理论方法为基础的一种计算
方法
使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,将所求解的问题同一定的
概率模型相联系,用电子计算机实现统计模拟与抽样,以获得问题的近似解
KNN 最邻近分类算法
最简单的机器学习算法之一
核心逻辑:在距离空间里,如果一个样本的最接近的 K 个邻居里,绝大多数属于某个类别,
则该样本也属于这个类别20
20
聚类分析:(cluster analysis)
是一组将研究对象分为相同同质的群组(clusters)的统计分析技术 → 将观测对象的群体按
照相似性和相异性进行不同群组的划分,划分后每个群组内部各对象相似度很高,而不同群
组之间的对象彼此相异度很高
回归,分类,聚类的区别:
有监督学习 → 回归,分类 / 无监督学习 → 聚类
回归 → 产生连续结果,可用于预测
分类 → 产生离散结果,可用于预测
聚类 → 产生一组集合,可用于降维
课程主讲算法:PCA 主成分 K-means 聚类
PCA 主成分分析
最广泛无监督算法 + 基础的降维算法
通过线性变换将原始数据变换为一组各维度线性无关的表示,用于提取数据的最主要特征
分量 → 高维数据的降维
比如拿到一个样本,特征非常多,而样例特别少,这样用回归直接拟合非常困难,容易过度
拟合,所以如果可以通过降维的方法,把多维度变为核心的几个维度,用新的维度去做回归
即可
1.主成分的目的
对于原来的所有变量,可能会出现重复或者关系紧密的变量,将重复的删去,建立尽可能少
的心变了,使得这些新编俩昂是两两不相关的,而且这些新变量在反应课题的信息方面尽可
能保持原有的信息
一个是降维,之后再看贡献率,提取主成