朋友皆兄弟

发布新日志

  • 软件测试自动化的具体做法

    2008-04-28 13:23:13

    如果对您对性能测试感兴趣,请加我的飞信群。群号:8542195  群名称:软件医院

      因为软件测试的工作量很大(40% 到60% 的总开发时间),而又有很大部分适于自动化,因此,测试的改进会对整个开发工作的质量、成本和周期带来非常显著的效果。
      首先,谈谈在测试自动化的情况下,带有图形界面的产品的测试用例的设计问题。因为图形界面的输出显示不是很容易做到测试结果自动化比较,所以一般的做法是把图形界面输出的部分单独建立测试用例,以手工运行。而所有非图形输出则可进行自动测试。
      下面举出一些测试自动化的例子:
      1.测试个案(test case ,或称为测试用例)的生成
      用编程语言或更方便的剧本语言(scrīpt language 例如Perl等)写出短小的程序来产生大量的测试输入(包括输入数据与操作指令)。或同时也按一定的逻辑规律产生标准输出。输入与输出的文件名字按规定进行配对,以便控制自动化测试及结果核对的程序易于操作。
      这里提到测试个案的命名问题,如果在项目的文档设计中作统一规划的话,软件产品的需求与功能的命名就应该成为后继开发过程的中间产品的命名分类依据。这样,就会为文档管理和配置管理带来很大的方便,使整个产品的开发过程变得更有条理,更符合逻辑。任何新手半途加入到开发工作中也会更容易进入状态。
      2.测试的执行写控制
      单元测试或集成测试可能多用单机运行。但对于系统测试或回归测试,就极有可能需要多台机在网络上同时运行。记住一个这样的原则,在开发过程中的任何时候,如果你需要等候测试的运行结果的话,那就是一个缩短开发时间的机会。
      对于单个的测试运行,挖潜的机会在测试的设置及开始运行和结果的对比及显示。有时候,需要反复修改程序,重新汇编和重新测试。这样,每一个循环的各种手工键入的设置与指令所花费的时间,加起来就非常可观。如果能利用make或类似的软件工具来帮助,就能节省大量的时间。
      对于系统测试或回归测试这类涉及大量测试个案运行的情况,挖潜的的机会除了利用软件工具来实现自动化之外,就是怎样充分利用一切硬件资源。往往,就算是在白天的工作时间内,每台计算机的负荷都没有被充分利用。能够把大量测试个案分配到各台机器上去同时运行,就能节省大量的时间。另外,把大量的系统测试及回归测试安排到夜间及周末运行,更能提高效率。
      如果不购买商品化的工具的话,应当遵从正规的软件开发要求来开发出好的软件测试自动化工具。在实践中,许多企业自行开发的自动化工具都是利用一些现成的软件工具再加上自己写的程序而组成的。这些自己开发的工具完全是为本企业量身定做的,因此可用性非常强。同时,也能根据需要随时进行改进,而不必受制于人。当然,这就要求有一定的人力的投入。
      在设计软件自动测试工具的时候,路径(path)控制是一个非常重要的功能。理想的使用情况是:这个工具可以在任何一个路径位置上运行,可以到任何路径位置去取得测试用例,同时也可以把测试的结果输出放到任何的路径位置上去。这样的设计,可以使不同的测试运行能够使用同一组测试用例而不至于互相干扰,也可以灵活使用硬盘的空间,并且使备份保存工作易于控制。
      同时,软件自动测试工具必须能够有办法方便地选择测试用例库中的全部或部分来运行,也必须能够自由地选择被测试的产品或中间产品采作为测试对象。
      3.测试结果与标准输出的对比
      在设计测试用例的时候,必须考虑到怎样才能够易于对此测试结果和标准输出。输出数据量的多少及数据格式对比较的速度有直接影响。而另一方面,也必须考虑到输出数据与测试用例的测试目标的逻辑对应性及易读性,这将会大大有利于分析测试所发现的不吻合,也有利于测试用例的维护。
      许多时候,要写一些特殊的软件来执行测试结果与标准输出的对比工作,因为可能有部分的输出内容是不能直接对比的(比如,对运行的日期时间的记录,对运行的路径的记录,以及测试对象的版本数据等),就要用程序进行处理。
      4.不吻合的测试结果的分析、分类、记录和通报
      上一点所谈到的,用于对测试结果与标准输出进行对比的特殊软件,往往也同时担任对不吻合的测试结果进行分析、分类、记录和通报的任务。
      “分析”是找出不吻合的地方并指出错误的可能起因。“分类”包括各种统计上的分项,例如,对应的源程序的位置,错误的严重级别(提示、警告、非失效性错误、失效性错误;或别的分类方法),新发现的还是已有记录的错误,等等。“记录”,是按分类存档。“通报”,是主动地对测试的运行者及测试用例的“负责人”通报出错的信息。
      这里提到测试用例的“负责人”的概念。是用以指定一个测试用例运行时发现的缺陷,由哪一个开发人员负责分析(有时是另外的开发人员引进的缺陷而导致的错误)及修复。在设立测试用例库时,各用例均应有指定的负责人。
      最直接的通报方法是由自动测试软件发出电子邮件给测试运行者及测试用例负责人。邮件内容的详细程度可根据需要灵活决定。
      5.总测试状况的统计,报表的产生
      这些都是自动测试工具所应有的功能。目的是提高过程管理的质量,同时节省用于产生统计数据的时间。
      产生出来的统计报表,最好是存放到一个约定的路径位置,以便任何有关人员都知道怎样查阅。同时,可按需要用电子邮件向适当的对象(如项目经理,测试经理和质量保证经理)寄出统计报表。
      6.自动测试与开发中产品每日构建(build )的配合
      自动测试应该是整个开发过程中的一个有机部分。自动测试要依靠配置管理来提供良好的运行的环境,同时它必须要与开发中的软件的构建紧密配合。
      在开发中的产品达到一定程度的时候,就应该开始进行每日构建和测试。这种做法能使软件的开发状态得到频繁的更新,以及及早发现设计和集成的缺陷。
      为了充分利用时间与设备资源,下班之后进行自动的软件构建,紧接着进行自动测试(这里多数指的是系统测试或回归测试),是一个非常行之有效的方法。如果安排得好,到第二天上班时,测试结果就已经在各人的电子邮箱里面面了,等待着新的一天的开发工作。
  • 测试中常见问题分析及对策

    2008-04-28 13:20:10

      我们一般把发现的错误bug(我们也称为缺陷defect)按严重性分为4类:
      死机(系统崩溃或挂起)
      致命(使系统不稳定、或破坏数据、或产生错误结果,而且是常规操作中经常发生或非常规操作中不可避免的)
      严重(系统性能或响应时间变慢、产生错误的中间结果但不影响最终结果,如:显示不正确但输出正确)
      一般(界面拼写错误或用户使用不方便)。
      我们也把发现的错误按优先级分为三种:高、中、低:一般是越影响用户接受或使用该产品的错误优先级越高。
      但下面,将不对所有的问题进行列举和分析,而只是列出一些显而易见的、容易被项目组忽略的错误,这些错误可能是容易修改的、或是容易避免的,但是对于测试组或用户来说可能却是非常头痛和不方便的。
      形象类问题:---不专业、用户不信任
      1、不符合用户操作习惯。如,快捷键定义不科学、不实用(键位分布不合理、按键太多,甚至没有快捷键)。
      2、不够专业,缺乏基本知识,而又没有高手检查。
      3、界面中英文混杂,经常弹出莫名其妙的信息,而且还拼错单词
      4、SETUP界面:CopyRight 1994-1996;缺省认为用户使用某种分辨率;
      5、说明书或帮助的排版格式不专业:中英文搭配不对、标点符号全角半角部分、没有排版准则…
      6、程序名/路径名是程序员的名字、或没有安装程序、或安装程序不完善(丢掉一些必要的模块或文件)
      7、界面元素参差不齐,文字不能完全显示,TAB时鼠标乱走。
      可用性问题:---用户无法使用或不方便使用
      "用户比开发或测试人员在接触界面上要花费更多时间。表面上不重要的方面的影响会变得越来越大,最终甚至会掩盖了产品得有用得方面。"
      下面是一些用户界面错误的例子:
      1、输入无合法性检查和值域检查,允许用户输入错误的数据类型,并导致不可逆料的后果
      2、界面中的信息不能及时更新,不能正确反映数据状态,甚至对用户产生错误的误导。如:数据库中剩余记录个数;参数设置对话框中的预设值
      下面是一些低效的用户界面的例子:
      1、表达不清或过于模糊的信息提示
      2、要求用户输入多余的、本来系统可以自己得到的数据。如:服务是否启动,安装后用户要手动修改某些配置文件。
      3、为了达到某个设置或对话框,用户必须做许多冗余操作。如,对话框嵌套层次太多。
      4、不能记忆用户的设置或操作习惯,用户每次进入都需要重新操作一次初始环境。
      5、使用不完善的功能且不给用户以恰当的提示。
      6、不经用户确认就对系统或数据进行重大修改
      稳定性问题:---影响用户正常工作
      1、不可重现的死机,或不断申请但不完全释放资源,系统性能越来越低
      2、主系统和子系统使用同样的临界资源而互相不知道。如:使用同样的类名或临时文件名、使用同样的数据库字段名或登录帐号。
      3、不能重现的错误,许多与代码中的未初始化变量(在Debug时一般是缺省初始化的)有关,有些与系统不检查异常情况(如内存申请不成功、网络突然中断或长时间没有响应)有关。
      其他问题
      1、文档匮乏:无标准;无新功能使用方法;无版本改动说明。我们不仅要认为没有说明文档的产品不是是一个完整的产品,也要认为没有说明或没有正确说明的功能是一个没有完全实现的功能,因为用户无法用得起来。
      2、运行时不检查内存、数据库或硬盘空间等
      3、无根据地假设用户环境:硬件/网络环境;有些动态库;安装程序换台机器不正确;假设网络随时都是连通的
      4、提供的版本带病毒,或根本无法安装,或没有加密
      5、提供Debug版本给测试组或测试用户,或项目组与测试组使用不同版本
      6、用户现场开发和修改,又没有记录和保留
      7、错误反复出现,改动得不彻底、或版本管理出现混乱
      8、错误越改越多,改动得不彻底、或改动得不小心
      9、版本中部分内容和接口倒退
      10、有些选项永远是灰的;有些选项、菜单项在该灰时还不灰,并且还能状态显示
      11、资源没有和代码分离,不同语言版本间不能平滑转换
      12、缺少第三方产品的评估:广告管理系统2000年问题
      13、产品配合不利,准备当作一套产品或方案推出,互相之间却各不负责,(没有整个项目负责人,是面向组织的而不是面向产品或方案的)。
      期望项目组关注的一些问题
      1、修改Bug的人考虑得不够周全,也可能是没有能力考虑周全---不懂全部程序
      2、问题留给测试组去发现的心态----不仔细测试、不小心修改、甚至不全面改(不彻底)
      3、自己不会用,不了解产品的用法。
      4、更多地从用户使用的角度考虑设计、编码与测试 
  • SQL常用命令概述

    2008-04-20 13:26:42

      1、说明:创建数据库
      CREATE DATABASE database-name
      2、说明:删除数据库
      drop database dbname
      3、说明:备份sql server
      --- 创建 备份数据的 device
      USE master
      EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
      --- 开始 备份
      BACKUP DATABASE pubs TO testBack
      4、说明:创建新表
      create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
      根据已有的表创建新表:
      A:create table tab_new like tab_old (使用旧表创建新表)
      B:create table tab_new as select col1,col2… from tab_old definition only
      5、说明:删除新表
      drop table tabname
      6、说明:增加一个列
      Alter table tabname add column col type
      注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
      7、说明:添加主键: Alter table tabname add primary key(col)
      说明:删除主键: Alter table tabname drop primary key(col)
      8、说明:创建索引:create [unique] index idxname on tabname(col….)
      删除索引:drop index idxname
      注:索引是不可更改的,想更改必须删除重新建。
      9、说明:创建视图:create view viewname as select statement
      删除视图:drop view viewname
      10、说明:几个简单的基本的sql语句
      选择:select * from table1 where 范围
      插入:insert into table1(field1,field2) values(value1,value2)
      删除:delete from table1 where 范围
      更新:update table1 set field1=value1 where 范围
      查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
      排序:select * from table1 order by field1,field2 [desc]
      总数:select count as totalcount from table1
      求和:select sum(field1) as sumvalue from table1
      平均:select avg(field1) as avgvalue from table1
      最大:select max(field1) as maxvalue from table1
      最小:select min(field1) as minvalue from table1
      11、说明:几个高级查询运算词
      A: UNION 运算符
      UNION  运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
      B: EXCEPT 运算符
      EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
      C: INTERSECT 运算符
      INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
      注:使用运算词的几个查询结果行必须是一致的。
      12、说明:使用外连接
      A、left outer join:
      左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
      SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
      B:right outer join:
      右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
      C:full outer join:
      全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

      一、定义基本表
      SQL语言使用CREATE TABLE语句定义基本表,其一般格式如下:
      CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
      [,<列名><数据类型>[列级完整性约束条件]]……
      [,<表级完整性约束条件>]);
      例1 建立一个“学生”表student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
      CREATE TABLE Student
      (Sno CHAR(5) NOT NULL UNIQUE, /*列级完整性约束条件,Sno取值唯一,不许取空值*/
      Sname CHAR(20) UNIQUE,
      Ssex CHAR(1),
      Sage INT,
      Sdept CHAR(15));
      定义表的各个属性时需要指明其数据类型及长度。
      SMALLINT 半字长二进制整数。
      INTEGER或INT 全字长二进制整数。
      DECIMAL(p[,q]) 压缩十进制数,共P位,其中小数后有q
      或DEC(p[,q]) 位。0<=q<=p<=15,q=0时可以省略不写。
      FLOAT 双字长浮点数。
      CHARTER(n)或CHAR(n) 长度为n的定长字符串。
      VARCHAR(n) 最大长度为n的变长字符串。
      GRAPHIC(n) 长度为n的定长图形字符串。
      VARGRAPHIC(n) 最大长度为n的变长图形字符串。
      DATE 日期型,格式为YYYY-MM-DD。
      TIME 时间型,格式为HH.MM.SS。
      TIMESTAMP 日期加时间。
      二、修改基本表
      SQL语言使用ALTER TABLE 语句修改基本表,其一般格式如下:
      ALTER TABLE <表名>
      [ADD<新列名><数据类型>[完整性约束]]
      [DROP<完整性约束名>]
      [MODIFY<列名><数据类型>];
      例2 向Student表增加“入学时间”列,其数据类型为日期型。
      ALTER TABLE Student ADD Scome DATE;
      例3 将年龄的数据类型改为半字长整数。
      ALTER TABLE Student MODIFY Sage SMALLINT;
      三、删除基本表
      当某个基本表不再使用时,可以使用DROP TABLE语句删除它。其一般格式为:
      DROP TABLE <表名>;
      例4 删除Student表。
      DROP TABLE Student;
      一、建立索引
      SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为:
      CREATE[UNIOUE][CLUSTER]INDEX<索引名>
      ON <表名>(<列名>[<次序>][,<列名>[<次序>]]……);
      UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。
      CLUSTER 表示要建立的索引是聚簇索引,所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。
      二、删除索引
      SQL语言中,删除索引使用DROP INDEX语句,其一般格式为:
      DROP INDEX <索引名>
      3.3 查询
      查询的一般格式为:
      SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
      FROM<表名或视图名>[,<表名或视图名>]……
      [WHERE <条件表达式>]
      [GROUP BY<列名1>[HAVING<条件表达式>]]
      [ORDER BY<列名2>[ASC|DESC]];
      3.3.1 单表查询
      一、选择表中若干列
      1.查询指定列
      例7:查询全体学生的学号与姓名。
      SELECT Sno,Sname
      FROM Student;
      2.查询全部列
      例8 查询全体学生的详细记录。
      SELECT *
      FROM Student; 等价于: SELECT Sno,Sname,Ssex,Sage,Sdept
      FROM Student;
      3.查询经过计算的值
      例9 查全体学生的姓名及其出生年份
      SELECT Sname,1996-Sage
      FROM Student;
      3.3 查询
      查询的一般格式为:
      SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
      FROM<表名或视图名>[,<表名或视图名>]……
      [WHERE <条件表达式>]
      [GROUP BY<列名1>[HAVING<条件表达式>]]
      [ORDER BY<列名2>[ASC|DESC]];
      二、选择表中的若干元组
      1.消除取值重复的行
      两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了。
      例 10 查询选修了课程的学生学号。
      SELECT Sno
      FROM SC;
      该查询结果里包含了许多重复的行。如果想去掉结果表中的重复项,必须指定DISTINCT短语:
      SELECT DISTINCT Sno
      FROM SC;
      如果没有指定DISTINCT短语,则缺省为ALL,即保留结果表中的重复的行。
      3.3 查询
      查询的一般格式为:
      SELECT[ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]……
      FROM<表名或视图名>[,<表名或视图名>]……
      [WHERE <条件表达式>]
      [GROUP BY<列名1>[HAVING<条件表达式>]]
      [ORDER BY<列名2>[ASC|DESC]];
      二、选择表中的若干元组
      2.查询满足条件的元组。
      (1)比较大小
      查询满足条件的元组可以通过WHERE子句实现。
      用与进行比较的运算符一般包括:
      =(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于)。
      还包括:!>(不大于),!<(不小于)。
      例11 查询所有年龄在20岁以下的学生姓名及年龄。
      SELECT Sname,Sage
      FROM Student
      WHERE Sage<20;
      或 SELECT Sname,Sage
      FROM Student
      WHERE NOT Sage>=20;
      (2)确定范围
      谓词BETWEEN……AND……和NOT BETWEEN……AND……可以用来查询属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
      例12 查询年龄不在20 ~23岁之间的学生姓名、系别和年龄。
      SELECT Sname,Sdept,Sage
      FROM Student
      WHERE Sage NOT BETWEEN 20 AND 23;
      (3)确定集合
      谓词IN可以用来查找属性值属于指定集合的元组。
      例13 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
      SELECT Sname,Ssex
      FROM Student
      WHERE Sdept IN('IS','MA','CS')
      (4)字符匹配
      谓词LIKE可以进行字符串的匹配。其一般格式如下:
      [NOT]LIKE奇<匹配串>‘[ESCAPE奇<换码字符>']
      .%(百分号) 代表任意长度(长度可以为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。
      ._(下横线) 代表任意单个字符。
      例14 查询学号为95001的学生的详细情况。
      SELECT *
      FROM Student
      WHERE Sno LIKE'95001';
      等价于:SELECT *
      FROM Student
      WHERE Sno ='95001';
      例15 查询名字第二个字为“阳”字的学生的姓名和学号。
      SELECT Sname,Sno
      FROM Student
      WHERE Sname LIKE'_ _阳%';
      如果用户查询的字符串的字符串本身就含有%或_ _,这时就要使用ESCAPE '<换码字符>'短语对通配符进行转义了。
      例16 查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况。
      SELECT *
      FROM Course
      WHERE Cname LIKE 'DB\_%i_ _'ESCAPE'\';
      (5)涉及空值的查询
      例17 查询所有有成绩的学生学号和课程号。
      SELECT Sno,Cno
      FROM SC
      WHERE Grade IS NOT NULL;
      (6)多重条件查询
      逻辑运算符AND和OR可用来联结多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。
      例18 查询计算机系年龄在20岁以下的学生姓名。
      SELECT Sname
      FROM Student
      WHERE Sdept='cs'AND Sage<20;
      四、使用集函数
      SQL提供的集函数主要有:
      COUNT([DISTINCT|ALL]*) 统计元组个数
      COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数(空值不计)
      SUM ([DISTINCT|ALL]<列名>) 计算一列值的总和(此列必须是数值型)
      AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值(此列必须是数值型)
      MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值
      MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值
      五、对查询结果分组
      GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。如果
      分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的
      组,则可以使用HAVING短语指定筛选条件。
      连接查询
      若一个查询同时涉及两个以上的表,则称之为连接查询。
      一、等值与非等值连接
      当连接运算符为=时,称为等值连接。
      若在等值连接中把目标列中重复的属性列去掉则为自然连接。
      例:查询每个学生及其选修课程的情况
      SELECT Student.*,SC.*
      FROM Student,SC
      WHERE Student.Sno=SC.Sno;
      二、外连接
      例:SELECT Student.Sno,SNAME,Cno,Grade
      FROM Student LEFT JOIN SC
      WHERE Student.Sno=SC.Sno;
      三、复合条件连接
      WHERE子句中可以有多个连接条件,称为复合条件连接。
      例:查询选修2号课程且成绩在90分以上的所有学生
      SELECT Student.Sno,SNAME
      FROM Student,SC
      WHERE Student.Sno=SC.Sno AND SC.Cno=奇2奇 AND SC.Grade>90;
      3.4 数 据 更 新
      SQL中数据更新包括插入数据、修改数据和删除数据三条语句。  
      3.4.1 插入数据
      SQL的数据插入语句INSERT通常有两种形式。
      一、插入单个元组
      插入单个元组的INSERT语句的格式为:
      INSERT
      INTO<表名>[<属性列1>[,<属性列2>...)]
      VALUES(<常量1>[,<常量2>]...)
      例1 插入一条选课记录('95020','1')
      INSERT
      INTO SC(Sno,Cno)
      VALUES('95020','1')
      新插入的记录在Grade列上取空值。
      二、插入子查询结果
      插入子查询结果的INSERT语句的格式为:
      INSERT
      INTO<表名>[<属性列1>[,<属性列2>...)]
      子查询;
      例3 对每一个系,求学生的平均年龄,并把结果存入数据库。
      CREATE TABLE Deptage
      (Sdept CHAR(15)
      Avgage SMALLNT);
      然后对表按系分组求平均年龄,再把系名和平均年龄存入新表中。
      INTERT
      INTO Deptage(Sedpt,Avgage)
      SELECT Sdept,AVG(Sage)
      FROM Student
      GROUP BY Sdept;
      修改数据
      修改操作语句的一般格式为:
      UPDATE <表名>
      SET<列名>=<表达式>[,<列名>=<表达式>]...
      [WHERE<条件>];
      一、 修改某一个元组的值
      例4 将学生95001的年龄改为22岁。
      UPDATE Student
      SET Sage=22;
      WHERE Sno='95001';
      二、修改多个元组的值
      例5 将所有学生的年龄增加1岁。
      UPDATE Student
      SET Sage=Sage+1;
      三、带子查询的修改语句
      子查询也可以嵌套在UPDATE语句中。
      例6 将计算机科学系全体学生的成绩置零。
      UPDATE SC
      SET Grade=0
      WHERE 'CS'=
      (SELECT Sdept
      FROM Student
      GROUP Student.Sno=SC.Sno);
      删除数据
      删除语句的一般格式为:
      DELETE
      FROM<表名>
      [WHERE<条件>];
      一、删除某一个元组的值
      例7 删除学号为95019的学生记录。
      DELETE
      FROM Student
      WHERE Sno='95019';
      二、删除多个元组的值
      例8 删除所有的学生的选课记录
      DELETE
      FROM SC;
      三、带子查询的删除语句
      例9 删除计算机科学所有学生的选课记录。
      DELETE
      FROM SC
      WHERE 'CS'=
      (SELECT Sdept
      FROM Student
      GROUP Student.Sno=SC.Sno);
      建立视图
      SQL语言用CREATE VIEW命令建立视图,其一般格式为:
      CREATE VIEW[<列名>[,<列名>]...)]
      AS <子查询>
      [WITH CHECK OPTION];
      子查询不允许含有ORDER BY 子句和DISTINCT短语。
      例1 建立信息系学生的视图。
      CREATE VIEW IS_Student
      AS
      SELECT Sno,Sname,Sage
      FROM Student
      WHERE Sdept='IS';
      本例中省略了视图IS_Student的列名,隐含了由子查询中SELECT子句中的三个列名组成。
      二、删除视图
      该语句的格式为:
      DROP VIEW <视图名>;
      例8 删除视图IS_S1
      DROP VIEW IS_S1;
      执行此语句后, IS_S1视图的定义将从数据字典中删除。
      视图的作用
      视图最终是定义再基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而
      且对于非行列子集视图进行查询和更新时还有可能出现问题。既然如此,为什么还要定义视图
      呢?这是因为合理使用视图能够带来许多好处。
      1.视图能够简化用户的操作
      2.视图使用户能以多种角度看待同一数据
      3.视图对重构数据库提供了一定程度的逻辑独立性
      4.视图能够对机密数据提供安全保护
Open Toolbar