数据库习题及解答.doc 21页

  • 365.00 KB
  • 2022-04-22 11:51:39 发布

数据库习题及解答.doc

  • 21页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'习题1及其解答1.试述程序与数据的关系解:在计算机中有二种信息存在形式,一是程序,一是数据。程序是指挥计算机运行的,而数据是程序运行过程中被加工的对象。2阐述数据的概念,并说出你所知道的几类基本的数据类型解:用来描述客观事物特征的可识别的符号,都称为数据。数据包括数值型数据,字符型数据,图形、图像、声音等类型的数据。3解释数据库、数据元组解:解:数据库是按照一定的数据模型组织的,长期储存在计算机内,可为多个用户共享的数据的聚集。数据库中基表里的一行数据称为一个元组,它是对一个个体或一个行为的描述。如(99001,李兵,20,电子系)是对个体“李兵”的描述。4数据库管理系统解:DBMS是位于用户与操作系统(OS)之间的一层数据管理软件,如SQLServer2000。5试述数据库系统的构成数据库系统由计算机、数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员和用户构成。6数据库的用户分为哪些三类解:使用数据库的人称为数据用户,用户可分为三类:第一类用户,终端用户(EndUser);第二类用户,应用程序员(ApplicationProgrammer);第三类用户,数据库管理员(DatabaseAdministrator,简称DBA)。7数据处理与数据管理解:数据处理是指从某些已知的数据出发,推导加工得出一些新的数据。数据管理是指如何对数据进行分类.组织.储存及维护。8数据管理技术的发展经历了哪一个阶段?解:数据管理是指计算机在处理数据时,以什么样的方式来保障计算机所需的数据。随着计算机硬件、软件发展,数据管理技术经历了人工管理阶段、文件系统管理阶段、数据库系统阶段。9数据管理技术发展中各阶段的特点是什么?解:人工管理阶段,应用程序与数据是混为一体的,数据不独立。文件管理阶段,数据与应用程序分离,但不同的应用程序对数据的共享性差。数据库管理阶段,数据与应用程序分离,数据共享性好。10试述原型与模型的概念解:人们要研究的客观事物称为原型,对原型(客观事物)的本质特征的一种简化表示,称为原型的模型。11为什么会有一同类型的模型,模型分为哪些几类?解:对现实世界中客观事物本质特性的表示有不同的方法,从而形成不同的模型。这些不同的模型的:物理模型、图表模型、数学模型、数据模型等。12何为实体?实体之间的关联有几种形式:解:实体:实体是现实世界中具有某些共同特征的同类事物的集合。如工厂,公司,医院,学校,学生,教师等。实体之间的关联有1--1关联,1--n关联,n--m关联。13何为关系,关系具有哪些特征?解:关系就是一个二维数据表,由行和列组成。每个这样的表格称为一个关系。关系具有以下特征:20 (1)关系中不能有任意两条完全相同的记录(2)关系中的记录是无序的(3)关系中记录的字段是无序的(4)字段名称不能相同(5)字段不可再分14写出关系模型的一般格式,并写出一个具体的关系实例解:关系模型的一般格式关系名(属性1,属性2,...,属性n)如:供应商(供应商ID,公司名称,联系人姓名,联系人职务,地址,城市)第2章习题及其解答1试述关系代数的定义对关系进行运算的数学理论称为关系代数。2关系的集合运算有哪4种以代数表达式写出它们的定义。这4种运算在SQL言语中对应的关键字分别是什么?解:关系的集合运算有哪4种,它们是(1)并运算(Union)代数表达式:(应具相同的数据模型)(2)差运算(Execept)代数表达式:(应具相同的数据模型)(3)交运算(Intersection)代数表达式:(应具相同的数据模型)(4)笛卡尔积运算(CartesianProduct)代数表达式:前3种运算在SQL言语中对应的关键字分别是Union、Execept、Intersect3查询计算机系的学生及年龄不大于19岁的学生Select学号,所属系,出生日期From学生基本情况表Where所属系="D03001"unionSelect学号,所属系,出生日期From学生基本情况表Where(2011-datepart(yy,出生日期))<=194,求计算机系的学生中年龄不大于岁19的学生Select学号,所属系,出生日期From学生基本情况表Where所属系="D03001"exceptSelect学号,所属系,出生日期From学生基本情况表Where(2011-datepart(yy,出生日期))<=195查询计算机系的且年龄不大于19岁的学生Select学号,所属系,出生日期From学生基本情况表Where所属系="D03001"intersectSelect学号,所属系,出生日期From学生基本情况表Where(2011-datepart(yy,出生日期))<=196求学生学生选课表关系与课程表关系的笛卡尔积解:已知课程表关系与学生选课表关系如下课程表课程号课程名学分学时数C090807001C语言4120C090807002高等数学3100C090807006数据结构4100学生选课表学号课程号成绩S0807001C09080700654S0807002C09080700276S0807003C09080700134求笛卡尔积课程表学生选课表的代码如下:select课程表.*,学生选课表.*from课程表,20 学生选课表执行结果如下:课程表学生选课表课程号课程名学分学时数学号课程号成绩C090807001C语言4120S0807001C09080700654C090807002高等数学3100S0807001C09080700654C090807006数据结构4100S0807001C09080700654C090807001C语言4120S0807002C09080700276C090807002高等数学3100S0807002C09080700276C090807006数据结构4100S0807002C09080700276C090807001C语言4120S0807003C09080700134C090807002高等数学3100S0807003C09080700134C090807006数据结构4100S0807003C090807001347写出如下操作的代数表达式及SQL语句代码(1)在”学生选课表”中查询课程号="C090807001"的所有记录.。解:其代数表达式是其代码为:-SELECT*-FROM学生选课where课程号="C090807001"(2)在学生基本情况表中查询计算机系(所属系="D03001’)所有学生的基本情况解:其代数表达式是其代码为:SELECT*FROM学生选课where所属系="D03001’(3)在学生基本情况表中查询学生学号、姓名与所在系解:其代数表达式是其代码为:Select学号,姓名,所属系from学生基本情况表(3))在”学生选课表”中查询学生的学号和成绩解:其代数表达式是其代码为:Select学号,成绩from学生选课表(4)在学生基本情况表中查询计算机系(所属系="D03001’)学生的学号、姓名、性别。解:其代数表达式是其代码为:SELECT学号、姓名、性别FROM学生基本情况表where所属系="D03001’(5)对学生基本情况表与学生选课表中的记录关于“学号相等”这一条件进行等值连接。解:代数表达式是:代码是:Select学生基本情况表.*,学生选课表.*20 From学生基本情况表,学生选课表where学生基本情况表.学号=学生选课表.学号(6)对学生基本情况表与学生选课表中的记录件进行自然连接。解:代数表达式是:代码:Select学生基本情况表.*,课程号,成绩From学生基本情况表,学生选课表where学生基本情况表.学号=学生选课表.学号 (7)统计学生选课表中学生人数、最高分、最低分、平均分、总分。解:select学生数=count(学号),最高分=max(成绩),最低分=min(成绩),平均分=avg(成绩),总分=sum(成绩)from学生选课表第3章习题答题1试述等值连接与自然连接的概念解:将二个关系中满足等值要求的元组直接连接起来构成查询结果,这样的连接运算称为等值连接运算。在等值连接运算中如果去掉重复的列,这样的连接运算称为自然连接。2请写出等值连接的算法等值连接的算法(以基表“学生基本情况表”、“学生选课表”的等值连接为例)是:Fori=1ton取基表学生基本情况表中第i个元组R(i)Forj=1tom取基表学生选课表中第J个元组SC(j)IfR(i).学号=SC(j).学号连接R(i),SC(J),并将R(i)SC(j)置于结果集NextjNesti3何为自身连接解:对于基表R,对其取二个别名:first、second。对别名表first、second。进行连接的运算称为对基表R的自身连接。4自然连接所得关系中是否有相同的列?5设学生选课表如下试用自身连接写出查义各课程的间接先修课程学生选课表课程号课程名学分学时数前修课程C090807001C语言4120计算机基础C090807002高等数学3100C090807003高等代数4100C090807004计算机基础3120C090807005C++480C语言C090807006数据结构4100C语言C090807007概率与统计4110高等数学C090807008网络基础260C语言C090807009体育240C090807010三个代表理论350C090807011微分方程460高等数学select课名=second.课程名,间接先修课程=first.先修课程from学生选课表first,学生选课表secondwherefirst.课程名=second.先修课程6何为内连接、与外连接?内连接的结果集中,内表的信息有丢失吗?对于二张基表A,B,定义A表为内表,B表为外表。对内表A与外表B进行连接运算时,内表A中满足连接条件的元组被连接后置于结果集。内表A中不满足连接条件的元组与外表各字段的空值元组连接后也放到结果集,这样的连接称为内连接。内连接是内表没有丢失信息的连接。外表B中满足连接条件的元组被连接后置于结果集。外表B中不满足连接条件的元组与内表的空值元组连接后也放到结果集,这样的连接称为外连接。外连接是外表没有丢失信息的连接。20 内连接的一般格式是是什么?select外表.列名,内表.列名from外表innerjoin内表on连接条件。外连接的一般格式是select外表.列名,内表.列名from外表leftouterjoin内表on连接条件7请述嵌套查询的概念一个结构select_from_where,称为一个查询块。如果在一个查询块的where子句中嵌入一个查询块,这样的查询称为嵌套查询。如select姓名from学生基本情况表where学号in(select学号from学生选课表where课程号=’coo1’”)8内查询中是否还允许有嵌套查询?9以in作用的内查询子句的查询结果是单值元素集合,还是元组集合?10对单一嵌套查询与循环嵌套查询各举一例,写出其代码。11any()等价于max()?any()等价于min()?all()等价于min()?any()等价于max()?some与any是二个等价的关键字吗?六、1写在基表A中插入一个数据元组的一般格式解:insertInto表名[(列名1,列名2,…………,列名n)]Values("常量1","常量2",…………,"常量n")2将新的元组("S0807114","刘东东","男","1993-01-12","洪湖","D03004")插入学生基本情况表(学号,姓名,性别,出生日期,家庭地址,所属系)解:insertInto学生基本情况表(学号,姓名,性别,出生日期,家庭地址,所属系)Values("S0807114","刘东东","男","1993-01-12","洪湖","D03004")3将数据("S0807116","刘东目","男","刘东目","1993-02-12","D03004","荆门")插入学生基本情况表(学号,姓名,性别,出生日期,家庭地址,所属系)解:insertInto学生基本情况表Values("S0807116","刘东目","男","1993-02-12","D03004","荆门")4,插入一条记录到选项课表("S0807110",C090807005)解:insertInto学生选课表Values("S0807110",C090807005)七、1写出插入查询结果到基表的一般格式解:insertInto表名[(列名1,列名2,…………,列名n)]Select语句2,先建一个学生数量表st_number(sdpt,number),从学生基本情况表中查询数据(sdpt,number)插入到st_number中20 解:createtablest_number(dptchar(6),numbersmallint);insertIntost_numberselect所属系,count(*)from学生基本情况表groupby所属系3先建一个表student1(Sno,Sname,Ssex,Sdpt,Sage),从学生基本情况表(学号,姓名,性别,出生日期,家庭地址,所属系)中查询数据插入到student1中CREATETABLEstudent1(SnoCHAR(8)PRIMARYKEY,SnameVARCHAR(16)NOTNULL,SsexCHAR(2)check(性别="男"or性别="女"),Sagetinyint,Sdptchar(6)DEFAULT"D03001",);insertIntostudentselect学号,姓名,性别,2011-datepart(yy,出生日期),所属系from学生基本情况表4,先创建一个表select_course12(Sno,Cno,Grede),再利用查询语句将学生选课表中的所有值插入到表select_course12中CREATETABLEselect_course12(SnoCHAR(8)NOTNULLREFERENCES学生基本情况表(学号),CnoCHAR(10)NOTNULLREFERENCES课程表(课程号),GradetinyintCHECK(Grade>=0ANDGrade<=100),primarykey(Sno,Cno))insertIntoselect_course12Select学号,课程号,成绩from学生选课表八1写出修改数据的一般语句格式为解:update基表名set列名1=表达式1,列名2=表达式2,……列名k=表达式kwhere条件语句2、将学号为"S0807001"学生的家庭地址修改成“北京“解:update学生基本情况表set家庭地址="北京"where学号="S0807001"3,将学号为"S0807002"学生的家庭地址修改成’天津’,所属系修改成’D03005’“update学生基本情况表set家庭地址="北京",所属系=’D03005’where学号="S0807001"4,在选课表中将计算机系‘D03001’学生成绩都置为0解:update学生选课表set成绩=0where"D03001"=(select所属系from学生基本情况表where学生基本情况表.学号=学生选课表.学号)5,在student1表中,将年龄都加大一岁。解:UPDATEstudent1setSage=Sage+120 九1写出删除数据的一般语句格式解:DeleteFrom基表名[where条件语句]2删除学号为"S0807002"的学生记录解:Deletefrom学生选课表where学号="S0807002"3删除计算机系所有学生的选课记录解:Deletefrom学生选课表where"D03001"=(select所属系from学生基本情况表where学生基本情况表.学号=学生选课表.学号)十1写出视图定义的一般格式解:Createview视图名AsSelectSQL语句"2建立计算机系学生基本情况的视图cp_student解:Createviewcp_studentAsSelect*from学生基本情况表Where所属系="D03001"2建立计算机系选了’C090807001’课学生的视图解:createview计算机系选课学生(学号,姓名,成绩)AsSelect学生基本情况表.学号,姓名,成绩from学生基本情况表,学生选课表Where所属系="D03001"and课程号=’C090807001’and学生基本情况表.学号=学生选课表.学号3建立计算机系学生平均成绩的视图:解:createviewcp_student_avg_grade(学号,平均成绩)AsSelect学号,AVG(成绩)from学生选课表groupby学号视图可以建立在基表之上,也可以建立在视图之上吗?4写出删除视图的一般格式解:Dropview视图名A写出删除“计算机系学生基本情况视图”的代码Dropview计算机系学生基本情况视图6删除计算机系学生视图中的学号为’S0807001’记录DeleteFromCP_StudentWhereSno=’S0807001’7通过操作计算机系学生视图可以修改药物学院学生的数据吗?解:不能。十一应用题1使用关键字组betweenand写出一查询块代码。1写出一Where子名,其中使用关键字in3使用关键字in写出与下述语句等价的语句.select*from学生基本情况表Where学号=‘s2010001’4使用关键字notin写出与下述语句等价的语句.select*from学生基本情况表Where学号!=‘s2010001’5使用关键字like查询所有姓刘的学生6用关键字like和字符匹配符%,写出查询所有姓刘的学生的学号和姓名的代码7查询没有成绩的学生的学号和姓名8查询有成绩的学生的学号和姓名9什么叫多重条件的查询。试举一例。10orderby子句中表示降序排列与降序排列的的字分别是什么?排序关键字的缺省值是什么?20 第4章习题及其解答1写出使用代码创建SQLServer2000的登录帐号的一般格式:Execsp_addlogin 登录帐号,密码,默认数据库,默认语言(1)2保存在系统中可随时被调用的系统存储过程,是已被编译好的一段机器语言代码,还是源代码?解:保存在系统中可随时被调用的系统存储过程,是已被编译好的一段机器语言代码,而不是源代码。3系统存储过程存放于什么逻辑位置?解:系统存储过程存放于什么逻辑位置是:数据库master存储过程4调用存储过程创建一个登录SQLSERVER2000的登录名。其登录名为’zhangmei’,密码为’xyz456’,默认数据库为’studentclass’。解:其代码为Execsp_addlogin’zhangmei’,’xyz456’,’studentclass’5使用代码为已有的登录帐号A创建一个数据库的用户名a一般格式是?Execsp_grantdbaccess登录名A,用户名a6一个登录名A只能对应于一个用户名,一个用户名可以对应若干个登录名,正确吗?7写出代码为已有的SQLServer2000的登录帐号zhou,创建一个对”教学”数据库的用户zhou1Use教学Execsp_grantdbaccess"zhou","zhou1"8写出授权的一般格式Grant权限1,权限2,......,权限kOn数据对象名(2)To用户1,用户2,.......,用户n9什么样的用户才能对其它用户授权?10allprivileges包括哪些权限?解:ALL权限是指:insert,delete,update,select11把对“学生基本情况表”的查询权授予用户zhang1,并允许用户zhang1将此权再次授予其它用户,写出代码。grantselecton学生基本情况表tozhang1withgrantoption;12:(1)由SA创建二个登录名zhou,zhang,为登录名zhou,zhang分别创建二个用户名zhou1,zhang1。(2)由SA向zhou1授查询studentclass数据库中“学生基本情况表”的权限,并允许用户zhou1将此权再次授予其它用户。(3)由zhou以SQL身份登录SQLsever2000服务器,并向zhang1授查询“学生基本情况表”的权限。(4)由zhang以SQL身份登录SQLsever2000服务器,并执行用户zhang1对“学生基本情况表”的查询。解:(1)由SA以windows身份登录SQLsever2000服务器,并刨建二个登录名zhou,zhang:Execsp_addlogin‘zhou’,‘123456’,’studentclass’GoExecsp_addlogin‘zhang’,‘123456’,’studentclass’Go(2)由Sa为登录帐号‘zhou’与‘zhang’分别创建对数据库studentclass的用户名zhou1,zhang1:UsestudentclassgoExecsp_grantdbaccesszhou,zhou1go20 Execsp_grantdbaccesszhang,zhang1go(3)由SA向zhou1授查询“学生基本情况表”的权限,并允许用户zhou1将此权再次授予其它用户。grantselecton学生基本情况表tozhou1withgrantoption;(4)由zhou以SQL身份登录SQLsever2000服务器。设由zhou已以SQL身份登录SQLsever2000服务器,现向zhang1授查询“学生基本情况表”的权限。Usestudentclassgograntselecton学生基本情况表tozhang1(5)由zhang以SQL身份登录SQLsever2000服务器,并执行用户zhang1对“学生基本情况表”的查询。设zhang已以SQL身份登录SQLsever2000服务器,现执行如下代码:Select*from学生基本情况表13写出回收权限的一般格式:revoke权限1,权限2,......,权限kOn数据对象名(3)from用户1,用户2,.......,用户n,14用户对数据的操作权限包含哪些?解:其权限可包括select,insert,update,delete。15若用户u5已向用户U6授了对“学生选课表”的insert权限,那么,下述代码执行后,U6是否还有对“学生选课表”的insert权限?Revokeinsert,selecton学生选课表fromu5cascade;16:(1)由SA创建二个登录名zhou,zhang,为登录名zhou,zhang分别创建二个用户名zhou1,zhang1,并向zhou1授查询“教学”数据库中“学生基本情况表”的权限,且允许用户zhou1将此权再次授予其它用户。(2)由zhou以SQL身份登录SQLsever2000服务器,并向zhang1授查询“学生基本情况表”的权限。(3)查看用户zhou1和zhang1他们的权限。(4)执行权限级联回收。解:(1)由SA以windows身份登录SQLsever2000服务器,并刨建二个登录名zhou,zhang:Execsp_addlogin"zhou","123456","教学"GoExecsp_addlogin"zhang","123456","教学"GoUse教学goExecsp_grantdbaccesszhou,zhou1goExecsp_grantdbaccesszhang,zhang1gograntselecton学生基本情况表tozhou1withgrantoption;go(2)由zhou以SQL身份登录SQLsever2000服务器。设由zhou已以SQL身份登录SQLsever2000服务器,现向zhang1授查询“学生基本情况表”的权限。Use教学gograntselecton学生基本情况表tozhang1(3)查看用户zhou1和zhang1,知他们都有查询“学生基本情况表”的权限(4)执行权限级联回收Revokeselecton学生基本情况表fromzhou1cascade;经查看用户zhou1和zhang1,他们都不再有查询20 “学生基本情况表”的权限。。17写出使用系统存储过程为数据库B创造角色的一般格式Execsp_addrole"角色名"18:为数据库studentclass创建一个角色"ComputerRole"UsestudentclassgoExecsp_addrole"ComputerRole"go19写出将用户a添加到角色A中去的一般格式execsp_addrolemember角色A,用户a20设数据库studentclass中已有用户User01和角色Role1,将用户User01添加到角色Role1中去,写出代码。Usestudentclassexecsp_addrolememberRole1,User0121:(1)创建一个登录名"Tian",密码为"123456";(2)为登录名"Tian"创建一个“教学”数据库的用户"TianXiaoPong";(3)在“教学”数据库中创建一个角色"CoputDepart";(4)对角色CoputDepart授对“学生基本情况表”的select,insert,update,delete权限;(5)将用户"TianXiaoPong"添加到角色"CoputDepart"中去。解:(1)创建一个登录名"Tian",密码为"123456"Execsp_addlogin"Tian","123456"(2)为登录名"Tian"创建一个“教学”数据库的用户"TianXiaoPong"use教学goExecsp_grantdbaccess"Tian","TianXiaoPong"go(3)在“教学”数据库中创建一个角色"CoputDepart"use教学Execsp_addrole"CoputDepart"go(4)对角色CoputDepart授对“学生基本情况表”的select,insert,update,delete权限。Grantselect,insert,update,deleteOn学生基本情况表ToCoputDepartgo(5)将用户"TianXiaoPong"添加到角色"CoputDepart"中去。execsp_addrolemember"CoputDepart","TianXiaoPong"则用户"TianXiaoPong"就有了角色"CoputDepart"的一切权限。以上代码代码造价工作于如下代码:Execsp_addlogin"Tian","123456"gouse教学goExecsp_grantdbaccess"Tian","TianXiaoPong"goExecsp_addrole"CoputDepart"goGrantselect,insert,update,deleteOn学生基本情况表ToCoputDepartgoexecsp_addrolemember"CoputDepart","TianXiaoPong"go22:在数据库StudentClass中建立了二个角色sale,managementuseStudentClassgosp_addrole"sale"gosp_addrole"management"go23:在指向的数据库中建立一个角色management1Execsp_addrole"management1"20 23删除master数据库中的角色saleUSEmastergosp_droprole"sale"GO24:(1)以全校“学生基本情况表”为基础,建立“计算机系学生视图”。(2)SA为计算机学院田院长创建一个登录名tian,为登录名tian创建一个用户名tianyuan。(3)SA为用户tianyuan授对“计算机系学生视图”的select,insert,update,delete权限。则计算机学院田院长tianyuan就只能接触到计算机学院学生的数据。解:(1)以全校“学生基本情况表”为基础,建立“计算机系学生视图”CS_StudentCreateviewCS_StudentAsSelect*FromstudentWhereSdept=’D03001’(2)SA为计算机学院田院长创建一个登录名tian,为登录名tian创建一个用户名tianyuan:Execsp_addlogin"Tian","123456"gouse教学goExecsp_grantdbaccess"Tian","TianYuan"go(3)SA为用户tianyuan授对“计算机系学生视图”的select,insert,update,delete权限。Grantselect,insert,update,deleteOnCS_StudentToTianYuanGo于是用户计算机学院田院长tianyuan就只能接触到计算机学院学生的数据。25如下代码中public指哪些用户Usestudentclassgrantselecton学生选课表topublic;解:关键字public指数据库studentclass的所有用户。习题5及其解答1写出基表定义的一般格式解:CREATETABLE表名(列名1数据类型1列级约束1,…………,列名k数据类型k列级约束k,表级约束)2实体完整性解:实体完整性:在基表中定义主码,并要求入库的任一元组的主码值非空、同一基表中任意二个元组的主码值互不相同,这种约定称为数据库的实体完整性。3参照完整性定义的一般格式FOREIGNKEY(列名)REFERENCES外表名B(B的列名)4基表定义中,什么情况下,当主码必须定义为表级约束解:当主码由多个字段构成时,主码必须可定义为表级约束。5什么情况下,参照完整性定义中,FOREIGNKEY(列名)子句可以省略?当参照完整性定义为列级约束时,FOREIGNKEY(列名)子句可以省略。6定义约束命名子句的一般格式:解:CONSTRAINT约束名[primarykey短语|foreignkey短语|chech短语]7删除约束的一般格式altertable表名dropCONSTRAINT约束名;8重建约束的一般格式altertable表名studentaddCONSTRAINT约束名约束子名9实验设计(1)创建设数据studenDb;建立学生登记表Student(Sno,Sname,Sage,Ssex),要求姓名不能取空值,年龄小于30,性别只能是“男”或“女”。20 (2)插入数据(‘S0807001’,’张兰’,18,’女’)。(3)将表Student中性别只能是“男”或“女”改成性别只能是“B”或“G”。(4)将数据(‘S0807002’,’刘小虎’,19,’B’)插入表Student中。(5)观察表Student中的元组。解:CreatedatabasestudentDbgoUsestudentDbCREATETABLEStudent(Snochar(10)primerykey,SnameCHAR(20)NOTNULL,SageNUMERIC(3)CHECK(Sage<30),SsexCHAR(2)CONSTRAINTC1CHECK(SsexIN("男","女")),);GoInsertIntoStudentvalues(‘S0807001’,’张兰’,18,’女’)GoAltertablestudentDropconstrainC1GOALTERtablestudentAddconstrainC1CHECK(SsexIN("B,"G"))GoInsertIntoStudentvalues(‘S0807002’,’刘小虎’,19,’B’)GoSelect*FromstudentGo执行结果:SnoSnameSageSsexS0807001张兰18女S0807002刘小虎19B认真理解程序及执行情况10数据转换函数CAS的一般格式:CAST(expressasdate_type)11数据类型numeric(p)与numeric(p,n)是什么意思?解:数据类型numeric(p)定义一个P位整数,数据类型numeric(p,n)定义一个p位实数,其中n位小数。实际上,numeric(p)=numeric(p,0)12系表,学生表、课表、选课表它们的创建设左右为难是什么?解:它们的创建顺序可以是a,b,c,d;a,c,b,d.只有这二种顺序才是符合数据库的完整规则。a系表(系号,系名,领导,电话),□①b学生表(学号,姓名,性别,出生日期,家庭地址,所属系),□②①c课程表(课程号,课程名,学时,学分),□③d选课表(学号,课程号,成绩)②③13关键字Intersect的功能是什么?解:关键字Intersect的轻盈是求二个关系的交14理解下述代码ALTERTABLEDepartmentADDDaddresschar(20)NULLgoALTERTABLEDROPDaddresschar(20)goALTERTABLEDepartmentADDPRIMARYKEY(Deno)goALTERTABLEDepartADDPRIMARYKEY(Dname)goALTERTABLEDddADDPRIMARYKEY(Leader,Tel)goALTERTABLEDepartADDPRIMARYKEY(Lead,Tel)goselectcast("4567.77"aschar(20)),20 cast("4567.77"asvarchar(20)),cast(4567.77asint)练习4(上机实验设计)1创建“学生基本情况与成绩管理系统”数据库.2创建这个数据库中的如下4张表(以a,b,c,d为序,创建时注意保存SQL语句的文本):a系表(系号,系名,领导,电话)b学生表(学号,姓名,性别,出生日期,家庭地址,所属系),c课程表(课程号,课程名,学时,学分),d选课表(学号,课程号,成绩).3对上述4张表,练习其创建顺序的求解方法.4对每张表均输入10个记录的数据。.5备份自己的数据库。.6对上述5项再做第二遍第9章习题及其解答1叙述k个批处理执行过程解:k个批处理执行过程是:将第一个批处理调入内存、语法检查、编译、执行、释放内存。对第二个批处理作同样的处理,直到最后一个批处理执行完毕。2叙述批处理的优点解:批处理的优点所占用的内存小,使得机器可以处理更大的问题。例9.1:统计学生人数和男、女生人数。UsestudentclassSelectSnumber=count(*)fromStudentGoSelectSsex,Snumber=count(*)fromStudentGroupbysexGo3如何生成应用程序B的脚本文件?它的扩展名是什么?对于查询分析器中的应用程序B,关闭查询分析器时将其保存,所生成的文件B.sql就是应用程序B的脚本文件。应用程序B的脚本文件为B.sql。9.1.3事务4叙述事务的概念与特点:解:事务A是一段特殊的语句集合,对应于对数据库的一组操作序列。其特殊性在于事务A的语句集合要么全执行要么全不执行。5写出“转学生年龄”的事务程序解:begintransactiondeclare@yysmallintselect@yy=年龄from学生基本情况表2where学号="s0807001"set@yy=@yy-20update学生基本情况表2SET年龄=@yywhere学号="s0807001"update学生基本情况表2SET年龄=年龄+20where学号="s0807002"if@yy<0rollbacktransactionelsecommittransaction(7)运行转帐事务程序(在”chuhu”表上,将2010404010201上转账5000元到2010404010202上)begintransactiondeclare@yysmallintselect@yy=CBalancefromchuhuwhereCno="2010404010201"set@yy=@yy-5000updatechuhuSETCBalance=@yywhereCNo="2010404010201"updatechuhuSETCBalance=Cbalance+@yywhereCNo="2010404010202"if@yy<0rollbacktransactionelsecommittransactionGoselect*fromchuhugo执行结果,转帐成功:(8)再次运行转帐事务程序,转帐不成功,执行过程中产生回滚。select"事务执行前帐户余额"select*fromchuhugobegintransactiondeclare@yysmallint20 select@yy=CBalancefromchuhuwhereCno="2010404010201"set@yy=@yy-5000updatechuhuSETCBalance=@yywhereCNo="2010404010201"updatechuhuSETCBalance=CBalance+50000whereCNo="2010404010202"select"事务回滚前帐户余额"select*fromchuhuif@yy<0rollbacktransactionelsecommittransactionGoselect"事务回滚后帐户余额"select*fromchuhugo执行结果:6全局变量以什么符号开头,局部变量以什么符号开头?用户是否可以定义全局变量?局部变量的生成期可以跨批处理?7全局变量@@Version与@@servername中装的是什么值?解:全局变量@@Version中装的常量是:当前版本的信息。全局变量@@servername中装的常量是:当前SQLSER服务器的名称。8定义局部变量的格式是什么?答:定义局部变量的格式是Declare@变量名数据类型9语句“Select@sname=SnamefromStudentWhereSno="S0807001"”与“SelectSsname=SnamefromStudentWhereSno="S0807001"”二者有何区别?解:前者是一个赋值语句,后者是一个查询语句。10表变量只能存放一行值,还是可存放n行值?表变量的生成期可以跨批处理吗?解:表变量可存放n行值。表变量的生成期仅为它所在的批处理执行过程。11写表变量定义的一般格式:解:Declare@表变量名ATABLE(字段名1数据类型1,……,字段名k数据类型k)12定义一个表变量@mk(Cno,Snumber,AvGrade),用于存放(课程号,选课学生数,平均分数)。使用“Insertinto表变量values(x1,x2,x3)”语句为表变量中增添一行数据,并查看表变量中的数据存储情况。解:Declare@k--定义一个表变量TABLE(CnoCHAR(16),SnumberSmallint,AvGradeSmallint)Insertinto@kvalues("C090807001",18,85)Select*from@muGo13定义一个表变量@mu(Cno,Snumber,AvGrade),将学生选课表SC中各门课程的选课人数及平均成绩放于该表中。Declare@muTABLE(CnoCHAR(16),SnumberSmallint,AvGradeSmallint)Insertinto@muSelectCno,Snumber=count(Sno),AvGrade=avg(Grade)fromSCgroupbyCnoSelect*from@mu--(9-4)Go14创建临时表A的定义格式与创建基表的定义格式B有何区别?解:在创建基表的定义格式的表名A前加上“#”,就成为创建临时表A的定义格式。15如下代码所创建一个临时表#C_N_avg20 存放在哪些一个数据库中?UsestudentclassgoCreatetable#C_N_avg(Cnamechar(14),Snumsmallint,AvGradesmallint)Go16Beginend结构能不能跨批处理?答;Beginend结构不能跨批处理17声明二个变量@Sname,@Sno,将"S0807003"赋给@Sno,用查询语句将学号为@Sno的学生姓名赋给@Sname,显示@Sname的值。写出其代码。解:UsestudentclassgoBeginDeclare@Snamechar(16),@Snochar(8)SET@Sno="S0807003"SELECT@Sname=SnamefromstudentWhereSno=@SnoPrint@SnameEndGo18以下代码有几次输出?输出结果是一个关系还是一个数据?BeginDeclare@Snamechar(16),@Snochar(8)SET@Sno="S0807003"SELECT@Sname=SnamefromstudentWhereSno=@SnoSelect@SnameEnd19如果有选修3门课以上的学生就列出学生名单,否则给出信息“没有选修3门课以上的学生”。要求将选课门数作为参量,以便给该参量赋不同值时可以得到相应的信息。写出代码。解:BeginDeclare@NumintSet@Num=3Ifexists(selectcount(Cno)fromSCGroupbySC.Snohavingcount(Cno)>=@Num)BEGINSELECT"选课"+CAST(@NumASCHAR(2))+"门以上课程的的名单:"SelectSno,Sname,count(Cno)选项课门数fromStudentS,SCWhereS.Sno=SC.SnogroupbySnohavingcount(Cno)>=@NumOrderbycount(Cno)DESCENDELSEPRINT"没有选课"+CAST(@NumASCHAR(2))+"门以上的学生"END20“Select--from–Where”查询块中,如果查询目标列中混合含有列名和聚合函数,那么是否一定要分组查询?解:如果查询目标列中混合含有列名和聚合函数,那么一定要分组查询?21逻辑值函数Exist(A)中A是关系还是数值?何种情况下Exist(A)逻辑值为真?解:逻辑值函数Exist(A)中A可以是关系,当A中的元组非空,Exist(A)逻辑值为真。22系统函数CAST(数据AAS数据类型B)的功能是什么?,将数据A转化为数据类型B。解:CAST(数据AAS数据类型B)的功能是将数据A转化为数据类型B。23给出对“学生选课表”的查询结果,要求其中的成绩转换为等级解:SelectSno,Cno,Grade=caseWhenGrade>=90then"优"WhenGrade>=80then"良"WhenGrade>=70then"中等"WhenGrade20 >=60then"及格"Else"不及格"endFromSCGo24查询每个学生的学号、姓名、课程号、课程名、成绩,要求将成绩转换为等级。解:SelectS.Sno,C.Cno,Cname,Sname,Grade=caseWhenGrade>=90then"优"WhenGrade>=80then"良"WhenGrade>=70then"中等"WhenGrade>=60then"及格"Else"不及格"endFromStudentS,CourseC,SCWhereS.Sno=SC.SnoandC.Cno=SC.CnoGo25查询选择了课程"C090807003"的每个学生的学号、姓名、课程号、课程名、成绩,要求将成绩转换为等级。如果没有学生选修这门课程,则给出“没有学生选修C090807003课程”的显示。要求以参量表示被查询的课程号并以值"C090807003"赋给该变量,以便给出不同的课程号实参,可以查知相应的信息。写出代码。解:Begindeclare@c_namechar(20),@Cnochar(12)set@Cno="C090807003"IFexists(selectcount(*)FROMSCWHERECno=@Cno)BEGINSET@c_name=(selectCnofromCourseWhereCno=@Cno)Select"选修课程"+@c_name+"的学生成绩单:"SelectS.Sno,C.Cno,Cname,Sname,Grade=caseWhenGrade>=90then"优"WhenGrade>=80then"良"WhenGrade>=70then"中等"WhenGrade>=60then"及格"Else"不及格"endFromStudentS,CourseC,SCWhereS.Sno=SC.SnoandC.Cno=SC.CnoandC.Cno=@CnoEndElseprint"没有选修"+@c_name+"的学生"EndGo26在数据库studentclass中自定义一个名为nametext的数据类型,是字符型数据类型,长度为100个字符。写出代码。解:UsestudentclassGoExecsp_addtypenametext,"char(100)"Go27对数据库中已创建设的一个自定义数据类型A,写出查看这个数据类型A的路径。解:studentclass可编程性用户自定义数据类型,可以查看到已定义的数据类型A。28写出删除在数据库A中已自定义数据类型B的一般格式。解:Use数据库AExecsp_droptype已自定义的数据类型名BGo29在数据库studentclass中自定义一个函数SC_pass,其功能是将一个百分制的成绩按转换成“优秀”、“良好”、“通过”、“不通过”20 。写出其代码。解:UsestudentclassGoCreatefunctionSC_pass(@gradeint)Returnschar(8)AsBeginDeclare@infochar(8)If@grade>=90set@info="优"elseIf@grade>=80set@info="良"elseIf@grade>=60set@info="通过"elseset@info="不通过"Return@infoendgo30调用题29中的自定义函数SC_pass,查询出选修课程"C090807001"的学生的成绩等级。解:UsestudentclassgoselectSname,Cname,dbo.SC_pass(Grade)fromStudentS,SC,CoursewhereS.Sno=SC.SnoandSC.Cno=Course.CnoandCourse.Cno="C090807001"31创建一个表函数,以系名、课程名为形参,对形参赋以系名D、课程名C时,可以查询该系中选修了该课程的全部学生的成绩。解:UsestudentclassGoCreatefunctionD_course1(@departchar(16),@Cnamevarchar(20))ReturnstableAsreturn(selectSname,Cname,GradefromStudentS,SC,CourseCwhereS.Sno=SC.SnoANDSC.Cno=C.CnoAND@Cname=C.CnameAND@depart=depart)go32对于实参(系名、课程名)=("D03003","c语言"),调用题31中的表函数D_course1,查询该系中选项修了该课程的全部学生的和成绩。UsestudentclassGoSELECT*fromdbo.D_course1("D03003","c语言")Go33SELECT语句与,Print语句都有输出功能,它们在输出结果及显示上有什么不同?解:SELECT语句执行的结果都是关系,显示在“网格”里;Print语句执行的结果都是非关系显示在“消息”里。34算符“+”,有几种含义,试说明。解:运算符“+”,有二种含义。对于表达式A+B,当A,B同为数值型数据时,运算符“+”是算述运算;当A,B同为字符型型数据时,运算符“+”是字符串连接运算。34如下程序中,语句(9--3)中@sname不是一个合法的变量?为什么?Declare@snamechar(16)--定义一个变量’Set@sname="张家民"--使用Set赋值Print@sname--显示变量的当前值GoSet@sname="刘河岛"--(9--3)Print@snameGo解:语句(9--3)中@sname是一个非法的变量,因为它没有被定义。36例9.13中exists稍作修改后如下,那么语句(9-10)是否有可有被执行,为什么?Begindeclare@c_namechar(20),@Cnochar(12)set@Cno="C090807003"IFexists(selectcount(*)FROMSCWHERECno=@Cno)(9-9)BEGINSET@c_name=(selectCnofromCourseWhereCno=@Cno)Select"选修课程"+@c_name+"的学生成绩单:"Select20 S.Sno,C.Cno,Cname,Sname,Grade=caseWhenGrade>=90then"优"WhenGrade>=80then"良"WhenGrade>=70then"中等"WhenGrade>=60then"及格"Else"不及格"endFromStudentS,CourseC,SCWhereS.Sno=SC.SnoandC.Cno=SC.CnoandC.Cno=@CnoEndElseprint"没有选修"+@c_name+"的学生"(9-10)EndGo解语句(9-9)中selectcount(*)FROMSCWHERECno=@Cno其执行结果始终是一个非空集,因此语句(9-10)不可能被执行。习题10及其解答1存储过程概念理解解:对于一项复杂的任务A,将完成任务A的各种命令集中起来,写成一个新的命令A’。执行命令A’,就可以完成任务A。这种方法,称为存储过程。存储过程由若干批处理所构成,可以完成对数据库的复杂操作。2存储过程的定义形式1(不带参量的存储过程定义)解:createprocedure存储过程名ASSQL语句3在数据库Usestudentclass中定义名为ScoreNoPass_pro的存储过程,用来在表Student,、Course、SC中查询不及格的学生其学号、姓名、课程名、成绩解:Usestudentclass(1)gocreateprocedureScoreNoPass_pro(2)asselectc.Sno,a.Sname,b.Cname,c.GradefromStudenta,Courseb,SCcwherea.Sno=c.Snoandb.Cno=c.Cnoandc.Grade<60go4上述代码执行后,通过什么路径可查看存储过程ScoreNoPass_pro解:上述代码执行后,通过什么路径:数据库studentclass存储过程ScoreNoPass_pro,查看存储过程ScoreNoPass_pro已被创建。5已定义的存储过程是以源代码形式还是以可执行代码的形式被存放在系统中?解:是以可执行代码存放在系统中。6存储过程调用形式1是什么(不带参量的存储过程调用)?解:Execute存储过程名7写出存储过程的定义形式2(带参量而无返回参量的存储过程定义)解:createprocedure存储过程名@形参变量1数据数据类型1,……,@形参变量k数据数据类型kASSQL语句8在数据库studentclass中建立一个名为Addsc_proc的存储过程,用来在选课表中批量插入某系某门课程的成绩,Grade暂时为空,某系与某门课程二者为参量,数据类型均为字符型。解:UsestudentclassgocreateprocedureAddsc_proc@v_Cnovarchar(10),@v_Dpartvarchar(6)asinsertintoSC(Sno,Cno,grade)selectSno,@v_Cno,nullfromStudentwhereDepart=@v_Dpartgo9写出存储过程调用形式220 (带参量而无返回参量的存储过程调用)Execute存储过程名实参1,……,实参k10调用存储过程Addsc_proc,准备用于在选课表中批量插入计算机系("D03001")计算机基础课程("c090807002)的成绩。解:executeAddsc_proc"c090807002","D03001"11写出存储过程的定义形式3(只有一个返回参量的存储过程定义)解:createprocedure存储过程名@形参变量1数据数据类型1,……,@形参变量k数据数据类型k@形参变量k+1OUTPUT1,……,@数据数据类型nOUTPUTASSQL语句12定义一个存储过程,其功能是将二个字符串连接起来,并返回其结果。解:CREATEPROCstrconnect2@aVARCHAR(10),@bVARCHAR(10),@resultVARCHAR(20)OUTPUTASSET@result=@a+@b13写出存储过程定义的一般格式与存储过程调用的一般格式解:存储过程定义的一般格式Createprocedure存储过程名[@形参变量1数据类型1,……,@形参变量k数据类型k,][@形参变量中k+1数据类型k+1OUTPUT,……,@形参变量中k+1数据类型k+nOUTPUT]AsSQL语句存储过程调用的一般格式Executeprocedure存储过程名[实参1,……,实参k][@形参变量中k+1数据类型k+1OUTPUT,……,@形参变量中k+n数据类型k+1OUTPUT]14写出删除存储过程的一般格式dropprocedure存储过程名15用户定义的临时存储过程名,以什么符号开头,存放在什么数据库中?解:用户定义的昨临时存储过程名,以一个“#”号开头,存放在“tempdb”数据库之中。16系统存储过程名以什么符号开头?存放在什么地方?你已经学习过哪些些系统存储过程?解:系统存储过程名以sp_开头,存放在master数据库中。已经学习过sp_bindefault,sp_droptype等系统存储过程。第11章习题及其解答1问题回答:触发器是定义在表上,还是定义在数据库上?触发器是由关键字execute调用来激活,还是由数据操作来活?触发器分为哪能三类?触发器定义中,关键字for与before在功能上有没有区别?触发器的功能是不是由触发体所决定的?2写出触发器定义格式,并阐述其意义。解:CREATETRIGGER<触发器名A>ON<表名B>FOR操作CAS<触发体D>上述定义是在表B上创建一个触发器A,其功能是当在表B上实施操作C时,激活触发器A,从而执行触发体中的语句块D。其中,<触发体D>可以是任意的SQL语句块,操作C{insert,update,delete}。3写出你对下述代码的理解:Createtriggerinsert_retireOnStudentFordeleteAsDeclare@v_Snovarchar(8)(1)Select@v_Sno=Snofromdeleted(2)InsertIntoretire20 Values(@v_Sno)(3)go理解:在表Student上创建了一个触发器,名为insert_retire,其中语句(1)--(3)是触发体。此触发器的功能是:当在表Student上实施操作delete时,激活触发器insert_retire,从而执行触发体中的语句块(1)--(3)。触发体执行的结果是将表Student中被删除的元组中的学号插入到表retire中。4在数据库Studentlass的基表Student上定义一个触发器insert_retire之后,以什么样的路径可以查看到位该触发器的存在?解:通过路径:StudentlassStudent(右)所有任务管理触发器,可以察看到触发器insert_retire已经被创建。5代码分析:运行下述代码之后,在表Student中不再有什么样的一条记录,表retire1中添加了一条什么样的记录?使用什么语句可以检验你的判断?UseStudentlassgocreatetableretire1(ReSnovarchar(8)primarykey,Redatedatetime)GoCreatetriggerinsert_retire1OnStudentFordeleteAsDeclare@v_Snovarchar(8)Declare@v_RedatedatetimeSelect@v_Sno=SnofromdeletedInsertIntoretire1Values(@v_Sno,getdate())godeletefromStudentwhereSno="S0807002"go解:运行上述代码之后,在表Student中不再有学号为"S0807002"的记录,表retire1中添加了一条学号为"S0807002"的记录。使用下述语句可以检验这一判断:select*fromStudentgoselect*fromretire1go6已知数据库Studentclass中有4张表:Depart、Student、Course、SC,而表Student中有字段被SC的字段引用,那么,在表Student上可以有效定义delete触发器吗?表Student上可以insert触发器吗?为什么?解:在表Student上一般情况下不能有效定义delete触发器,因为触发语句delete不能被执行,否则违背了数据的参照完整性。因而触发器不可能被激活。在表Student上可以定义insert触发器吗,因为在表Student上实施insert操作可以不违背数据的完整性。因而触发器不可能被激活。7设SC表上定义了一个delet触发器,那么在表20SC实施delete操作时,DBMS会不会自动生成一个临时表deleted,且记录被删除元组的相关信息。设SC表上没有定义delet触发器,那么在表SC实施delete操作时,DBMS会不会自动生成一个临时表deleted,且记录被删除元组的相关信息?设计一个实验,对你的回答进行检验。8实验设计(insert触发器)建立插入触发器,实现当插入新生记录时,自动将该生的在Course表中所有课程的成绩插入选课表SC中,成绩设为null.解:代码为DroptriggerInsertSCUseStudentlassgoCreatetriggerInsertSC20 OnStudentForinsertAsDeclare@v_Snovarchar(8)Select@v_Sno=SnofrominsertedInsertIntoSC(Sno,Cno,grade)SelectSno=@v_Sno,CnonullfromCourseGoinsertintoStudentvalues("S0807100","张忠明","男","1991-01-08","D03001","洪湖")goselect*fromStudentselect*fromSCwhereSno="S0807100"go9理解函数ISNULL(Snumber,5)的意义,其中Snumber的数据类型是int.解;ISNULL(Snumber,5)=5当Snumber=nullISNULL(Snumber,5)=Snumber当Snumberisnotnull2020'