最近面试的软件测试笔试题笔试题(已整理参考答案)

1.常见的测试用例设计方法都有哪些?分别以具体的例子来说明这些方法在测试用例设计工作中的应用。

1. 等价类划分

 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.

2. 边界值分析法

边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.

使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.

3. 错误推测法

基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法. 错误推测方法的基本思想就是: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结。还有, 输入数据和输出数据为0的情况。输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例.

4. 因果图方法

前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况.

5. 正交表分析法

有时候,可能因为大量的参数组合而引起测试用例数量上的增加,同时,这些测试用例并没有明显的优先级上的差距,而测试人员又无法完成这么多数量的测试,就可以通过正交表来进行缩减一些用例,从而达到尽量少的用例覆盖尽量大的范围的可能性。

6. 场景分析方法

指根据用户场景来模拟用户的操作步骤,这个比较类似因果图,但是可能执行的深度和可行性更好。

---

5种常见的测试用例设计方法

  一、等价类划分

  1)概念

  某个输入域的集合,在这个集合中每个输入条件都是等效的,如果其中一个的输入不能导致问题发生,那么集合中其它输入条件进行测试也不太可能发现错误。

  关于等价类划分的两个重要概念:

  有效等价类:有效等价类是程序规格说明有意义,合理的输入数据。

  比如用正确的用户名和密码来登录系统就是有效等价类。

  无效等价类:无效等价类是程序规格说明无意义,不合理的输入数据。

  比如用不存在的用户名和密码来登录系统就是无效的等价类。

  2)等价类法设计测试用例的步骤

  为每个输入划分等价类,得到等价类表,为每个等价类规定一个唯一编号

  设计一个测试用例,使其尽可能多的覆盖所有尚未覆盖的有效等价类。重复这一步骤,使得有效等价类均被测试用例所覆盖设计一个测试用例,使其只覆盖一个无效等价类。重复这一步骤使得所有无效等价类均被覆盖。

  假设上面的文字你都没有看懂,那么做个题目就懂啦。

  3)案例来了

  程序规定:输入三个正整数作为三边的边长构成三角形。请用等价类方法设计测试用例分别判断输入3个整数时的三角形为一般三角形、等腰三角形、等边三角形时情况:

  提示:

  需求提取:

  1、三条边需求:整数/3个数/非零数/正数

  2、一般三角形的要求:二边之和大于第三边

  3、等腰三角形:二二边相等且满足二边之和大于第三边

  4、等边三角形:三条边相等

  参考答案

最近面试的软件测试笔试题笔试题(已整理参考答案)_第1张图片

  答案解析:符合的需求条件的即是有效等价类,比如,等腰三角形,那么要求至少有两条边相等,所有有效等价类就包括a=b b=c a=c ,那么不符合条件的就是无效等价类包括a!=b b!=c a!=c

  二、边界值分析

  1)概念

  边界值分析方法的理论基础是假定大多数的错误是发生在各种输入条件的边界上,如果在边界附近的取值不会导致程序出错,那么其它的取值导致程序错误的可能性也很小。

  2)边界值分析法设计用例的步骤

  分析输入参数的类型:从测试规格中分析得到输入参数类型

  等价类划分(可选):对于输入等价类划分方法进行等价类的划分

  确定边界:运用域测试分析方法确定域范围的边界(上点、离点与内点)

  相关性分析(可选):如果存在多个输入域,则需要运用因果图、判定表方法这些输入域边界值的组合情况进行进一步分析

  形成测试项:选择这些上点、离点与内点或者这些点的组合形成测试项

  3)案例来了

  假设存在以下的测试场景,某个网站的登录页面:

最近面试的软件测试笔试题笔试题(已整理参考答案)_第2张图片

  1、用户名:1—20个字符,包括1和20,其他不考虑

  2、密码:6个数字,其他不考虑

  现要求用边界值分析法测试用户名和密码这两个输入框。

  参考答案

  边界值分析方法如下:

最近面试的软件测试笔试题笔试题(已整理参考答案)_第3张图片

  答案解析:密码这个字段的范围是闭区间【1-20】,用边界值设计用例,那么去找这两个数的左邻右舍+自己,1则是0和1和2,20则是19,20,21。

  三、判定表

  1)概念

  判定表是分析和表达多种输入条件下系统执行不同动作的工具,它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确 。

  2)判定表法设计用例的步骤

  列出所有的条件桩和动作桩

  填入条件桩、条件项

  填入动作桩、动作项

  化简,合并相似规则

  将每条规则转化为用例

  3)案例来了

  假设有以下逻辑:

最近面试的软件测试笔试题笔试题(已整理参考答案)_第4张图片

  运用判定表设计用例。

  参考答案

最近面试的软件测试笔试题笔试题(已整理参考答案)_第5张图片

  答案解析:判定表的解题思路就是先列出所有条件,然后列出每个条件的取值,最后如上图,一列就是一条用例。

  四、正交试验法

  1)概念

  正交试验设计(Orthogonal experimental design)是研究多因子多水平的又一种设计方法,它是根据正交性从全面试验中挑选出部分有代表性的点进行试验,这些有代表性的点具备了“均匀分散,齐整可比”的特点。

  关于正交试验表的两个重要概念:

  1、所有参与试验、影响试验结果的条件称为因子。

  2、影响试验因子的取值或输入叫做因子的水平。

  如何选择正交表:

  1、考虑因子的个数

  2、考虑水平的个数

  3、考虑正交表的行数

  4、取行数最少的一个

-------

2.关于如何提交高质量的缺陷报告单,本人总结了如下几点:

  1、 缺陷的概要描述要清晰准确,要使相关开发负责人员能够一目了然问题是什么。

  2、 一个完整的缺陷报告单,必须包含其必要的元素信息,例如:概要描述,缺陷发现人,测试环境,浏览器,缺陷重现步骤,严重等级,指派人,所属功能模块等等,必要元素信息必须描述全面清楚。

  3、 缺陷的重现步奏必须描写清晰明了,使相关开发负责人能够根据重现步骤准确的重现所提交的缺陷,使其定位缺陷的原因所在。

  4、 指派给人一定要明确,如知道缺陷是所属具体的某一个开发人员时,应该直接指派给对应的负责人,这样就能减少中间分配环节的时间。

  5、 测试数据,测试的数据作为重现缺陷的一个重要元素信息,一定要将测试时所使用的信息给描写清楚准确。让开发人员根据测试所提供的测试数据准确重现缺陷。

  6、 附件截图信息,附件或截图信息能让开发人员能够一目了然的清楚问题的所在,所以必要的时候提供附件或者截图信息也非常的重要。

  7、描述缺陷内容的语气,在进行缺陷单书写时,尽量使用专业术语(体现测试的专业性),其次注意书写缺陷报告单时不要带有个人客观的语气内容,以免影响开发和测试人员之间的关系。

3.如何测试一个纸杯?

功能度:用水杯装水看漏不漏;水能不能被喝到

安全性:杯子有没有毒或细菌

可靠性:杯子从不同高度落下的损坏程度

可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用

兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等

易用性:杯子是否烫手、是否有防滑措施、是否方便饮用

用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述

疲劳测试:将杯子盛上水(案例一)放24小时检查泄漏时间和情况;盛上汽油(案例二)放24小时检查泄漏时间和情况等

压力测试:用根针并在针上面不断加重量,看压强多大时会穿透

4.测试用例包含哪些内容

1、用例编号:相当于一个人的身份证号、一个用例也有一个英里编号
2、用例名称:也就是一个人的名字,每一个都有一个名字,用例也有一个自己的名字
3、测试背景:就是测试环境背景,说明什么项目,测什么,在什么情况背景下去测
4、优先级:根据自己安排来确定哪一个优先
5、重要级:根据事情的重要程度来确定,和优先级有一点差别
6、测试数据:测试的参数数据
7、测试步骤:也就是测试的一个过程我
8、预期结果:想象的一个可能达到的结果
9、实际结果:实际测试过程出现的最终结果
10、备注:强调特殊情况内容
11、前置条件:测试的前提条件,比如你要测一个登陆界面,你要有一个已注册的账号密码,这才能测

5.详细的描述一个测试活动完整的过程,

1-项目经理通过和客户的交流,完成需求文档,由开发人员和测试人员共同完成需求文档的评审,评审的内容包括:需求描述不清楚的地方和可能有明显冲突或者无法实现的功能的地方。项目经理通过综合开发人员,测试人员以及客户的意见,完成项目计划。然后sqa进入项目,开始进行统计和跟踪

  2-开发人员根据需求文档完成需求分析文档,测试人员进行评审,评审的主要内容包括是否有遗漏或者双方理解不同的地方。测试人员完成测试计划文档,测试计划包括的内容上面有描述。

  3-测试人员根据修改好的需求分析文档开始写测试用例,同时开发人员完成概要设计文档,详细设计文档。此两份文档成为测试人员撰写测试用例的补充材料。

  4-测试用例完成后,测试和开发需要进行评审。

  5-测试人员搭建环境

  6-开发人员提交第一个版本,可能存在未完成功能,需要说明。测试人员进行测试,发现bug后提交给bugzilla。

  7-开发提交第二个版本,包括bug fix以及增加了部分功能,测试人员进行测试。

  8-重复上面的工作,一般是3-4个版本后bug数量减少,达到出货的要求。

  9-如果有客户反馈的问题,需要测试人员协助重现以及回归测试。

6.什么是接口测试,接口测试的组成是什么?,为何要做接口测试

什么是接口测试?为什么要做接口测试? - Zoraliu - 博客园 (cnblogs.com)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

由于如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,所以就要做接口测试。同时,接口测试相对容易实现自动化持续集成,且相对UI自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。接口持续集成是为什么能低成本高收益的根源。现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易), 需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。前后端传输、日志打印等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等。

1.请求模型
接口的请求可以理解为接口就是一个电灯的开关,它在接口里面给你提供了一个参数,参数的值一个是 “开”,一个是“关”。

	当你访问“http://ip:port/light?opt=open”,让零线、火线连通,此时灯亮。
	当你访问“http://ip:port/light?opt=close”,让零线、火线断开,此时灯灭。

2.请求结构
HTTP的URL是怎么组成为一个接口的
最近面试的软件测试笔试题笔试题(已整理参考答案)_第6张图片
一个URL就是一个接口:接口大致会分为一下几个部分:

    请求协议:
	http — 普通的http请求
	https — 加密的http请求,传输数据更加安全
	ftp — 文件传输协议,主要用来传输文件
	
	请求IP:就是指提供接口的系统所部署的服务器地址
	请求端口:如果不填端口,默认是80,否则需要填写端口号
	接口地址:指系统提供的接口在什么位置
	接口参数:参数在接口路径后,用“?”来表示路径地址完了,剩下的都是参数了,
	用“&”来区分参数个数

	例如:
	http://127.0.0.1:8080/light?opt=open&use=yy&pwd=123456
	假设要操作这个灯,需要用户密码,则可以增加新的参数”use”、”pwd”,用”&”来隔开。
	可以看到这个示例有3个参数:
	“opt”:”open”
	“use”:”yy”
	“pwd”:”123456”

3.接口HTTP参数

  • http请求方式
    最近面试的软件测试笔试题笔试题(已整理参考答案)_第7张图片
  1. http请求头
    请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度。例如:
    最近面试的软件测试笔试题笔试题(已整理参考答案)_第8张图片

  2. http请求体
    请求体就是请求等正文了,可以有很多种请求体。
    json格式
    xml格式
    html格式
    二进制格式( 多数用于图片 )
    字符串格式

  3. 看到上面的请求结构,就能接口测试了,只需要修改接口的参数,就可以像功能测试一样测了。可以用功能测试设计用例的方法来设计接口测试的用例。可以使用各种测试用具辅助测试,以“postman”测试为例。
    最近面试的软件测试笔试题笔试题(已整理参考答案)_第9张图片

7.如何保证测试的覆盖率

首先,确认需求

面试官简单描述这道题后,你是否真的已经了解了他的需求呢,如上描述,需求范围过于笼统,也就是要明确用户故事。请问这个需求是怎样的项目背景或基于什么前提下而做的;会涉及到哪些支撑平台;具体需要怎样的权限可以上传操作;该功能的迭代会影响到哪些其他的存量功能等,是否有明确的性能需求等

第二,梳理需求,确认测试范围

是否需要考虑历史数据,数据来源,用户角色,支持哪些操作系统,兼容性要求(考虑平台兼容性、浏览器兼容性、手机型号 版本等),是否提供接口文档,DB设计文档等等

第三,制订测试计划

通过测试需求与测试范围,制订测试计划,我需要运用到的测试方法,工作量预估,测试资源,每个节点的测试类型,以及结束测试标准等等(可以针对此面试题来描述)

测试计划需要经过项目组干系人评审通过后才可以进行下一步

第四,根据测试计划设计测试用例

当然,此步会根据个人习惯和经验来适当增减,如先使用思维导图理出测试想法, 然后再扩展。可以按可接受性测试用例、系统测试用例(接口、功能、性能、安全、UI、DB...)来开始设计用例。这样就可以按照所学的N+测试方法来充分设计Case了,而有了测试计划中的相关策略来指导 ,也不会疏漏其他的需求点了。

第五,后续的执行测试步骤(可以依情况来作描述)我们暂且就此面试题展开分析 ,故不作深入探讨 

一、首先测试需求分析要全面。

测试需求分析分两步:

1、测试需求的获取

需求的来源:

显式需求:

(1)原始需求说明书

(2)产品规格书

(3)软件需求文档

(4)有无继承性文档

(5)经验库

(6)通用的协议规范

隐式需求:用户的主观感受,市场的主流观点,专业人士的评价分析
2,需求的分析 ,产生测试需求文档

将不同的需求来源划分成一个个需求点,针对每一点进行测试分析:

(1)界定测试范围

(2)利用各种测试设计的方法产生测试点

在测试方法方面,可做如下注意:

  其一,分析出口入口。从入口分析,将可能出现的环境,条件,操作等内容分类组合,然后根据各位测试达人的方法进行整合,逐一验证。从出口分析,将可能出现的结果进行统计,根据结果的不同追根溯源,再找到不同的操作以及条件等内容,统计成文档,逐一验证。

  其二,多种测试手法的学习和使用。大家可能更多的关心测试方法,但是具体操作的手法也是需要注意的。毕竟测试方法比较容易找到,各位达人都很熟悉。如果将每个人不同的测试手法总结出来并在自己的测试实施中加以使用,可能会收到意想不到的成果。

在测试流程方面,可作如下注意:

  其一,初期要做好需求分析。将需求逐渐细化到小功能点,针对每个功能点进行测试设计。对于完成的测试设计文档,经过项目相关人员的检查评审,做成所需要的初稿。

  其二,在测试过程中,根据需求变更和具体测试执行过程中遇到的问题完善测试设计文档。

  其三,测试执行结束后,对于出现的问题进行总结。其中包含自己本身发现的问题,也可能会有客户提出的问题。将总结出来的结果融合到测试设计当中去,进一步完善测试设计文档。

  对于一次测试,是不可能有覆盖度全面的测试的。需要多次去总结积累,才会使测试越来越全面。

在测试流思维方面,可作如下注意:

  其一,测试全面不等于全面测试。不同阶段对于软件测试有不同的要求,比如在0.8版本以前,对于不重要的画面问题或是细小的功能问题就不需要关心。但是在验收阶段,这些内容可能更需要注意。

  其二,学无止境,只有不断的去学习不断的去思考,才能使自己测试的能力更强,测试对象的全面性也更完整。

二、  当测试需求分析完成,并且形成文档后,要进行测试需求评审,保证需求的准确性以及完整性。

三、  测试需求完成以后,可以根据测试需求设计测试用例。

要保证测试用例能够全面覆盖测试需求,要包含所有的情况。

测试用例设计上划分为单功能测试用例和测试场景设计,单功能测试覆盖的需求中的功能点,测试场景覆盖需求中的业务逻辑。

在设计测试用例的时候,可以使用多种测试用例设计方法。

  ●首先进行等价类划分,包括输入条件和输出条件的等价类划分,合理设置有效等价类和无效等价类,这是减少工作量和提高测试效率最有效的方法。

  ● 必须使用边界值分析,经验表明,这种方法设计出的用例能发现很多程序错误。

  ● 可以使用错误推测法追加一些测试用例,这需要依靠您的智慧和经验。

  ● 对照程序逻辑检查已设计出的测试用例的逻辑覆盖度,如果没有达到覆盖标准应当再补充足够的测试用例。

  ● 如果程序的功能说明中含有输入条件的组合情况,一开始就可选因果图和判定表驱动法。

  ●对于参数配置类的软件,要用正交试验法选择较少的组合方式达到最佳效果。

  ●  对于业务流清晰的系统,可以利用场景法贯穿整个测试方案过程,在案例中综合使用各种测试方法。

当测试用例设计完成后,要组织测试用例的评审,这样可以吸取别人的意见,减少遗漏,补全测试用例。

四、  测试用例编写完成后,就是测试执行,

  ● 测试用例执行100%覆盖。

  ●在测试执行过程中,要继续对测试用例补充完善,确保提高测试覆盖率。

五、  在整个测试过程中,需求都是不可能不变的,所以要及时的更新测试需求、测试用例。

六、  要将测试需求、测试用例以及发现的bug关联起来,便于管理和跟踪,同时也便于查看覆盖率。


 

8.常用的SQL语句

一、简单查询语句

1. 查看表结构

SQL>DESC emp;

2. 查询所有列

SQL>SELECT * FROM emp;

3. 查询指定列

SQL>SELECT empmo, ename, mgr FROM emp;

SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项

4. 查询指定行

SQL>SELECT * FROM emp WHERE job='CLERK';

5. 使用算术表达式

SQL>SELECT ename, sal*13+nvl(comm,0)  FROM emp;

nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm; comm中无值,则nvl(comm,1)=0。

SQL>SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal为别名,可按别名排序)

SQL>SELECT * FROM emp WHERE hiredate>'01-1月-82';

6. 使用like操作符(%,_)

%表示一个或多个字符,_表示一个字符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]不在字符列中的任何单一字符。

SQL>SELECT * FROM emp WHERE ename like 'S__T%';

7. 在where条件中使用In

SQL>SELECT * FROM emp WHERE job IN ('CLERK','ANALYST');

8. 查询字段内容为空/非空的语句

SQL>SELECT * FROM emp WHERE mgr IS/IS NOT NULL;

9. 使用逻辑操作符号

SQL>SELECT * FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%';

10. 将查询结果按字段的值进行排序

SQL>SELECT * FROM emp ORDER BY deptno, sal DESC; (按部门升序,并按薪酬降序)

二、复杂查询

1. 数据分组(max,min,avg,sum,count)

SQL>SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;

SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp));

SQL>SELEC COUNT(*) FROM emp;

2. group by(用于对查询结果的分组统计) 和 having子句(用于限制分组显示结果)

SQL>SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;

SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;

对于数据分组的总结:

a. 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中)

b. 如果select语句中同时包含有group by, having, order by,那么它们的顺序是group by, having, order by。

c. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须出现在group by子句中,否则就是会出错。

使用group by不是使用having的前提条件。

3. 多表查询

SQL>SELECT e.name,e.sal,d.dname FROM emp e, dept d WHERE e.deptno=d.deptno order by d.deptno;

SQL>SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHER e.sal BETWEEN s.losal AND s.hisal;

4. 自连接(指同一张表的连接查询)

SQL>SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;

5. 子查询(嵌入到其他sql语句中的select语句,也叫嵌套查询)

5.1 单行子查询

SQL>SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');查询表中与smith同部门的人员名字。因为返回结果只有一行,所以用“=”连接子查询语句

5.2 多行子查询

SQL>SELECT ename,job,sal,deptno from emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);查询表中与部门号为10的工作相同的员工的姓名、工作、薪水、部门号。因为返回结果有多行,所以用“IN”连接子查询语句。

in与exists的区别: exists() 后面的子查询被称做相关子查询,它是不返回列表的值的。只是返回一个ture或false的结果,其运行方式是先运行主查询一次,再去子查询里查询与其对 应的结果。如果是ture则输出,反之则不输出。再根据主查询中的每一行去子查询里去查询。in()后面的子查询,是返回结果集的,换句话说执行次序和 exists()不一样。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。

5.3 使用ALL

SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的所有员工工资都高的员工的姓名、薪水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高 得多。

5.4 使用ANY

SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的任意一个员工工资高(只要比某一员工工资高即可)的员工的姓名、薪水和部门号。以上两个语句在功能上是 一样的,但执行效率上,函数会高得多。

5.5 多列子查询

SQL>SELECT * FROM emp WHERE (job, deptno)=(SELECT job, deptno FROM emp WHERE ename='SMITH');

5.6 在from子句中使用子查询

 SQL>SELECT emp.deptno,emp.ename,emp.sal,t_avgsal.avgsal FROM emp,(SELECT emp.deptno,avg(emp.sal) avgsal FROM emp GROUP BY emp.deptno) t_avgsal where emp.deptno=t_avgsal.deptno AND emp.sal>t_avgsal.avgsal ORDER BY emp.deptno;

5.7 分页查询

数据库的每行数据都有一个对应的行号,称为rownum.

SQL>SELECT a2.* FROM (SELECT a1.*, ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal) a1 WHERE ROWNUM<=10) a2 WHERE rn>=6;

指定查询列、查询结果排序等,都只需要修改最里层的子查询即可。

5.8 用查询结果创建新表

SQL>CREATE TABLE mytable (id,name,sal,job,deptno) AS SELECT empno,ename,sal,job,deptno FROM emp;

5.9 合并查询(union 并集, intersect 交集, union all 并集+交集, minus差集)

SQL>SELECT ename, sal, job FROM emp WHERE sal>2500 UNION(INTERSECT/UNION ALL/MINUS) SELECT ename, sal, job FROM emp WHERE job='MANAGER';

合并查询的执行效率远高于and,or等逻辑查询。

 5.10 使用子查询插入数据

SQL>CREATE TABLE myEmp(empID number(4), name varchar2(20), sal number(6), job varchar2(10), dept number(2)); 先建一张空表;

SQL>INSERT INTO myEmp(empID, name, sal, job, dept) SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno=10; 再将emp表中部门号为10的数据插入到新表myEmp中,实现数据的批量查询。

5.11 使用了查询更新表中的数据

SQL>UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';

你可能感兴趣的:(测试基础知识,功能测试,面试)