第一章 测试基础和缺陷管理
1、软件测试的定义和目的
定义:使用人工和自动化手段来运行或测试某个系统的过程
目的:检验它是否满足规定的需求或弄清预期结果与实际结果之间的区别
认识过程:证明(60年代)——检测(70年代中期)——预防(90年代)
2、软件测试观念的转变
类型 传统测试 现在测试
介入阶段 开发后期 整个生命周期
范围 基于代码 静态范畴
目的 发现错误 错误预防
3、测试的主要工作
1. 评审SRS
2. 制定计划和方案
3. 编写及评审用例
4. 搭建测试环境,准备数据
5. 执行测试,发现缺陷,提交缺陷报告,回测记录的缺陷
6. 分析测试结果,编写测试报告,度量软件质量
7. ……
4、测试用例
指对一项特定的软件产品测试任务的描述,体现测试方案、方法、技术和策略。
5、软件发展历史
程序设计阶段(50~60年代中期)、程序系统阶段(60年代中期~70年代中期)、软件工程阶段(70年代中期之后)
6、软件危机
主要表现:
1. 缺乏大型软件开发经验和软件开发数据积累,开发工作计划很难制定
2. 开发早期需求分析不明确,后期矛盾集中暴露
3. 不遵循开发规范,开发文档不完整,软件难以维护
4. 缺乏软件质量检查手段
根源:
1. 硬件发展越快,软件系统的期望越高
2. 软件系统的复杂性提高,需多人合作
3. 软件开发无法用已有的产业工程方法来管理
解决方法:A.软件工程 B.研究新的软件设计技术
7、软件生命周期
计划、需求分析、设计、编码、测试、运行和维护
8、软件研发三要素
人员、过程、工具
9、软件项目组人员
分析人员、设计人员、开发人员、测试人员、配置管理人员(CMO)、软件质量保证(SQA)
QA:检验产品的质量,保证产品符合客户的需求;是产品质量检查者
QC:审计过程的质量,保证过程被正确执行;是过程质量审计者
10、基本软件研发流程
瀑布模型 螺旋模型 RUP流程 IPD流程
概述 应用最广泛、缺陷也显而易见 综合了基本的瀑布式模型和演化/渐增原型方法 所有工作流在各个阶段都有体现 从整个产品角度出发,不仅仅针对研发
优点
简单高效
充分考虑风险,抗风险能力强 1.针对大型复杂的系统,进行逐步完善,降低了实施复杂度
2.用户可在早期提出变更并进行修复,从而有效控制变更风险及代价
3.可在早期增强用户的信心 1.将软硬件研发及生产、销售等各个部门有效整合,集中在一个平台下统一管理,提高了决策的准确性及时效性
2.有利于各部门关键数据的共享
缺点 测试介入晚,人员闲置严重,后续工作跟不上 成本高,需专业的风险分析专家参与 1.要有专业的架构师
2.已确定的功能不能变更 1.管理成本高
2.部门之间的协调关系较复杂
适用 不适合需求频繁变更的项目、大项目,适合小规模传统项目 与生命财产相关的系统 大型复杂的项目,耦合度较低的系统,当功能与功能之间联系太紧密就不适用 大型软硬件集成厂商
RUP流程:
IPD流程:集成产品开发流程
11、主要软件研发过程
需求管理、配置管理、缺陷管理、同行评审
12、软件缺陷
定义:是对软件产品预期属性的偏离现象
BUG: 缺陷的一种表现形式
其他相关术语:
错误:编写错误的代码,导致软件包含故障的人的行为,包含逻辑错误和语法错误
缺陷:静态存在于软件工作产品(代码、文档)中的错误
故障:软件运行中出现的状态,可引起意外情况
失效:软件运行时产生的外部异常行为结果,表现与用户需求不一致,功能能力终止,用户无法完成所需要的应用。
13、引入缺陷的原因
1. 开发过程缺乏有效沟通,或没有进行沟通
2. 软件复杂度越来越高
3. 编程中产生错误
4. 需求不断变更
5. 不重视开发文档
6. 软件开发工具本身隐藏的问题
……
14、缺陷
缺陷的分布:需求:56% 设计 27% 代码 7% 其它 10%
导致软件缺陷的最大原因:软件产品说明书
软件缺陷产生的第二大来源:设计方案
缺陷类型:遗漏、错误、额外实现
缺陷管理的目的:
a) 保证信息的一致性
b) 保证缺陷得到有效的跟踪,解决
c) 获取正确的Bug信息,用作缺陷分析和产品度量
缺陷管理支撑工具:QC、
缺陷的相关属性:发现人、发现时间、状态、严重程度、所属版本、修改日期
缺陷的严重程度:致命、严重、一般、提示
缺陷跟踪单的写作准则(5C):准确、清晰、简洁、完整、一致
第二章 软件质量
1、质量
质量定义:实体基于这些特性满足需求的程度
影响质量的因素:流程,技术,组织
软件质量的三个层次: A.符合需求规格
B.符合用户显示需求
C.符合用户实际需求
2、软件质量管理体系(质量常见模式)
ISO9000:适用于各行各业
CMMI:只适用软件
6SIGMA:软件和非软件制造业
6sigma和ISO9000关系:
6sigma提供了一个ISO9000之后企业进一步改善的方向、步骤和系统的方法,它既能够促进企业改革又能保证在企业各个层面上的持续改善。
3、八项质量管理原则
1.以客户为中心
2.领导作用
3.全员参与
4.过程方法
5.管理的系统方法
6.持续改进
7.基于事实的决策方法
8.互利的供方关系
4、八项质量管理原则的意义
1. 是质量管理的理论基础
2. 用于高度概括易于理解的语言所表述的质量管理
3. 为组织建立质量管理体系提供了理论依据
4. 是组织的领导者有效的实施质量管理工作必须遵守的原则
5、CMMI两种表示法
阶段式、连续式
6、CMMI5个等级
KPA:企业需要集中力量改进的软件过程
级别 特点 KPA
初始级(0) 过程能力不可预测、缺乏控制、过程是无序的,管理是反应式、消防式。
可重复级/已管理级(6) 目的:使软件项目的有效管理过程制度化
过程能力有纪律的 需求管理、软件质量保证、软件配置管理
已定义级(7) 软件工程过程、软件管理过程被集成为一个整体,称为组织的标准软件过程,项目建立项目定义软件过程
过程能力标准的和一致的 同行评审
定量管理级(2) 过程能力可预测的 定量的过程管理
优化级(3) 为了预防缺陷出现
过程能力不断改进 缺陷预防
7、CMMI和ISO9000
同 针对性不同(行业) 覆盖范围不同(环境) 关注点不同(客户)
CMMI 管理体系
部分要求相近
关注过程 软件
ISO9000 各行各业
8、6sigma
6sigma概念:6sigma管理法是以质量作为主线,以客户需求为中心,利用对事实和数据的分析,改进提升一个组织的业务流程能力,从而增强企业的竞争力,是一套灵活的,综合性的管理方法体系
6sigma本质:6sigma模式的本质是一个全面管理概念,而不仅仅是质量提高手段
6sigma管理原则:
1. 注重客户
2. 注重流程
3. 全员参与
4. 预防为主
5. 事实依据的决定
6. 持续和突破性改进
6sigma改进区域:
1. 周期时间
2. 输出物的差变
3. 营运效率
6sigma实施方式(DMAIC循环):
定义Define:确定要解决的问题
测量Measure:测量结果
分析Analyze:何时,何地,为何产生缺陷
改进Improve:如何改进过程
控制Control:如何保持过程的改善
强有力的组织结构是成功实现6sigma的最重要的保证。
6sigma误区:1. 自下而上推行6sigma
2. 把引入6sigma理念与方法作为一场运动
3. 6sigma培训就是统计工具的培训
……
9、QA和测试的关系
SQA从流程方面保证软件的质量
测试从技术方面保证软件的质量
只进行SQA活动或者只进行测试活动不一定能够产生好的软件质量
10、QA的主要工作范围
1. 指导并监督项目按照过程实施
2. 对项目进行度量、分析,增加项目的可视性
3. 审核工作产品,评价工作产品和过程质量目标的符合度
4. 进行缺陷分析,缺陷预防活动,发现过程缺陷,提供决策参考,促进过程改进
11、量管理PDCA循环
Plan(计划设计)
Do (实施执行)
Check(检查检测)
Act(纠正措施)
12、软件度量
度量:对事物属性的量化表示
软件度量:是指计算机软件中范围广泛的测度,包括对软件系统、构件或生命周期过程具有的某个给定属性的度的一个定量测量
软件度量的目的:
1. 提高软件生产率,缩短产品研发周期,降低研发成本,维护成本,提高软件产品质量
2. 提高软件产品质量,提高用户满意度
3. 为组织持续改进提供量化的指标和反馈
度量的作用 :
理解,预测(最重要),评估,改进
软件度量的过程:
识别目标、定义过程、收集数据、分析数据、改进过程
软件度量的分类:
四个基本度量项:规模、工作量、进度、质量—缺陷
规模度量:SRS、HLD、LLD文档页数,KLOC(代码量), UT、IT、ST用例数
缺陷度量:SRS、HLD、LLD评审,编码,UT、IT、ST发现缺陷数
其他:缺陷密度、生产率、测试执行效率、用例密度等
13、如何将度量知识应用于实际工作中
建立测试工作的度量数据,目的是作为预测试和改进测试的基础
1. 熟悉需求:进度、工作量、规模
2. 设计用例:工作效率、覆盖率
3. 执行用例:工作效率、缺陷密度
14、质量模型
一组特性及特性之间的关系,它提供规定质量需求和评价质量的基础
外部和内部质量
功能性 可靠性 易用性 效率 维护性 可移植性
适合性
准确性
互操作性
保密安全性
功能性的依从性 成熟性
容错性
易恢复性
可靠性的依从性 易理解性
易学性
易操作性
吸引性
易用性的依从性 时间特性
资源利用性
效率依从性 易分析性
易改变性
稳定性
易测试性
维护性的依从性 适应性
易安装性
共存性
易替换性
可移植性的依从性
第三章 系统测试
1、系统测试
定义:将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行的环境下,对计算机系统进行一系列的组装测试和确认测试。
对象:软硬件集合在一起的系统,集成后的产品
目的:通过与系统的需求定义做比较,发现软件与系统定义不符合或与之矛盾的地方,以验证软件的功能和性能等满足其规约所指定的要求。
2、常见系统分类
纯软件:QQ……………..
软件和硬件:手机,PSP,空调,电梯
软件硬件和维护人员:大型系统
3、系统测试环境
真实环境:直接将整个系统和其交联的物理设备真实的建立链接,进行测试
优点:可以发现某些只能在真实环境下出现的问题
缺点:构建这样一个环境需要高昂的费用
它的测试运行也需要高昂的费用
仿真环境:它能够逼真的模拟被测试软件运行所需的真实物理环境的输入与输出,并且能够组织被测软件的输入,来驱动被测软件运行,同时接收被测软件的输出结果。
优点:仿真环境和真实环境的软件依赖是一样的,并且它能够保证测试的:
可重复性、完整性、可扩展性
4、测试工具
选用测试工具应考虑的因素:
1. 测试工具与被测软件系统的匹配程度
2. 测试工具提供的主要功能和辅助机制
3. 测试工具的服务和技术支持
4. 测试工具的价格
5、测试数据
特点:
1. 数据可以以消息、事物、记录、文件等形式存在
2. 数据来源很多
3. 真实数据最好,但在很多情况下不易或者不能得到
来源:
1. 产品数据
2. 手工构造数据
3. 生成数据(一般由工具设备构造)
4. 捕获数据(少用,与捕获数据源有关,允许手工修改)
5. 随机数据(系统测试少用,它易于获得,不够真实,性能测试常用)
5.1产品数据
1. 最具真实性
2. 不能覆盖所需所有场景
3. 数据敏感,很难保证正确性
4. 随时间变化
5. 可能数据量太大(从而降低测试执行速度)
5.2手工构造数据
1. 费时间、枯燥
2. 如果对系统的功能缺乏了解,数据不真实
3. 有时是获得特定测试用例所需独特数据的唯一手段
5.3生成数据
1. 一般由工具或设备构造
2. 数据取决于工具的完善程度和测试人员的关于如何构造数据的规格说明
5.4捕获数据
1. 与捕获数据源无关
2. 允许手工修改
5.5随机数据
1. 易于获得,不够真实
2. 对强度或负载测试是非常有用的
6、十六种系统测试类型
功能测试(配置测试、恢复性测试、备份测试)
性能测试(压力测试、稳定性测试、容量测试)
GUI测试(可用性测试)
兼容性测试
安全性测试(网络测试)
安装性测试
文档测试
6.1功能测试
概念:根据SRS和 需求列表,验证产品的功能实现是否符合产品的需求规格
目标: 1.是否有不正确或者遗漏了的功能(做错或少做)
2.功能实现是否满足用户需求和系统设计的隐藏需求
3.能否正确的接受输入,能否正确的输出结果
功能测试步骤:
1.对每个明确的功能需求进行标号
2.对每个隐含的功能需求进行标号
3.对可能出现的功能异常进行分类分析并且标号
4.把功能划分为关键功能和非关键功能
5.对每个功能进行测试分析,分析其是否可测,如何测试,可能的输入、输出
6.脚本化和自动化
6.2性能测试
概念:用来测试软件在集成系统中的运行性能
目标: 度量系统各项指标,确认系统有无各种性能瓶颈
特点:混合白盒测试和黑盒测试的方法
性能测试考虑的两个方面:
1.验证系统实现的性能是否与性能需求完全一致
2.检测系统实现的具体性能到底怎样
常用方法:探针,测试驱动
常用工具:Loadrunner,WebLoad,SilkPerformer
6.3GUI测试
概念:针对软件系统界面进行的测试
目标:1.测试界面实现与界面设计的吻合情况
2.确认界面处理的正确性
关注点:界面层与功能接口层上(GUI系统分为三个层次:界面层、界面与功能的接口层、功能层)
常用工具:QTP,QARun
6.4兼容性测试
概念:考虑被测试软件在其他软件(例如OS)或硬件设备下的运行情况
目标:与辅助软件的结合情况
与硬件设计的结合情况
6.5安全性测试
概念:验证集成在系统内的保护机制是否能够在实际中保护系统不受非法的侵入,用来保护数据本身的完整性和保密性
范围:主要从几个方面考虑:系统登录,用户管理,防火墙,系统数据,WEB安全,数据库安全,内部通讯,系统防毒测试
保护测试是安全测试中的一种常见的测试,主要用于测试系统的信息保护机制
6.6安装性测试
概念:验证成功安装系统的能力
目标:找出软件安装的错误,安装手册的错误
常用自动化安装测试软件:
Total Uninstall:它能够监视软件安装的所有过程,记录下它对系统所做的任何改变
FileRiver:可以自动监视和准确记录下多个文件夹中的文件以及子文件的细微变化
6.7文档测试
概念:主要针对SRS,安装手册,配置指南等文档,测试内容主要是编写规范,内容正确性,无歧义性,完整性
目标:验证用户文档是正确的并且保证操作手册的过程能够正确工作
7、系统测试
阶段:
系统测试计划阶段:完成系统测试计划(规划和步骤)
系统测试设计阶段:完成系统测试方案
系统测试实现阶段:完成系统测试用例,系统测试规程,系统测试预测试(冒烟测试)项
系统测试执行阶段:执行系统测试预测试,系统测试用例,开展回归测试,校验已修复的问题,提交系统预测试报告,系统测试报告,缺陷报告
过程:软件需求分析、设计(概要)、系统测试(执行)
阶段 入口准则 输入 出口准则 输出
计划 1.SRS完成
2.成立了需求规格基准 软件开发计划
软件测试计划、SRS 系统测试计划评审并通过 系统测试计划
设计 系统测试计划评审并通过 系统测试计划、SRS 系统测试方案评审并通过 系统测试方案
实现 系统测试方案评审并通过 系统测试计划
系统测试方案、SRS 系统测试用例
系统测试规程
系统测试预测试项评审并通过 系统测试用例
系统测试规程
系统测试预测试项
执行 系统测试用例、系统测试规程、系统测试预测试项评审并通过,集成测试执行结束 系统测试计划
系统测试方案
系统测试用例
系统测试规程
系统测试预测试项 系统测试报告评审并通过 系统预测试报告
系统测试报告
缺陷报告
8、系统测试中的角色及职责
开发代表:解决资源需求,对系统测试结果进行监督
QA:系统测试过程质量保证,参与相关评审,对过程进行审计
配置管理组:对系统测试文档,及测试代码等相关配置进行配置管理
软件开发组:1.系统测试计划阶段,提供软件开发计划SDP,参与系统测试计划的评审
2.系统测试设计和实现阶段,提供SRS,需求分析,测试建议,响应系统测试需求,参与软件系统测试方案的评审
3.系统测试执行阶段,跟踪解决软件测试项目组的缺陷问题报告单,参与系统测试报告的评审
软件测试组:1.系统测试计划阶段,制定系统测试计划并组织评审
2.系统测试设计和实现阶段,制定软件测试方案并组织评审,按照软件系统测试方案,实现测试用例,测试代码和测试工具等设计,编写测试规程
3. .系统测试执行阶段,执行系统测试,反馈并跟踪缺陷问题报告单,完成系统测试报告并组织评审,输出测试案例、总结等经验文档
系统分析组: 1.提出系统测试需求
2.进行测试需求跟踪
3.进行软件系统可测性分析,确定系统测试的对象、范围和方法
9、系统测试计划的要点
1. 明确系统测试的被测对象
2. 完成系统测试的需求跟踪
3. 明确系统的通过或失败标准
4. 系统测试的挂起标准及恢复的必要条件
5. 明确系统测试工作任务分配
6. 系统测试结束后应交付的工作产品
10、区别
系统测试计划:对系统测试全过程的组织,指明范围,方法,资源,以及相应测试活动的时间进度安排表的文档。(做什么)
系统测试方案:设计测试方法的细节文档(描述系统需要测试的特性,测试的方法,测试环境的规划,测试工具的设计和选择,测试用例的设计方法,测试代码的设计方案,怎么做)
系统测试方案需要在系统测试计划的指导下进行,系统测试计划提出做什么,而系统测试方案明确提出“如何做”
11、系统测试步骤
需求分析—计划、方案—用例设计—环境搭建—执行—测试报告
需求分类: 1. 项目需求(用户自己提需求)
2.产品需求(产品人员进行调查撰写)
基线:第一种说法:软件版本相对稳定
第二种说法:文档经过多次评审修改之后封存起来,任何人需求修改都要提出申请。
第四章 测试过程和方法
第一节 测试过程
1、测试阶段划分
需求测试?
单元测试
集成测试
系统测试
验收测试
2、需求测试
定义:通过评审来测试需求(通过不同级别不同类型的评审来避免人员意见)
3、单元测试
定义:针对软件基本组成单元(软件的最小组成单元:函数,语句块等)
目的:检测软件模块对LLD的符合程度
4、集成测试
定义:将所有模块按照HLD的要求组装成子系统或者系统,验证组装后的功能以及模块间接口是否正确的功能
目的:检测软件模块对HLD的符合程度
5、系统测试
定义:将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件,外设,某些支持软件,数据和人员(用户)等其他元素结合在一起,在实际运行环境下,对计算机进行一系列的测试工作
目的:检测软件模块对SRS的符合程度
6、验收测试
定义:通过了内部系统测试及软件配置审查之后,进行验收测试,以用户为主的测试
α测试
定义:用户在开发环境进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试。是可控制环境,开发测试人员可以修改控制的环境
目的:评价软件产品的FLURPS(功能,局域化,可用性,可靠性,性能和技术支持)
β测试
定义:由多个用户在一个或多个用户的实际环境下进行的测试。不可控制环境,开发者不在现场
7、回归测试
(发生在软件测试的任何阶段,只要有缺陷的修复就进行回归测试)
策略:
完全重复测试:重新执行所有在前期测试阶段建立的测试用例,来确认问题修改的正确性和修改的局部影响性
选择性重复测试:(新发现的缺陷用例,和覆盖主要功能的用例)有选择性重新执行部分在前期测试阶段建立的测试用例,来测试被修改的程序
方法:
1. 覆盖修改法
2. 周边影响法
3. 指标达成方法
流程:
1. 在测试策略制度阶段,制定回归测试策略
2. 确定需要回归测试的版本
3. 回归测试版本发布,按照回归测试策略执行回归测试
4. 回归测试通过,关闭缺陷跟踪单
5. 回归测试不通过,缺陷跟踪单返回开发人员,经再次修改,再提交测试人员回归测试
8、单元测试,集成测试,系统测试的比较
测试方法不同
单元测试属于白盒测试
集成测试属于灰盒测试
系统测试属于黑盒测试
考察范围不同
单元测试主要测试单元内部的数据结构,逻辑控制,异常处理 等
集成测试主要测试模块之间的接口和接口数据传递关系,以及模块组合后的整体功能
系统测试主要测试整个系统相对于需求的符合度
评估基准不同
单元测试的评估基准主要是逻辑覆盖率
集成测试的评估基准是接口覆盖率
系统测试的评估基准主要是测试用例对需求规格的覆盖率
9、主要的测试文档
测试计划
测试方案
测试用例
测试规程:指明执行测试时测试活动序列的文档
测试报告
测试日报:每天测试执行情况的记录和总结
10、常见测试过程模型
瀑布模型
H模型:
测试分两类活动:一类是测试准备活动,一类是测试执行活动
V&V模型:
1.实现了测试设计和测试执行相分离
2.揭示了软件测试活动分层和分阶段的本质特性,测试执行的顺序与开发活动相反
验证与确认:
验证:保证软件正确地实现特定功能的一系列活动
Producting Right?
确认:保证所生产的软件可追溯到用户需求的一系列活动
Right Producting?
11、测试与开发的并行性
12、CMM关于过程的要素
角色、入口准则、输入、活动、输出、出口准则、评审和审计等
13、集成测试过程
概要设计——详细设计——执行集成测试
概要设计:
输入:SRS、系统测试计划
输出:集成测试计划、系统测试方案、系统测试用例、预测试项、规程、阶段报告
详细设计:
输入: SRS、系统测试计划、系统测试方案、集成测试计划
输出:单元测试计划、集成测试方案、集成测试用例、集成测试规程、阶段报告
执行集成测试:
输入: 单元测试报告、集成测试计划、集成测试方案、集成测试用例、集成测试 规程
输出:集成测试报告、阶段报告
14、集成测试过程与开发阶段
概要设计(集成测试计划)——详细设计(集成测试设计、实现)——集成测试执行
15、集成测试各阶段的输入、输出
集成测试计划阶段:
输入:软件测试计划、概要设计说明书(HLD)
输出:集成测试计划
集成测试设计阶段:
输入:概要设计说明书(HLD)、集成测试计划
输出:集成测试方案
集成测试实现阶段:
输入:软件测试计划、详细设计说明书
输出:单元测试计划
集成测试执行阶段:
输入:详细设计说明书、单元测试计划
输出:单元测试方案
16、单元测试过程
详细设计——编码——执行单元测试
17、单元测试各阶段的输入、输出
单元测试计划阶段:
输入:软件测试计划、详细设计说明书(LLD)
输出:单元测试计划
单元测试设计阶段:
输入:详细设计说明书(LLD)、单元测试计划
输出:单元测试方案
单元测试实现阶段:
输入:单元测试计划、详细设计说明书、单元测试方案
输出:单元测试用例、单元测试规程
单元测试执行阶段:
输入:单元测试方案、单元测试计划、单元测试用例、单元测试规程
输出:单元测试报告、缺陷报告
18、需求分析阶段的主要任务
需求分析,完成SRS
SRS的评审
进行需求跟踪
系统测试计划
系统测试计划的评审
19、需求阶段的角色和职责
软件测试工程师:
1. 参与SRS评审工作
2. 协助软件测试项目经理完成软件系统测试计划写作
3. 参加系统测试计划的评审
4. 完成本阶段测试需求跟踪
20、概要设计阶段的主要任务
完成HLD
概要设计的评审
系统测试方案、用例的设计
系统测试方案、用例的评审
需求跟踪更新
集成测试计划
集成测试计划评审
21、概要设计阶段的角色和职责
软件测试工程师:
1. 参与HLD评审
2. 参与集成测试计划的评审
3. 进行系统测试方案、用例的设计
4. 参与系统测试方案、用例的评审
5. 完成本阶段测试需求跟踪
22、详细设计阶段的主要任务
进行软件详细设计,完成LLD
详细设计的评审
集成测试的方案、用例的设计
集成测试的方案、用例的评审
需求跟踪更新
单元测试计划
单元测试计划评审
23、详细设计阶段的角色和职责
软件测试工程师:
1. 进行软件详细设计,完成LLD文档
2. 详细设计的评审
3. 集成测试方案、用例的设计
4. 集成测试方案、用例的评审
5. 需求跟踪更新
6. 单元测试计划
7. 单元测试计划评审
24、软件编码阶段的主要任务
软件编码
代码静态质量检查
代码评审
单元测试方案、用例设计
单元测试方案、用例评审
25、软件编码阶段的角色和职责
软件测试工程师:
1. 参与代码评审
2. 进行单元测试方案、用例设计
3. 单元测试方案、用例评审
4. 完成本阶段测试需求跟踪
26、集成测试执行阶段的主要任务
集成测试用例执行
集成测试缺陷记录、修复
集成测试日报写作
集成测试缺陷的回归测试
27、UT/IT/ST执行阶段的角色和职责
软件测试工程师:
1. 搭建测试环境
2. 执行测试用例
3. 发现缺陷后提交缺陷报告
4. 回归测试
5. 每天提交测试日报
6. 测试报告及系统测试预测试报告写作
7. 参与测试报告的评审
8. 参与转系统测试评审
第二节 测试方法
1、什么是白盒测试
依据被测软件分析程序内部构造,并根据内部构造设计用例,来对内部控制流程进行测试,可完全不顾程序的整体功能的实现情况。
白盒测试是基于程序结构的逻辑驱动测试。
2、为什么要进行白盒测试
A. 它一般在测试前期进行,通过达到一定的逻辑覆盖率使软件内部逻辑控制结构上的问题能够基本得到消除
B. 保证内部逻辑结构达到一定的覆盖程度,能够给予软件代码质量更大的保证
C. 白盒测试发现问题后解决问题成本较低
3、白盒测试的常用技术
A. 静态分析技术:控制流分析技术,数据流分析技术,信息流分析技术(不执行代码)
B. 动态分析技术:逻辑覆盖率测试(分支测试,路经测试),程序插装
4、控制流相关概念
程序元素:通常是一个条件,一个简单的语句或一块语句(多个连续语句)
控制流关系:叙述了程序元素和它们执行的次序之间的联系
控制流图:对应于控制流关系的图
控制流矩阵:由控制流图得到,反映相邻程序元素之间的先后顺序关系
5、控制流分析的步骤
确定所有程序元素
根据程序元素之间的相互关系得到控制流图
将控制流图转换成控制流矩阵
通过数据结构的形式把控制流矩阵表示出来
6、控制流分析能发现的问题
转向并不存在的标号
没有用的语句标号
从程序入口进入后无法达到的语句
不能达到停机语句的语句
7、数据流相关概念(主要用于代码优化)
数据定义:如果程序中某一语句执行时能改变某程序变量V的值,则称V是被该语句定义的
数据的引用:如果一语句的执行引用了内存中变量V的值,则说该语句引用变量V
8、数据流分析步骤
根据代码得到数据流表
分析数据流表找到以下两种错误:
1. 变量未定义但被引用
2. 变量定义但未被引用
9、信息流分析
可以导出程序的信息流的关系,为软件开发的确认提供了工具。
通过以下三个关系表给出:
输入变量和语句关系:输入变量直接或间接影响语句的执行
语句和输出变量关系:语句执行直接或间接影响变量的输出
输入和输出变量关系:输入变量直接或间接影响输出变量
10、信息流分析步骤
根据代码得到三个关系表
分析输入变量和语句关系表
分析语句和输出变量关系表
分析输入和输出变量关系表
11、逻辑覆盖测试
根据覆盖的对象不同:
语句覆盖
判定覆盖
条件覆盖
判定—条件覆盖
路径覆盖
,,,,,,
12、程序插装
如插入打印语句
作用:对测试充分性进行度量,往被测程序中插入操作
13、白盒测试的特点
优点: 1.迫使测试人员去自觉地思考软件的实现
2.可以检测代码中的每条分支和路径
3.揭露隐藏在代码中的错误
4.对代码的测试比较彻底
5.实现代码结构上的最优化
缺点:1.昂贵
2.无法检测代码中遗漏的路径和数据敏感性错误
3.不验证规格的正确性
14、什么是黑盒测试
定义:只考虑其整体特性,不考虑其内部具体实现,是基于规格的测试
对象: 系统,子系统,子模块,函数
15、黑盒测试类型和质量模型
来源于质量模型
将软件的特性和质量特性结合起来就得到了测试类型
一个软件特性可以和一个质量特性结合得到一个测试类型
一个软件特性可以和多个不同的质量特性结合得到多个不同的测试类型
16、常见的黑盒测试方法
等价类划分法
边界值分析法
因果图分析法
判定表法
状态迁移法
错误猜测法
………
17、黑盒测试的特点
对于更大的代码单元来说,比白盒测试效率更高
测试人员不需要了解实现细节
测试人员和编码人员彼此独立
从用户和编码人员视角进行测试,很容易被大家理解和接受
有助于暴露任何规格不一致或有歧义的问题
测试用例可以再规格完成之后马上进行
只有一小部分可能的输入被测试到 ,要测试每个可能的输入流几乎是不可能的
没有清晰和简明的规格,测试用例很难设计
沟通不到位会有问题
会有很多程序路径没有被测试到
不能直接针对特定的程序段,这些程序段可能非常复杂
18、灰盒测试
既利用被测对象的整体特性信息,又利用被测对象的内部具体实现信息
如:集成测试和系统测试时借助Log信息
19、静态测试和动态测试
静态测试:不运行被测试软件系统,而采用其他手段和技术进行检测的一种测试技术(例如:代码走读,文档评审,程序分析)
动态测试:按照预先设计的数据和步骤去运行被测系统软件
20、静态分析技术
定义:不通过执行程序而分析程序执行的技术
功能:检查软件的表示和描述是否一致,没有冲突或者没有歧义,它纠正软件系统在描述、表示和规格上的错误,因此是任何进一步测试执行的前提
三种不同的程序测试可能性:
考虑程序是否满足编码规则,语法上是否具有一致性和完整性
考虑文档描述是否规范、准确、便于查询
考虑程序和文档之间的一致性
21、静态分析技术结构
22、手工静态分析—同行评审
根据形式正规的程度分为:
正规检视
技术评审
走杳
对象:计划、需求文档、设计图、代码等
23、自动化静态分析
静态验证:检测规格到程序实现之间转换上的问题
语法分析器:把程序、文档文本分解成独立的语句
符号执行器:在符号短语中分析一个程序在给定路径上做的事情,它模拟程序的执行,适合于相数学算法的分析。
24、动态分析技术
定义:对软件系统运行行为进行分析,包含程序在受控的环境下使用特定的输入进行正式的运行,和期望的结果比较以检查系统运行是正确还是不正确。
25、常用的动态分析技术
路径测试
分支测试
性能测试
……
26、常用动态分析类型及功能
动态分析类型 功能
测试覆盖率分析 测试对代码的检测范围
跟踪 跟踪程序执行期间的所有路径,如变量的值
调整 度量程序执行过程中使用的资源
模拟 模拟系统的一部分,如无法获得的代码或硬件
断言检查 测试在复杂逻辑结构中是否某个条件已经被给出
27、人工测试和自动化测试
人工测试:测试活动由人来完成,狭义上是指测试执行由人工完成
自动化测试:指通过计算机模拟人的测试行为,替代人的测试活动,狭义上是指测试执行由计算机来完成
注:适用于重复多次、机械化的操作、大量的数据执行等。
28、适合自动化的活动
自动化测试执行
自动化测试检查
29、自动化测试的意义
对程序新版本前一版本执行的测试,提高回归测试效率
可以运行更多更频繁的测试,如冒烟测试
可以执行手工测试困难或不可能做的测试,如大量的重复操作或集成测试
更好地利用资源,如测试仪器或被测对象
30、自动化测试的限制
不能取代手工测试,只能提高测试效率,不能提高测试有效性(不能发现更多缺陷)
手工测试比自动化测试发现的缺陷更多
对测试设计依赖性极大,测试设计的不好会遗漏问题
自动化测试对软件开发具有很大的依赖性,开发上出现变更可能导致前面的自动化测试完会失效
工具本身并不具备想象力,工具不具有智能
第五章 需求工程
1、需求的定义
1. 解决用户问题或达到用户目标所需的条件或能力
2. 为遵循合同、标准、规格或其他要求的正式文档,系统必须满足或拥有的条件或能力
3. 按文档化表现1、2中的条件或能力,就是SRS
注:强调做什么而不是怎么做。
2、SRS
定义:对在特定环境下要完成一定功能的软件产品、程序或一组程序的说明
目的:
1. 在客户与开发者之间达成一致
2. 为编制计划和成本计价提供基础
3. 为设计提供了基础
4. 为确认和验证提供一个基础
5. 提高开发效率
6. 便于移植
SRS的特点(5C):正确性、无歧义性、完整性、一致性、可验证性、可追踪性
3、需求
分类:原始需求、产品需求、软件需求、测试需求
属性:优先级、工作量、风险
需求表达应避免的问题:超出规格、过度限制、不确定性、需求描述基于未经确认的假设
项目介绍、产品环境介绍、软件功能、用户特征、假设和依赖关系、
功能需求(简要介绍、输入、处理、输出)、性能需求、用户接口、软件接口、硬件接口、标准符合度、硬件约束、技术限制和本地化
需求分级:
必须的
重要的
最好有的
4、需求管理中各项活动的定义
1. 需求分配
2. 需求评审
3. 需求基线
4. 需求跟踪
5. 变更控制
5、需求开发中各项活动的定义
1. 需求获取
2. 需求分析
3. 需求定义
4. 需求验证
6、需求工程和需求管理的关系
需求工程包含需求管理
需求管理侧重于需求工程中的管理活动
需求管理是CMM二级的第一个KPA
7、需求跟踪矩阵的目的
确保需求被实现
确保需求验证
了解需求变更影响的范围
8、软件需求跟踪输入
工作任务书
SRS、HLD、LLD、代码、UT、IT、ST
已经基线化的需求、设计文档、代码等的变更请求
7、需求阶段需求跟踪——测试人员
需求跟踪责任人:PM(测试)
需求跟踪的步骤:在STP评审之前,由PM组织完成系统测试项录入
需求跟踪方法:在SRS和系统测试项之间建立对应关系
8、概要设计阶段需求跟踪——测试人员
需求跟踪责任人:PM(测试)
需求跟踪的步骤:A.在系统测试方案、系统测试用例评审之前,由PM组织完成系统测试子项、系统测试用例录入
B. 在ITP评审之前,由PM组织完成集成测试项录入
需求跟踪方法:A.在系统测试项和系统测试子项、系统测试子项和系统测试用例之间建立对应关系
B.在概要设计项和集成测试项之前建立对应关系
9、详细设计阶段需求跟踪——测试人员
需求跟踪责任人:PM(测试)
需求跟踪的步骤:A.在集成测试方案、集成测试用例评审之前,由PM组织完成集成测试子项、集成测试用例录入
B.在UTP评审之前,由PM组织完成单元测试项录入
需求跟踪方法:A.在集成测试项和集成测试子项、集成测试子项和集成测试用例之间建立对应关系
B.在详细设计项和单元测试项之前建立对应关系
10、编码阶段的需求跟踪——测试人员
需求跟踪责任人:PM(测试)
需求跟踪的步骤:在单元测试方案、单元测试用例评审之前,由PM组织完成单元测试子项、单元测试用例录入
需求跟踪方法:在单元测试项和单元测试子项、单元测试子项和单元测试用例之间建立对应关系
11、需求变更流程
对已经基线化的SRS的CRs——PM将修改意见、方案、影响范围、工作量估计等提交给CCB——CCB裁决——修改SRS/RTM——评审、签发SRS——更新的SRS/RTM
12、软件需求管理工具
QualityCenter DOORS
13、同行评审的基本概念
是一种通过作者的同行来确认缺陷和需要变更区域的检查方法。需要进行同行评审的特定产品在定义项目软件过程的时候被确定并且作为软件开发计划的一部分被安排了进度(需要前期准备,计划和时间进度表,越早越好)
14、同行评审的作用
1. 早期发现缺陷
2. 去除缺陷
3. 降低成本
4. 提高质量
15、同行评审的类型
15、1 正规检视
概念:是在软件开发过程中进行的、发现、排除软件在开发周期各阶段存在的错误、不足的过程,是一种软件静态测试方法,其生存周期为软件的开发周期,应用于开发过程中产生的(非阶段性)软件文档和程序代码
特点:最正规、最严格的流程,参与者受过专业训练,一般以发现缺陷为目
15、2 技术评审
概念:是由一个正式的组织对产品进行评价,它确认任何与规格和标准不一致的地方或者在检查后给出可替换的建议,或者包含这两者。技术评审的严格程度小于正规检视。技术评审的参与者包括作者、以及产品技术领域内的专家
特点:会成立一个团队,但没有严格的流程,一般以裁决方案的优劣为目的
15、3 走读
目的:评价一个产品,通常是软件代码,最重要的是发现缺陷,遗漏和矛盾的地方;改进产品,设计思想的介绍等
特点:没有规范的流程,形式松散,没有小组也没有会议,通常以代码为主
16、通用评审流程步骤
计划阶段——介绍会议?——准备阶段——评审会议——第三小时会议?——返工阶段——跟踪阶段
第六章 黑盒测试
1.常见黑盒测试用例设计方法
等价类划分法、边界值分析法、因果图法、状态迁移法、判定表法、流程分析法、正交试验法、错误猜测法、输入/输出域测试法、异常分析法、
2.等价类划分法
概念:某个输入域的集合,在这个集合中每个输入条件都是等效的。
原则:
A.规定了取值范围或值的个数,则可确定一个有效等价类和两个无效等价类
B.规定了输入值的集合,或是规定了必须如何的条件,则可确定一个有效等价类和一个无效等价类
C.布尔量,则可确定一个有效等价类和一个无效等价类
D.输入数据的一组值假定N个,并且程序要对每一个输入值分别处理,则可确定N个有效等价类和一个无效等价类
E.输入数据必须遵守什么的情况下,则可确定一个有效等价类和若干个无效等价类
F.已划好了等价类,各元素在程序处理中的方式不同,则应该进一步的划分
步骤:
划分等价类
为有效等价类设计测试用例
为每一个无效等价类至少设计一个测试用例
3.边界值分析法
边界值使用条件:
输入条件明确了一个值的取值范围,或是规定了值的个数
输入条件明确了一个有序集合
边值点定义:上点、离点、内点
原则:
输出条件规定了取值范围或个数,则应该选边界内或边界附近的值
输出条件规定了值的个数,则最大值、最小值、最大值+1、最小值-1、
输出条件是一个有序的集合,则集合的第一个和最后一个
若使用了内部数据,则应选择这个内部数据的边界值
步骤:
分析输入参数的类型(从SRS中)
等价类划分(可选)
确定边界
相关性分析(可选)
形成测试项
4.等价类+边界值
适用范围:输入与输入之间、输出与输出之间各项无牵制关系的情况。
例如:用户注册
适用的测试类型:功能测试、性能测试、GUI测试、配置测试等
5.判定表法
概念:是分析和表达多逻辑条件下执行不同操作的情况的工具。
应用:
基于判定表的测试是最为严格、最具有逻辑性的
针对不同逻辑条件的组合值
组成:条件桩、条件项、动作桩、动作项
步骤:
确定规则的个数
列出所有的条件项桩和动作桩
填入条件项
填入动作项,得到初始决策表
简化决策表,合并相似规则(可选)
将每条规则转化为用例
优点:能把复杂的问题按各种可能的情况一一列举出不,简明而易于理解,可避免遗漏。
缺点:合并存在漏测。
适用范围:
规格说明以判定表的形式给出,或很容易转换成判定表
条件、规则的排列顺序不影响执行结果
每条规则都相对独立
一条规则可以转化成一条或多条用例,规则的用例数取决于转化的条件
6.因果图法
是把规格转化为判定表的系统化方法。它适合检查输入条件的各种组合情况。
步骤: 1.把大的系统规格划分解成可以测试的规格片段(可选)
2.找出哪些是原因,哪些是结果
3.画出因果图
4.将因果图转换为判定表
5.简化判定表(可选)
6.生成测试用例
优点:
1. 等价类中多个输入条件组合起来出错的情况被忽略
2. 设计多个输入条件组合用例
3. 能指出程序规格说明描述中存在什么问题
缺点:
1. 输入条件与输出结果的因果关系,有时难以从SRS中得到
2. 即使得到了因果关系,也会因为因果关系复杂导致用例数目及其庞大
条件与结果:恒等、非、或、与
恒等关系:当输入项发生,会产生对应输出,当输入项不发生,不会产生对应输出
非关系:与恒等关系相反(误区:如果前者不发生,则发生后者,前者发生,不发生后者)
或关系:多个输入条件中,只要有一个发生,则会产生对应输出
与关系:多个输入条件中,只有所有输入项发生时,才会产生对应输出
条件与条件:异、唯一、要求、或
1.异:最多一个输入条件发生
2.或:至少一个输入条件发生
3.唯一:所有输入中有且仅有一个发生
要求:只要其中一个输入发生,其他输入也会发生(误区:为什么充值和充值成功不是这个,因为他们不是同属输入条件,而是由先后条件,没什么关系)
7.流程分析法
这是从白盒测试中路径覆盖分析法中推广到黑盒测试中来的测试分析方法。
步骤:
1.画出业务流程图
2.定义状态节点和条件分支
3.确定测试路径
4.构造测试用例
总结:重点在测试流程,流程测试没有问题并不能说明系统功能就没有问题
8.状态迁移图法
状态机的测试主要关注在测试状态转移的正确性上面。
用这种方法可以设计逆向的测试用例,如状态和事件的非法组合。
概念:状态迁移法实际上是测试了各种状态的转换,这些状态转换的测试在实际工作中是很容易遗漏的,只要将这些状态的转换测试到,是不是采用状态迁移法并不重要,因为状态迁移图只不过是给出一种将多个状态的转换串起来进行测试的思路
步骤:
1.画出状态迁移图
2.列出状态-事件表
3.画出状态转换树(列出每个状态,画出所有从这个状态出发的状态)
4.从状态转换树推导出测试路径
5.根据测试路径编写合法测试用例
6.编写非法测试用例
9.正交试验法
概念:是从大量和试验点中挑出适量的、有代表性的点,应用迦罗瓦理论导出的“正交表”,合理的安排试验的一种科学的试验设计方法
相关概念:指标、因子、因子的状态
步骤:
1. 构造因子状态表
2. 选择正交表(当因子状态数没有时,选择因子+1,去掉多的列)
3. 对号入座
4. 合并
5. 映射
6. 写用例
总结:不考虑实际取值的意义,故删除无效的组合,补充漏掉的常见组合。
10.输入域测试法
只需要在使用完等价类、边界值的基础上再考虑特殊值和长时间输入
11.输出域覆盖法
期望达到输出或等价类覆盖
12.异常分析法
容错能力、故障恢复能力
13.错误猜测法
根据经验猜想。只能作为测试设计的补充,而不能单独用来设计测试用例。
14.用例设计方法总结
方法名称 特点 不足 测试类型 系统类型 备注
等价类,边界值 分类、覆盖 不考虑组合 所有类型 所有系统 需要关注数据背后的信息
判定表因果图 全排列组合、人工化简 比较繁琐 功能测试 控制系统、游戏 用于测试比较复杂的处理过程
正交试验 两两组合、自动选取 不关心组合的实际意义 功能测试、配置测试 所有系统 关键是正交表的选取
状态迁移 测试修改 功能测试 手机、MP3 编辑修改功能也可采用
流程分析 测试流程 功能测试、安装测试 金融系统、物流系统、电子 商务系统 业务流程复杂的系统适用,只检查流程,不保证单功能正确
第七章 系统测试计划和方案
1、系统测试计划的内容
1. 明确组织形式
2. 明确测试对象(外部质量)
3. 完成系统测试的需求跟踪
4. 明确通过与失败标准
5. 明确挂起标准及恢复的必要条件
6. 明确工作任务分配
7. 明确结束后应交付的工作产品
2、系统测试方案要明确的内容
1. 明确系统测试环境搭建要求
2. 明确系统测试策略选取
3. 完成系统测试子项的细分(已经纳入计划)
4. 明确系统测试风险评估与预防措施
3、系统测试环境搭建要求
1. 测试环境的选取
2. 测试数据的准备
3. 测试脚本的开发
4. 测试环境的维护
4、系统测试策略选取
1. 单元测试策略
2. 集成测试策略
3. 系统测试策略
4. 系统测试用例设计方法的选择
5、用例设计方法常规使用技巧
1. 等价类+边界值(强调局部)
2. 因果图+判定表+正交表(强调组合)
3. 状态迁移+流程分析(强调路径)
4. 输入输出域+错误猜测+异常分析(补充)
第八章 环境搭建
1、软件应用类型分类
1. 系统软件
2. 应用软件
3. 工程、科学软件
4. 嵌入式软件
5. 产品线软件
6. Web应用软件
7. 人工智能软件
2、软件结构分类
1. C/S结构
2. B/S结构
3、软件三层架构设计
1. 表现层
2. 业务逻辑层
3. 数据处理层
4、软件运行环境
硬件环境:PC机、服务器
软件环境:
OS:Windows、Linux、Unix
Web服务器:IIS、Apache
应用服务器:Tomcat、Jboss等
数据库服务器:Mysql、sql sercer、oracle、Sybase、DB2
5、虚拟机的工作原理
虚拟机通过模拟完整的硬件系统,使软件运行在一个完全隔离的硬件环境中,形成完整的计算机系统。
6、虚拟机的优点
虚拟机可以安装在服务器上,提供更多的可用系统,最大程度的减少硬件资源的浪费。
第九章 Oracle基本概念
第一部分 数据库绪论
1数据
数据库中存储的基本对象
2数据库定义
指长期存储在计算机内的、有组织的、可共享的大量数据集合。数据库中的数据按一定的数据模型组织、描述和储存、储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
3数据库系统
定义:指在计算机系统中引入数据库后的系统构成
构成:数据库、数据库管理系统、应用系统、数据库管理员和用户
4数据库发展历史
人工管理阶段—40年代中到50年代中,批处理,数据不能永久保存、不能共享
文件系统阶段—50年代末中到60年代中,联机实时处理、批处理,数据共享性、结构化程度不高、不支持表操作
电子表格阶段—电子表格处理软件以来,联机实时处理、批处理,数据共享性、结构化程度不高,没有统一控制
数据库系统阶段—60年代末以来,联机实时处理、批处理、分布处理
5数据库技术与测试
做软件测试为什么要学数据库:
搭建测试环境
通用数据库操作功能的测试(增、删、改、查等)
快速创建测试数据,提高测试工作率
针对数据库对象进行测试(表、试图等)
6数据库模型
在数据库中用数据库模型来抽象、表示和处理现实世界中的数据和信息。即现实世界的模拟。
6.1概念模型
定义:也称信息模型,是按用户的观点来对数据和信息建模
用途:
1. 概念模型用于信息世界的建模
2. 是现实世界对机器世界的一个中间层次
3. 是数据库设计的有力工具
4. 数据库设计的人员和用户之间进行交流的语言
基本要求:
1. 较强的语义表达能力,能够方便,直接地表达应用中的各种语义知识
2. 简单,清晰,易于用户理解
表示方法:
E-R方法(实体-联系方法,实体用矩形,属性用椭圆形,联系本身用菱形表示,连接线上写上联系类型1:1,1:n,n:m)
特点:是最常用的概念模型表示方法
用ER图来描述现实世界的概念模型
ER方法也成为ER模型
6.2数据模型
主要包括网状模型、层次模型、关系模型等,是按计算机系统的观点对数据库建模。
常见的数据模型:
非关系模型:
种类:层次模型、网状模型
数据结构:以基本层次联系为基本单位
关系模型:数据结构:表
面向对象模型:数据结构:对象
组成要素:数据结构、数据操作、数据的约束条件
数据结构:
定义:对象类型的集合
两类对象:a.与数据类型,内容,性质有关的对象
b.与数据之间联系有关的对象
注:数据结构是对系统静态特性的描述
数据操作:对数据库中各种对象的实例允许执行的操作以及有关的操作规则
类型:检索
更新(包括插入,删除,修改)
数据模型对操作的定义:
操作的确切含义
操作符号
操作规则(如优先级)
实现操作的语言
注:数据操作是对系统动态特性的描述
数据的约束条件:一组完整性规则的集合
数据模型对约束条件的定义:
反映和规定本数据模型必须遵守的基本的通用的完整性约束条件(关系模型中任何关系必须满足实体完整性和参照完整性)
提供定义完整性约束的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件
6.3数据库模型满足三方面的要求
能比较真实地模拟现实世界
容易为人所理解
便于在计算机上实现
6.4信息世界中的基本概念
实体、属性、键、域、实体型、实体集、联系
7三类实体型间联系
一对一联系
一对多联系
多对多联系
8客观对象的抽象过程——两步抽象
现实世界中的客观对象抽象为概念模型
把概念模型转换为某一DBMS支持的数据模型
9数据库模式
9.1模式(也称逻辑模式)
定义:数据的逻辑结构/数据之间的联系/数据有关的安全性,完整性要求
特点:
1.数据库中全体数据的逻辑结构和特征的描述
2.所有用户的公共数据视图,综合了所有用户的需求
地位:模式是数据库系统模式结构的中间层(它与数据的物理存储结构,硬件环境,应用程序,开发工具,高级语言都无关)
一个数据库只有一个模式
9.2外模式(也称为子模式或用户模式)
特点:数据库用户使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
用途:保证数据库安全性的一个强有力的措施。每个用户只能看见和访问
保证数据独立性的一个有力措施
9.3内模式(也称为存储模式)
特点: A.是数据物理结构和存储方式的描述
B.是数据在数据库内部的表示方式,记录的存储方式,索引的组织方式,数据是否压缩存储,是否加密,存储记录结构的规定
一个数据库只有一个内模式
第二部分 关系数据模型
1、关系数据模型
最重要的一种数据模型,也是目前主要采用的数据模型
2、关系数据模型基本数据结构
在用户的观点下,关系模型中的数据结构是一张二维表,它是行和列组成(一行表示一个实体,列表示属性)
3、关系数据模型基本概念
关系:一个关系对应通常说的一张表
元组:表中的一行
属性:表中的一列
超键:在关系中能唯一标识元祖的属性集称为关系模式的超键
候选键:不含有多余属性的超键称为候选键
主键:用户选作元祖标识的一个候选码程序主键
外键:
域:属性的取值范围
分量:元组中的一个属性值
4、关系数据模型的操纵
查询、插入、删除、修改
数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合
存取路径对用户隐藏
5、关系模型的优缺点
优点:
1. 建立在严格的数学概念的基础上
2. 概念单一。数据结构简单、清晰,用户易懂易用实体和各类联系都用关系来表示。对数据的检索结果也是关系
3. 关系模型的存取路径对用户透明。具有更高的数据独立性,更好的安全保密性,简化了程序员的工作和数据库开发建立的工作
缺点:
1. 存取路径对用户透明导致查询效率往往不如非关系数据模型
2. 为提高性能,必须对用户的查询请求进行优化
3. 增加了开发数据库管理系统的难度
6、关系数据库简介
1970年由IBM的E.F.Codd提出
7、第一范式
属性不可分
8、第二范式
符合1NF,非主属性完全依赖于码
9、第三范式
符合2NF,消除传递依赖(每个非主属性都不传递依赖于候选码)
10、关系的完整性
关系模型的完整性规则是对关系的某种约束条件条件
分类:实体完整性、参照完整性、用户定义的完整性
11、实体完整性
基本关系的所有主属性都不能取空值,而不仅是主键整体不能取空值
12、参照完整性
关系间的引用:实体与实体之间的联系
外键:F是R中的非码属性,是S中的主键,F是关系R的外键(R为参照关系,S为被参照关系或者目标关系,S和R有可能是相同关系)
参照完整性规则:就是定义外键和主键之间的引用规则
注:实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称为是关系的两个不变性,应该由关系系统自动支持
13、用户定义的完整性
用户定义的完整性是针对某一具体关系数据库的于约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一切功能。
第十章 Oracle基础
一、SQL编写规范
1. 所有语句的表名、字段名全部小写,系统保留字、内置函数、保留字大写
2. 连接符or、in、and,以及=、<=、> =等前后加一个空格
3. 对较为复杂的sql语句的缩进风格:
4. Where子句书写时,每个条件占一行,语句另起一行,以保留字或连接符开始,连接符右齐。
5. 多表连接时,使用表的别名来引用列。
其它注意事项:
1. 大小写不敏感
2. 可写成一行或多行
3. 一个关键字不能跨多行或缩写
4. 子句通常位于独立行,以便编辑及易读
二、SQL语言基础
(二)DDL定义语句:
1、表
创建基表: Create table A (int a);
创建临时表:create t
删除表: drop table A;
修改表结构:alter table A modify (a char) /add (b int) /drop (b int);
1.*表示所有列
SELECT * FROM emp;
–* 会降低查询效率,尽量避免使用
2.选择指定的列
SELECT ename,job,sal,deptno FROM emp;
3.对查询结果进行运算
SELECT ename,job,sal,12*sal FROM emp;
–对日期格式的数据可以做加减运算,表示加上或减去天数
SELECT ename,hiredate,hiredate+365 FROM emp;
–sysdate 表示当前系统时间
SELECT ename,hiredate,(SYSDATE-hiredate)/365,SYSDATE-30 FROM emp;
4.空值
–当空值参与运算时,得到的结果也是空值
SELECT ename,sal,comm,12*(sal+comm) FROM emp;
5.列的别名
/*
select 列名1 别名,列名2 别名 ……
select 列名1 as 别名,列名2 as 别名 ……
如果别名区分大小写或者包含特殊字符,使用双引号定义别名
select 列名1 “别名”,列名2 “别名” ……
*/
SELECT ename xingming,job zhiwei,deptno FROM emp;
–别名通常用来给计算结果加以说明
SELECT ename,sal,comm,12*(sal+comm) nianxin FROM emp;
SELECT ename,sal,comm,12*(sal+comm) “nian xin” FROM emp;
–双引号只出现在列的别名中,在 sql 语句中其他任何地方都不会再出现双引号
6.连接符||
SELECT ename||job FROM emp;
7.字符串
SELECT 50,SYSDATE,’I am the king’ FROM emp;
–字符串必须加单引号
SELECT ‘ename’,job FROM emp;
SELECT ename||’ is a ‘||job FROM emp;
8.重记录
SELECT deptno FROM emp;
–去重 distinct
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT job FROM emp;
–普通列不能和去重列一起查询
–SELECT ename,DISTINCT job FROM emp;
–多列去重
SELECT DISTINCT deptno,job FROM emp;
2、视图
定义:
特点:
视图对于数据库的重构造提供了一定程度上的逻辑度独立性
简化了用户观点
使不同用户能以不同观点看待同一数据
对机密数据提供了自动 的安全保密措施
创建试图:(基于单表)create view A as select a.B from B;
(基于多表)create view A as select a.B,c.D from B,D;
(基于视图)create view B as select A;
删除试图:drop view A;
更新:
视图必须未涉及连接
视图不包含group by 子句
视图不能包含任何组函数
不能使用distinct子句
Where子句不能包含表的嵌套引用
删除:
删除视图,则该视图上的其他视图也被删除
若该视图的基本表删除了,则该视图也自动删除
3、索引
定义:对数据库表中一列或多列的值进行排序的一种数据结构
创建索引:create unique index A on B;
注:ASC :升序(默认) DESC:降序
删除索引:drop index A;
注:必须是索引的拥有者或drop any index权限
4、权限
对象类型:table database
对象:属性列、视图、基本表、数据库
授权:grant connect,resource to JJ;
转授:Grant insert on A to JJ with grant option;
grant insert on A to JINGJIA;
收回权限:revoke insert on A from JJ
(二)DML更新语句:
5、insert
语法:insert into A values(values…);
–insert插入一条记录
/*
INSERT INTO 表名(列1,列2…列n)
VALUES (value1,value2..valueN)
*/
SELECT * FROM dept;
INSERT INTO dept(deptno,dname,loc)
VALUES (50,’DEVLOPMENT’,’Chengdu’);
INSERT INTO dept(deptno,dname)
VALUES (60,’Teaching’);
INSERT INTO dept
VALUES (70,’SURPPORT’,NULL);
–如果不写列名进行插入数据时,value的值必须和表的结构一致
SELECT * FROM emp;
INSERT INTO emp(empno,ename,sal,job,hiredate,deptno)
VALUES (8080,’LIUYANG’,’8000’,’MANAGER’,sysdate,20)
SELECT * FROM emp;
INSERT INTO emp(empno,ename,sal,job,hiredate,deptno)
VALUES (8012,’XIAOMIN’,’8000’,’MANAGER’,TO_DATE(‘2015-11-11’,’YYYY-MM-DD’),20)
6、update
语法:update A set a=2 where b=001;
/*
UPDATE 表名
SET 列名1=value1,列名2=value2,…列名n=valueN
[WHERE 条件1,条件2…条件n]
*/
UPDATE emp
SET deptno = 20
WHERE ename = ‘ALLEN’;
UPDATE emp
SET (job, deptno)=
(SELECT job, deptno
FROM emp
WHERE empno = 7499)
WHERE empno = 7698;
7、delete
语法:delete from A where a=2;
/*
DELETE FROM 表名
WHERE 条件1,条件2……条件N
*/
DELETE FROM emp
WHERE ename = ‘LIUYANG’;
emp;
DELETE FROM emp
WHERE deptno =
( SELECT deptno
FROM dept
WHERE dname =’SALES’);
–练习
–在EMP表中,增加一名员工,员工信息参照现有员工构造.
SELECT * FROM emp;
INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,deptno)
VALUES (7999,’JOBS’,’CHAIRMAN’,NULL,sysdate,6888,40);
–员工SMITH调动到SALES部门,请编写SQL语句更新员工信息.
UPDATE emp
SET deptno = (SELECT deptno FROM dept WHERE dname = ‘SALES’)
WHERE ename = ‘SMITH’;
–员工JAMES已经离职,请编写SQL语句更新数据库.
DELETE FROM emp
WHERE ename = ‘JAMES’;
三、限定和排序数据
限制某一查询所取记录:
1、where子句
Where子句在from子句的后面
字符串和是期要用单引号
字符串大小写敏感,日期值格式敏感
1.where 字句
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 10;
SELECT ename,job,sal,deptno FROM emp
WHERE sal > 2000;
SELECT ename,job,sal,deptno FROM emp
WHERE job = ‘CLERK’;
–字符串加单引号,区分大小写
–where 字句中不能出现列的别名
SELECT ename,job,sal,12*sal nianxin FROM emp
WHERE 12*sal > 30000;
–where 子句中的列可以不出现在 select ,为了结果的可读性最好选择 where 子句中的条件查询
SELECT ename,job,deptno FROM emp
WHERE deptno = 30;
2、比较运算符
1. Between…and…(显示某一值或范围的记录)
2. In(显示匹配列表值的记录)
3. Like(执行通配查询)
可包含:%()可表示零个或多个字符、_(可表示一个字符)
注:’%A_B%’ escape ‘\’
4. Is null
例:select a from A where b is null;
3、逻辑运算符
And 、or、not
注:所有的比较运算的优先级最高,not 、and 、or按顺序依次降低
排序查询结果:
order by 子句
将子句记录排序,在select语句最后,多个列排序时通过order by 列表的顺序来排序
–between 最小值 and 最大值,范围匹配
SELECT ename,job,sal,deptno FROM emp
WHERE sal BETWEEN 1500 AND 3000;
–in() 列表匹配
SELECT ename,job,sal,deptno FROM emp
WHERE job IN (‘CLERK’,’SALESMAN’,’PRESIDENT’);
–like 模糊匹配字符串
–_ 表示任意1个字符
–% 表示任意个任意字符
SELECT * FROM emp
WHERE ename LIKE ‘S%’;
SELECT * FROM emp
WHERE ename LIKE ‘%S’;
SELECT * FROM emp
WHERE ename LIKE ‘%S%’;
SELECT * FROM emp
WHERE ename LIKE ‘_A%’;
–is null 匹配空值
SELECT ename,job,sal,comm FROM emp
WHERE comm IS NULL;
3.逻辑运算符
–and 满足所有条件才会返回结果
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 20
AND sal > 2500;
–or 满足任意一个条件就会返回结果
SELECT ename,job,sal,deptno FROM emp
WHERE deptno = 20
OR sal > 2500;
–not 返回不满足条件的结果
SELECT ename,job,sal,deptno FROM emp
WHERE job NOT IN(‘SALESMAN’,’MANAGER’);
4.运算优先级:数学运算>比较运算符>not>and>or
SELECT * FROM emp
WHERE job IN (‘SALESMAN’,’CLERK’)
OR sal > 2000
AND deptno = 20;
SELECT * FROM emp
WHERE (job IN (‘SALESMAN’,’CLERK’)
OR sal > 2000)
AND deptno = 20;
5.order by子句排序
–order by 子句永远在查询语句的最后
–asc 升序,默认可以不写
–desc 降序
SELECT * FROM emp
ORDER BY sal;
SELECT * FROM emp
WHERE deptno = 30
ORDER BY sal DESC;
–不仅可以对数字排序,也可以对字符和日期排序
SELECT * FROM emp
ORDER BY hiredate;
SELECT * FROM emp
ORDER BY ename DESC;
–可以对多列进行排序
SELECT ename,job,sal,deptno FROM emp
ORDER BY deptno,sal DESC;
–order by 后面的列可以不出现在 select ,为了提高结果的可读性最好选择排序的列
SELECT ename,job,sal FROM emp
ORDER BY deptno;
–可以使用列的别名排序
SELECT ename,job,sal,12*sal nianxin FROM emp
ORDER BY nianxin DESC;
练习
1.查询emp表,显示薪水大于2000,且工作类别是MANAGER的雇员信息
SELECT * FROM emp
WHERE sal > 2000
AND job = ‘MANAGER’;
2.查询emp表,显示年薪大于30000,工作类别不是MANAGER的雇员信息
SELECT ename,job,sal,12*sal nianxin FROM emp
WHERE 12*sal > 30000
AND job <> ‘MANAGER’;
3.查询emp表, 显示薪水在1500到3000之间,工作类别以“M”开头的雇员信息
SELECT * FROM emp
WHERE sal BETWEEN 1500 AND 3000
AND job LIKE ‘M%’;
4.查询emp表,显示佣金为空并且部门号为20或30的雇员信息(佣金=薪水SAL+津贴COMM)
SELECT ename,job,sal,comm,sal+comm yongjin,deptno FROM emp
WHERE sal+comm IS NULL
AND deptno IN (20,30);
5.查询emp表,显示佣金不为空或者部门号为20的雇员信息,要求按照薪水降序排列 (佣金=薪水+津贴)
SELECT ename,sal,comm,sal+comm yongjin,deptno FROM emp
WHERE sal+comm IS NOT NULL
OR deptno = 20
ORDER BY sal DESC;
6.查询emp表,显示年薪大于30000工作类别不是MANAGER,
且部门号不是10或40的雇员信息,要求按照雇员姓名进行排列
SELECT ename,job,sal,12*sal nianxin,deptno FROM emp
WHERE 12*sal > 30000
AND job <> ‘MANAGER’
AND deptno NOT IN (10,40)
ORDER BY ename;
四、单组函数
1、单行函数
用于操作数据项
接受参数并返回一个值
对每一返回行起作用
可使用转换函数修改数据类型
可使用嵌套形式
2、字符函数
大小写转换函数:
Lower(‘x’) 将x转换为小写,并返回所得的字符串
–lower(x) 将字符串 x 转换成小写
SELECT LOWER(‘ABCDEFG’) FROM dual;
SELECT LOWER(ename),LOWER(job) FROM emp;
SELECT * FROM emp
WHERE LOWER(job) = ‘salesman’;
Upper(‘x’) 将x转换为大写,并返回所得的字符串
–upper(x) 将字符串 x 转换成大写
SELECT UPPER(‘abcdefg’) FROM emp;
–dual 是系统默认的一张空表,用来做辅助的查询和运算
SELECT UPPER(‘abcdefg’) FROM dual;
SELECT * FROM emp
WHERE UPPER(job) = UPPER(‘clerk’);
Initcap(‘x’) 将x的每个单词的首字母转换成大写,并返回所得的字符串
–initcap(x) 将字符串 x 首字母转换成大写,其他字母小写
SELECT INITCAP(‘abcdEFG’) FROM dual;
SELECT INITCAP(ename),INITCAP(job) FROM emp;
字符处理函数:
concat 、、instr、trim、
length(“x”) 返回x中字符的个数
–length(x) 返回字符串 x 的长度
SELECT LENGTH(‘abcdefg’) FROM dual;
SELECT ename,LENGTH(ename) FROM emp;
SELECT * FROM emp
WHERE LENGTH(ename) = 5;
nvl(x,value) 若x为空,则返回value,否则返回x
–nvl(x,y) 判断 x 的值,如果 x 不为空则返回 x ,如果 x 为空则返回 y
SELECT ename,sal,comm,12*(sal+NVL(comm,0)) FROM emp;
–x 和 y 必须是相同的数据类型
–SELECT ename,job,NVL(mgr,’BOSS’) FROM emp;
nvl2(x,value1,value2) 若x为空,则返回value2, 否则返回value1
–nvl2(x,y,z) 判断 x 的值,如果 x 不为空则返回 y ,如果 x 为空则返回 z
SELECT ename,sal,comm,12*(sal+NVL2(comm,comm,0)) FROM emp;
SELECT ename,job,mgr,NVL2(mgr,’EMPLOYEE’,’BOSS’) FROM emp;
–y 和 z 数据类型必须一致
replace(x,searchstring,replacestring) 在x 中查找searchstring,,并替换为replacestring
–replace(x,y,z) 在字符串 x 中查找字符串 y 替换为字符串 z
SELECT REPLACE(‘abcdefg’,’cd’,’xyz’) FROM dual;
SELECT ename,REPLACE(ename,’A’,’wwwwwww’) FROM emp;
substr(x,start[,length]) 返回x的一个子字符串,从start开始Length长的字符
–substr(x,m,n) 从字符串 x 的第 m 个字符开始截取,截取长度为 n 的子字符串
SELECT SUBSTR(‘abcdefg’,2,3) FROM dual;
SELECT ename,SUBSTR(ename,2,2) FROM emp;
–n 可以不写,如果不写默认截取后面所有的字符串
SELECT ename,SUBSTR(ename,3) FROM emp;
SELECT ename,SUBSTR(ename,LENGTH(ename)-1) FROM emp;
–如果 m 为负,从右向左数
SELECT ename,SUBSTR(ename,-2) FROM emp;
lpad(x,width[,padstring]) 将x左边补齐空格,得到总长为width个字符的字符串
–lpad(x,n,y) 使用字符串 y 将字符串 x 从左边补齐到长度为 n 的字符串
SELECT LPAD(‘abcdefg’,15,’w’) FROM dual;
SELECT LPAD(ename,10,’name’) FROM emp;
–y 可以不写,如果不写默认用空格补齐
SELECT LPAD(‘abcdefg’,15) FROM dual;
SELECT LPAD(ename,10) FROM emp;
–当 n 小于 x 的长度时,会截取字符串
SELECT LPAD(ename,4) FROM emp;
rpad(x,width[,padstring]) 将x右边补齐空格,得到总长为width个字符的字符串
–rpad(x,n,y) 使用字符串 y 将字符串 x 从右边补齐到长度为 n 的字符串
SELECT RPAD(‘abcdefg’,15,’w’) FROM dual;
SELECT RPAD(ename,10,’name’) FROM emp;
–y 可以不写,如果不写默认用空格补齐
SELECT RPAD(‘abcdefg’,15) rp FROM dual;
SELECT RPAD(ename,10) rp FROM emp;
–当 n 小于 x 的长度时,会截取字符串
SELECT RPAD(ename,4) FROM emp;
ltrm(x,[,trimstring]) 从x左边裁去一些字符,trimstring为裁去的字符
rtrim(x,[,trimstring]) 从x右边裁去一些字符,trimstring为裁去的字符
–ltrim(x,y) 将字符串 x 左边的子字符串 y 去掉
SELECT LTRIM(‘abcbcxbacbacbdefg’,’abc’) FROM dual;
–y 中的字符串没有先后顺序,只要 x 的左边有 y 中的任意字符都会被去掉
SELECT ename,LTRIM(ename,’AD’) FROM emp;
–y 可以不写,如果不写默认去掉空格
SELECT LTRIM(’ abcdefg ‘) FROM dual;
–rtrim(x,y) 将字符串 x 右边的子字符串 y 去掉
SELECT RTRIM(‘abcbcxbacbacbdefgabcbac’,’abc’) FROM dual;
–y 中的字符串没有先后顺序,只要 x 的左边有 y 中的任意字符都会被去掉
SELECT ename,RTRIM(ename,’AD’) FROM emp;
–y 可以不写,如果不写默认去掉空格
SELECT RTRIM(’ abcdefg ‘) FROM dual;
–trim(leading/trailing/both y from x) 将字符串 y 从字符串 x 的左边 / 右边 / 两边 去掉
–leading 左边,trailing 右边
–both 两边,默认可以不写
SELECT ename,TRIM(‘S’ FROM ename) FROM emp;
SELECT ename,RTRIM(LTRIM(ename,’S’),’S’) FROM emp;
–y 只能有1个字符
–y 可以不写,如果不写默认去掉空格
SELECT TRIM(’ abcdefg ‘) tr FROM dual;
–concat(x,y) 将字符串 x 和字符串 y 连接起来,等于||
–concat 只允许 2 个参数
SELECT CONCAT(ename,job) FROM emp;
SELECT CONCAT(CONCAT(ename,’ is a ‘),job) FROM emp;
–instr(x,y,m,n) 返回 字符串 y 从字符串 x 第 m 个位置出现第 n 次的位置
SELECT INSTR(‘abcabcfdfdsfdsbfb’,’d’,3,3) FROM dual;
SELECT ename,INSTR(ename,’A’,1,1) FROM emp;
–n 可以不写,如果不写默认返回第一次出现的位置
SELECT ename,INSTR(ename,’A’,2) FROM emp;
–m 可以不写,如果不想默认从第一个字符开始查找
SELECT ename,INSTR(ename,’A’) FROM emp;
SELECT * FROM emp
WHERE ename LIKE ‘%A%’;
SELECT * FROM emp
WHERE INSTR(ename,’A’) > 0;
3、数字函数
Floorx() 返回小于或等于x的最大整数。FLOOR(-5.2)=-6
–floor(n) 返回小于等于数字 n 的最大整数,向下取整
SELECT FLOOR(123),FLOOR(123.456),FLOOR(-123.456) FROM dual;
Mod(x,y) MOD(8,3)=2
–mod(m,n) 返回 m 除以 n 的余数
SELECT MOD(8,3),MOD(7.5,2.3),MOD(-9,-2) FROM dual;
–n 可以为 0 ,n 为 0 返回 m
Round(x,[,y]) 对x取整:ROUND(5.73)=6 ROUND(5.73,2)=5.73 ROUND(5.73,-1)=10 ROUND(15.73,-1)=16
–round(m,n) 返回 数字 m 精确到小数点后 n 位 的数字
SELECT ROUND(123.456,1),ROUND(123.456,2),ROUND(123.456,0) FROM dual;
–当 n 为负数时,精确到小数点左边 n 位
SELECT ROUND(127.456,-1),ROUND(183.456,-2),ROUND(623.456,-3) FROM dual;
–n 可以不写,如果不写默认精确到个位
SELECT ROUND(123.456) FROM dual;
Trinc(x,[y]) 对x裁断:Trinc(5.73)=5 Trinc(5.73,1)=5.7 Trinc(5.73,-1)=0
–trunc(m,n) 返回 数字 m 截取到小数点后 n 位 的数字
SELECT TRUNC(123.456,1),TRUNC(123.456,2),TRUNC(123.456,0) FROM dual;
–当 n 为负数时,截取到小数点左边 n 位
SELECT TRUNC(127.456,-1),TRUNC(183.456,-2),TRUNC(623.456,-3) FROM dual;
–n 可以不写,如果不写默认截取到个位
SELECT TRUNC(123.456) FROM dual;
4、转换函数
隐式的数据类型转换:
From To
Varchar2 or char Number,date,
Number Varchar2
Date Varchar2
5、日期函数
使用日期:
Oracle以内部数字格式存储是期:世纪、年、月、日、小时、分钟、秒
缺省的日期格式是DD-MON-RR
SYSDATE是返回当前日期和时间的函数
DUAL是用来查看SYSDATE的虚表?
ADD_MONTHS(x,y) 返回x+y个月后的结果
–add_months(x,n) 给日期 x 加上 n 个月
SELECT ADD_MONTHS(SYSDATE,5) FROM dual;
SELECT ename,hiredate,ADD_MONTHS(hiredate,3) FROM emp;
–n 可以为负数,如果为负减去 n 个月
SELECT ADD_MONTHS(SYSDATE,-5) FROM dual;
Last_day(x) 返回包含x的月的最后一天
–last_day(x) 返回 日期 x 所在月份的最后一天
SELECT LAST_DAY(SYSDATE) FROM dual;
SELECT ename,hiredate,LAST_DAY(hiredate) FROM emp;
Next_day(x,day) 返回从x开始,下一个day(文本字符串)的时间值–next_day(x,date) 返回日期 x 之后的下一个星期几
SELECT NEXT_DAY(SYSDATE,’SATURDAY’) FROM dual;
SELECT ename,hiredate,NEXT_DAY(hiredate,’FRIDAY’) FROM emp;
SELECT LAST_DAY(ADD_MONTHS(SYSDATE,7)) FROM dual;
Sysdate() 返回数据库所在的操作系统的当前设置的时间值
6、to_char函数处理日期
语法:to_char(date,’fmt’)
格式规则:
必须用单引号括起来,并且大小写敏感
可包含任何有效的是期格式
有一个fm元素用于填补空格或禁止前面的零
使用逗号分离日期值
基础:
YYYY: 以数字表示全年
YEAR: 拼写出的年
MM: 两位数字月
MONTH:全月名
DY 三个字母缩写的一个星期中的天
DAY:全天名
例子:
Select a to_char(hiredate,’fmDD Month YYYY’) hiredate from A;
–to_char(x,’format’) 将日期 x 转换成格式为 format 的字符串
–YYYY 表示四位年份数字,YEAR 表示年份的拼写
–MM 表示两位月份数字,MONTH 表示月份的拼写
–DD 表示两位日期数字,DAY 表示日期的拼写(星期)
–可以使用分隔符将年月日隔开,可以是,:;-_空格
SELECT SYSDATE,TO_CHAR(SYSDATE,’YYYYMMDD’) FROM dual;
SELECT ename,hiredate,TO_CHAR(hiredate,’YYYY:MM:DD’) FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,’YEAR MONTH DAY’) FROM emp;
–数字和拼写可以混合使用
SELECT ename,hiredate,TO_CHAR(hiredate,’YYYY MONTH DD’) FROM emp;
–年月日的顺序可以自定义
SELECT ename,hiredate,TO_CHAR(hiredate,’MONTHDD-YYYY’) FROM emp;
–可以在格式前面加 fm 去掉多余的 0 或者空格
SELECT ename,hiredate,TO_CHAR(hiredate,’fmMONTH-DD-YYYY’) FROM emp;
–年月日可以不写全
SELECT ename,hiredate,TO_CHAR(hiredate,’YYYY’) FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,’MM’) FROM emp;
SELECT ename,hiredate,TO_CHAR(hiredate,’MM-DD’) FROM emp;
–to_char(m,’format’) 将数字 m 转换成格式为 format 的字符串
–9 代表一位数字
–0 代表一位数字,如果位数不足用 0 补齐
–, 代表分隔符,位置可以自定义
–. 代表小数点,只能出现一次,不能在开头和结尾
– 代表货币,L代表本地货币SELECTename,TOCHAR(sal,′999,999.99′)FROMemp;SELECTename,TOCHAR(sal,′000,000.00′)FROMemp;SELECTename,TOCHAR(sal,′99,99,99.99′)FROMemp;SELECTename,TOCHAR(sal,′ 代 表 货 币 , L 代 表 本 地 货 币 S E L E C T e n a m e , T O C H A R ( s a l , ′ 999 , 999.99 ′ ) F R O M e m p ; S E L E C T e n a m e , T O C H A R ( s a l , ′ 000 , 000.00 ′ ) F R O M e m p ; S E L E C T e n a m e , T O C H A R ( s a l , ′ 99 , 99 , 99.99 ′ ) F R O M e m p ; S E L E C T e n a m e , T O C H A R ( s a l , ′ 999,999.99’) FROM emp;
7、to_char函数处理数字
9 :显示数字
0 :
$ :
L :
. :打印一个小数点
, :
8、to_number函数
将字符转换为数字
9、to_date函数
将字符转换为日期
–to_date(x,’format’) 将字符串 x 转换成日期
SELECT TO_DATE(‘1997-07-01’,’YYYY-MM-DD’) FROM dual;
SELECT TO_DATE(‘19970701’,’YYYYMMDD’) FROM dual;
–年月日的顺序可以自定义
SELECT TO_DATE(‘19970701’,’YYYYDDMM’) FROM dual;
–年月日也可以只定义部分,最终结果是一个完整的日期格式
SELECT TO_DATE(‘1997’,’YYYY’) FROM dual;
–如果只转换年份,会用当前系统所在月份的第一天来补齐日期
SELECT TO_DATE(‘12’,’MM’) FROM dual;
–如果只转换月份,会用当前系统所在年份和当月的第一天来补齐
SELECT TO_DATE(‘12’,’DD’) FROM dual;
–如果只转换日期,会用当前系统所在月份来补齐
SELECT TO_DATE(‘0809’,’MMDD’) FROM dual;
10、NVL函数
将空值转换为实际的值
数据格式可以是日期、字符、数字
数据类型必须匹配
11、NVL2函数
NVL2(expr1, expr2, expr3),若expr1不为空,则返回expr2,反之则返回expr3
12、deocde函数
类似于case或if-then-elsel语句
/*
decode(x,value1,result1,
value2,result2,
…
valueN,resultN,
default)
判断 x 的值,如果 x=value1 ,返回 result1,
如果 x=value2 ,返回 result2 ,
……
如果 x=valueN ,返回 resultN ,
如果 x 不等于以上任何值,返回 default
*/
SELECT ename,job,sal,deptno,
DECODE(deptno,10,sal+200,
20,sal+300,
30,sal+500,
sal+100) addsal
FROM emp;
练习
1.用一个sql语句完成在字符串”hello”左右各添加5个*,使其最终返
回hello(用三种方法实现)
SELECT ‘‘||’hello’||’’ FROM dual;
SELECT CONCAT(‘‘,CONCAT(‘hello’,’‘)) FROM dual;
SELECT RPAD(LPAD(‘hello’,10,’‘),15,’‘) FROM dual;
2.写一条sql语句返回”abcdefg”的后三位字符“efg”,并转换成大写
SELECT UPPER(SUBSTR(‘abcdefg’,5)) FROM dual;
SELECT UPPER(LTRIM(‘abcdefg’,’abcd’)) FROM dual;
3.查询emp表,显示删除掉第一个字符后的员工姓名(如员工ALLEN,显示为LLEN)(2种方法实现)
SELECT ename,SUBSTR(ename,2) FROM emp;
SELECT ename,LTRIM(ename,SUBSTR(ename,1,1)) FROM emp;
4.查询emp表,显示姓名中不包含字符’A’的员工信息
SELECT * FROM emp
WHERE ename NOT LIKE ‘%A%’;
SELECT * FROM emp
WHERE INSTR(ename,’A’) = 0;
5.查询emp表,使用员工姓名的第一个字符将员工姓名从左边补齐到长度为10
SELECT ename,LPAD(ename,10,SUBSTR(ename,1,1)) FROM emp;
6.查询emp表,显示6月份入职的员工信息
SELECT ename,hiredate,TO_CHAR(hiredate,’MM’) FROM emp
WHERE TO_CHAR(hiredate,’MM’) = 6;
7.查询在某个月倒数第三天入职的员工信息
SELECT * FROM emp
WHERE hiredate = LAST_DAY(hiredate)-2;
8.写一条sql语句查询员工编号、员工姓名、工资、部门号,
要求当员工在10号部门时,显示’财务部’,20号部门时显示’研发部’,
30号部门时显示’销售部’,其余部门显示’未知部门’
SELECT empno,ename,sal,deptno,
DECODE(deptno,10,’Finance’,
20,’Research’,
30,’Sales’,
‘Unknown’) deptname
FROM emp;
13、嵌套函数
单组函数可被嵌入到任何层
嵌套函数从最深层到最低层求值
Select max(avg(sal)) from emp group by deptno;
五、从多个表显示数据
1、笛卡尔结果
形成于:
连接条件被省略
连接条件无效
第一个表的所有记录连接到第二个表的所有的记录
为了避免笛卡尔结果我们总是在where子句中使用有效连接
2、连接的类型
等值连接:–外键和主键的等值对应
SELECT emp.ename,emp.job,emp.sal,emp.deptno empdno,dept.deptno deptdno,dept.dname,dept.loc
FROM emp,dept
WHERE emp.deptno = dept.deptno;
–使用别名来区别同名的列
–多表查询时,必须使用表的别名对列名进行限定
SELECT e.ename,e.job,e.sal,e.deptno eno,d.deptno dno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno;
SELECT e.ename,e.job,e.sal,e.deptno eno,d.deptno dno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND e.sal > 2000;
不等连接:SELECT * FROM salgrade;
SELECT e.ename,e.sal,s.grade,s.losal,s.hisal
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
外连接:–查询员工信息和他所在部门的信息,没有员工的部门也显示
SELECT * FROM emp;
SELECT * FROM dept;
–如果在多表查询时,需要显示某张表的所有数据,包括不符合连接条件的数据,使用外连接
–如果要显示某张表的所有数据,把 (+) 放在连接条件的另一侧
SELECT e.,d.
FROM emp e,dept d
WHERE e.deptno(+) = d.deptno;
–显示员工和其经理的名字,没有经理的员工也显示
SELECT w.ename,w.mgr,m.empno,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno(+);
–全外连接
–查询员工信息和他所在部门的信息,没有员工的部门也显示,没有部门的员工也显示
SELECT e.,d.
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno;
自连接:
左连接:左条件=右条件(+)
右连接:左条件(+)=右条件
3、限定列名
使用表名作为前缀在多个表中指定列名
使用表名作为前缀可以改进性能
使用列的别名以区分不同表的同名列
4、使用表的列名
练习
1.查询EMP、DEPT表,输出的列包含员工姓名、工资、部门编号、部门名称、部门地址.
SELECT e.ename,e.sal,e.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno;
2.查询工资等级为3/4/5级的员工姓名,工资,工资等级
SELECT e.ename,e.sal,s.grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND s.grade >= 3;
3.显示10号部门的员工姓名,工资,工资等级,部门名称
SELECT e.ename,e.sal,s.grade,d.dname
FROM emp e,dept d,salgrade s
WHERE e.deptno = d.deptno
AND e.sal BETWEEN s.losal AND s.hisal
AND e.deptno = 10;
4.查询emp表,显示员工姓名及其经理的姓名,没有经理的员工也需要显示
SELECT w.ename,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno(+);
5.列出EMP表中部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
SELECT d.dname,e.*
FROM emp e,dept d
WHERE e.deptno(+) = d.deptno;
六、使用组函数
Select a from A where condition group by group_by_expression having group_condition order by b);
分组函数运算每一组记录,每一组返回一个结果
分组函数省略列中的空值,在分组函数中使用NVL、NVL2等函数强制分组函数包括空值
常用分组函数的类型:AVG:SUM:COUNT:MAX:MIN:
1.分组函数
–avg() 求平均值
SELECT AVG(sal) FROM emp;
–sum() 求和
SELECT SUM(sal) FROM emp;
–count() 计数
SELECT COUNT(empno) FROM emp;
SELECT COUNT(*) FROM emp;
–max() 最大值, min() 最小值
SELECT MAX(sal),MIN(sal) FROM emp;
–对日期和字符串也能计算最大和最小值
SELECT MAX(ename),MIN(ename) FROM emp;
SELECT MAX(hiredate),MIN(hiredate) FROM emp;
–分组函数会忽略空值
SELECT AVG(comm),COUNT(comm) FROM emp;
SELECT SUM(comm)/COUNT(empno),SUM(comm)/COUNT(comm) FROM emp;
–使用 nvl 函数处理空值
SELECT AVG(NVL(comm,0)),COUNT(NVL(comm,0)) FROM emp;
–使用分组函数时可以使用 where 子句对分组计算的范围进行限定
SELECT AVG(sal),COUNT(empno) FROM emp
WHERE deptno = 10;
SELECT AVG(sal),COUNT(empno) FROM emp
WHERE job = ‘SALESMAN’;
SELECT AVG(sal),COUNT(empno) FROM emp
WHERE sal > 1500;
–使用分组函数时,能不能选择普通列?
–SELECT deptno,AVG(sal) FROM emp;
1、group by子句
group by列不在select列表中(如果把分组列放到字段列表中可读性更强)
oracle语法规定:group by后面的列可以不出现在select后面,但出现在select后面的列必须出现在group by子句里
如果select列表中既有普通列又有分组函数,则必须有group by子句
不能使用where子句限定组,可用having子句限定组
–group by 跟列名,当该列的数值想等时看作为一组
–group by 后面的普通列可以出现在 select 后面,让分组函数的结果可读性更高
SELECT deptno,AVG(sal),COUNT(empno) FROM emp
GROUP BY deptno;
–当 select 后面既有普通列又有分组函数时,必须使用 group by 子句
–select 后面既有普通列又有分组函数时,普通列必须出现在 group by 子句
–计算每个职位的人数和工资之和
SELECT job,COUNT(empno),SUM(sal) FROM emp
GROUP BY job;
–多列分组
SELECT deptno,job,MAX(sal),MIN(sal),COUNT(empno) FROM emp
GROUP BY deptno,job
ORDER BY deptno;
–对分组函数的结果进行限定时,不能使用 where 子句,where 子句中不能出现分组函数
/*
SELECT deptno,AVG(sal) FROM emp
WHERE AVG(sal) > 2500
GROUP BY deptno;
*/
2、having子句
Having子句的作用是对行分组进行过滤
记录被分组
使用组函数
匹配Having子句的组被显示
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2500;
–使用组函数时(group by 和 having 子句),select 后面可以没有分组函数
SELECT deptno FROM emp
GROUP BY deptno
HAVING SUM(sal) > 10000;
4.组函数嵌套
SELECT AVG(AVG(sal)) FROM emp
GROUP BY deptno;
练习
1.查询EMP表,输出每个职位的职位名称及平均工资,按平均工资升序排列.
SELECT job,AVG(sal) FROM emp
GROUP BY job
ORDER BY AVG(sal);
2.查询EMP表,输出每个部门的各个职位的平均工资,并按部门编号升序、平均工资降序排序。
SELECT deptno,job,AVG(sal) FROM emp
GROUP BY deptno,job
ORDER BY deptno,AVG(sal) DESC;
3.查询EMP表,要求写一条sql语句统计出如下图所示结果
10号部门人数 20号部门人数 30号部门人数
———— ———— ————
4 4 6
SELECT deptno,COUNT(empno) FROM emp
GROUP BY deptno;
SELECT SUM(DECODE(deptno,10,1,0)) dept10,
SUM(DECODE(deptno,20,1,0)) dept20,
SUM(DECODE(deptno,30,1,0)) dept30
FROM emp;
七、子查询
1、子查询
如:select a from A where b > (select c from A);
子查询在主查询前执行一次
主查询使用子查询的结果
使用子查询的规则:
子查询要用括号起来
将子查询放在比较运算符的右边
子查询中不要加order by 子句
对单行子查询使用单行运算符
对多行子查询使用多行运算符
种类:单行子查询、多行子查询、多列子查询
1.子查询
SELECT sal FROM emp
WHERE ename = ‘JONES’;
SELECT ename FROM emp
WHERE sal > 2975;
–子查询必须使用括号扩起来,子查询的结果作为主查询的条件
SELECT ename FROM emp
WHERE sal >
(SELECT sal FROM emp WHERE ename = ‘JONES’);
–子查询的结果作为主查询的条件时,子查询中不要使用 order by 子句
2、单行子查询
返回一行记录
–子查询返回的结果是一个数据
–查询跟 allen 在同一个部门同一个职位的员工信息
SELECT * FROM emp
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = ‘ALLEN’)
AND job =
(SELECT job FROM emp WHERE ename = ‘ALLEN’)
AND ename <> ‘ALLEN’;
–主查询的条件和子查询返回的数据类型必须一致
–主查询的数据和子查询的数据可以不在同一张表中
–查询 allen 所在部门的名称
SELECT dname FROM dept
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = ‘ALLEN’);
SELECT d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND e.ename = ‘ALLEN’;
–如果查询的数据来自一张表,用到了其他表的数据作为条件,使用子查询
–如果查询的数据来自多张表,只能用多表查询
–子查询可以包含分组函数
–查询所有工资高于平均工资的员工信息
SELECT * FROM emp
WHERE sal >
(SELECT AVG(sal) FROM emp);
–having 子句中也可以使用子查询作为条件
SELECT deptno,AVG(sal) FROM emp
GROUP BY deptno
HAVING AVG(sal) >
(SELECT AVG(sal) FROM emp);
–查询工资最低的员工姓名
SELECT ename FROM emp
WHERE sal =
(SELECT MIN(sal) FROM emp);
使用单行记录比较运算符:=、 >= 、>、<、<=、<>
错误:在单行子查询中使用单行运算符
3、多行子查询
返回多行
使用多行记录比较运算符:in (等于列表中的任何值) any、 all