配色: 字号:
《SQL Server 2005基础教程及上机指导》第3章 访问及修改数据库
2023-05-25 | 阅:  转:  |  分享 
  
第3章 访问及修改数据库3.1 向表中插入记录3.2 访问查询表中的记录3.3 修改表中的记录3.4 删除表中的记录3.5 使用
管理控制台管理表中的记录第3章 访问及修改数据库3.6 修改表的架构3.7 修改数据库的架构3.8 数据库的完整性3.9
上机实验习题  在本章中,我们将学习利用基本的SQL(Structured Query Language,结构化查询语言)语句对
存储数据库进行操作的方法,这是关系型数据库一个重要的功能。SQL语句的特点是直观、简单,初学者经过较短时间的学习,就可以熟练掌握怎
样对数据库进行简单的存取操作。   本章学习目标:   (1) 掌握SELECT语句的使用,以及一些重要的子句,例如W
HERE、ORDER BY和GROUP BY等的使用。   (2) 掌握在WHERE子句中灵活运用各种运算符的技巧。   (3)
掌握INSERT、DELETE、UPDATE语句的基本使用方法。   (4) 掌握修改数据库和表的架构的方法。   (5) 理解数
据库完整性的概念,掌握利用约束实现数据库完整性的方法。  本章是以完成第2章实验六“附加学生管理数据库WxdStudent”为前提
的,并且具有相应的设备条件,具体如下:   一台计算机,该计算机的操作系统为“Windows Server 2003”,计算机名为
“WestSVR”,IP地址设为“192.168.1.13 /24”,数据库系统为“SQL Server 2005企业版”,安装了
一个默认实例和一个命名实例,命名实例名称为“WESTWIND SQL”,在默认实例中已创建好数据库“WxdStudent”,客户端
计算机为可选,因为计算机“WestSVR”也可充当自身的数据库客户端。  除非特别说明,本章以及后续章节中的所有操作均以该设备为准
。     当建立起一个新的数据库之后,我们必须通过某种方法将一些数据添加到这个数据库中,然后才能在以后的操作中对这些数据进行访
问,在本小节中,首先建立起用来存储参加各种等级证书考试的成绩表TestInformation,然后使用它来讲解如何通过两种方法(一
种是通过INSERT语句,一种是通过管理控制台)来向表中插入记录,并将TestInformation这个表创建在WxdStuden
t数据库中,它的结构如图3-1所示。3.1 向表中插入记录  可以看到,在TestInformation表中有6个字段,其中In
foID为主键,它表示这条记录为某位学生的考试信息,同时它也是标识列,当插入一条记录时,它的数值会自动增加。   图3-1 Te
stInformation表结构  StudentID为某位学生的ID号码,这个字段为外键,跟它对应的主键是student表的St
udentID,可以从TestInformation表的外键关系图中看出这种关系。在“对象资源管理器”中右击TestInforma
tion表,选择“修改”,此时会在右边打开TestInformation表的结构修改窗口,单击工具栏按钮“ ”
,在弹出的“外键关系”图中单击“表和列规范”旁边的“+”号,可以看到详细的信息,如图3-2所示。   图3-2 TestInfo
rmation表外键关系  SubjectName代表的是科目名称,Degree代表的是级别,Score代表的是分数,并且可以为空
,Credit代表的是学分(在这里假设若成绩合格,就能根据所考的级别加上一定学分,例如,考一级合格的加1分,考二级合格的加2分)。
3.1.1 INSERT语法简介   INSERT语句用于将新行追加到表中,它的语法结构如下:   INSERT [INTO]
<表名> [(字段名列表)] VALUES (字段值列表)   在该结构中,INSERT为关键字,INTO为一个可选的关键字
,可以将它用在INSERT 和目标表之间,<表名>为要插入数据的表。   (字段名列表)为要在其中插入数据的一列或多列的列表。必须
用括号将“字段名列表”括起来,并且用逗号进行分隔。  VALUES为关键字。   (字段值列表)为要插入值的列表,括号里的各插入值
之间用逗号分开。3.1.2 使用INSERT向表中插入记录   下面介绍如何使用INSERT语句。   (1) 单击“开始”|“
所有程序”|“Microsoft SQL Server 2005”|“SQL Server Management Studio”。
首先将弹出“连接到服务器”对话框,如图3-3所示。   图3-3 “连接到服务”器对话框  (2) 在图3-3中单击“连接”按钮
即可连接到数据库服务器“WestSVR”的默认实例并进入“Microsoft SQL Server Management Stud
io”界面,在对象资源管理器中,展开节点“WestSVR”|“数据库”,单击选中数据库节点“WxdStudent”,再单击工具栏按
钮“ ”,在新打开的查询窗口中输入代码清单3-1所示的代码,然后再单
击工具栏按钮“ ”,此代码的前一部分为创建TestInformation表的代
码,后一部分是插入记录的语句,如图3-4所示。   图3-4 新建查询窗口并输入代码  (3) 从图3-4的消息栏中可以看到“
1行受影响”的字样,说明已经成功地在数据库中插入了一条记录。在“对象资源管理器”中右击TestInformation表,选择“打开
表”,可以看到该表中已经存在第一条记录,如图3-5所示。   其实,如果在INSERT语句中指定了所有列(标识列除外)的值,是可以
省略掉[(column_list)]部分的,但要求(data_values)中数值的顺序和表中各列的顺序是一致的,按照刚才所讲方法
输入代码清单3-2并运行。   图3-5 TestInfomation表结果   打开TestInformation表观察
结果,发现数据也能够被正确插入到数据库中,如图3-6所示。   图3-6 TestInfomation表结果  我们在前面观察T
estInformation表的结构时已经知道Score字段是可以为空的,这一点有时候很有用。比如在有一些学生缺考的情况下,可以让
Score字段留空(不要将Score字段设置为0,否则会让人误以为这个学生参加了考试,却只考了个0分),在INSERT语句中响应字
段的值要用表示空值的关键字“null”来代替,输入代码清单3-3所示的代码并运行。  打开TestInformation表观察结果
,发现数据也能够被正确插入到数据库中,但是第3条记录的Score字段值为“NULL”,如图3-7所示。图3-7 插入空字段图3-
8 打开表3.1.3 使用管理控制台向表中插入记录   除了用INSERT命令向数据库插入记录以外,还可以用管理控制台来给数据
库添加记录,这个过程和上面观察TestInformation表结果的步骤有些相似。   (1) 以数据库服务器“WestSVR”管
理员的身份登录服务器,打开SQL Server管理控制台。在对象资源管理器中展开节点“WestSVR”|“数据库”|“WxdStu
dent|表”,右击节点“TestInformation”,在右键菜单中选择   “打开表(O)...”,如图3-8所示。  (2
) 在右边打开显示TestInformation表内容的窗口,在这个窗口中也可以给TestInformation表添加记录。把鼠标
移动到InfoID值为NULL的记录的StudentID字段处   并单击,此时StudentID字段变为可编辑状态,输入“200
20503”,然后把鼠标移动到SubjectName字段处并单击,此时StudentID字段旁边出现一个红色的叹号,意思是提醒用户
本条记录还没有提交到数据库,等填完其他字段以后再一起提交,如图3-9所示。   图3-9 数据被更改但未提交  (3) 在其他相
应的字段分别填入数据,此时每个字段旁边都出现一个红色的叹号,把鼠标移动到其他记录处并单击,就完成了提交,此时每个字段旁边的红色叹号
均消失,说明数据已经被添加进表中了,如图3-10所示。   为了便于后面的学习,这里给TestInformation表添加上一些记
录,采用前面所讲的INSERT语句的方法来添加,输入代码清单3-3所示的代码并运行:   图3-10 数据已提交  这样,Te
stInformation表中就存在着20条记录了,掌握了怎样添加记录之后,接下来介绍怎样查询数据库中的数据。      本小节
介绍使用SELECT语句来对数据库进行查询,SELECT语句能完成很多功能,它既可以进行简单的单表查询,也可以进行复杂的连接查询。
3.2 访问查询表中的记录3.2.1 SELECT语法简介   SELECT语句的语法结构如下:   SELECT <字段名列
表>   FROM <表名>   [WHERE <筛选条件表达式> ]   [GROUP BY <分组表达式> [HAVING
<分组条件表达式>] ]   [ORDER BY <字段名> [ASC | DESC ] ]  在该结构中:   SELE
CT为关键字,<字段名列表>为按照指定的字段顺序选出字段值构造成一行数据,若要选择全部字段,可以使用通配符来代替。FROM <表
名>指定了要从中选择数据的数据表。   WHERE <筛选条件表达式>指定了只有符合<筛选条件表达式>的记录才能被查询到,GROU
P BY <分组表达式>表示将结果按<分组表达式>的值进行分组,凡是值相等的就属于同一个组。如果还带有HAVING <分组条件表达
式>子句,则只有符合条件的组才会输出。   ORDER BY<字段名列表>指定了输出结果按照<字段名>排序,ASC是升序,DESC
是降序。3.2.2 基本SELECT语句的使用   1.查询所有字段和所有记录   首先介绍最基本的SELECT语句的用法。例如
,若想列出TestInformation表中所有记录的字段数据,则可以使用代码清单3-5所示的语句,显示出来的结果如图3-11所示
。   图3-11 列出TestInformation表所有数据  从图3-11可以看到,所有的字段和记录都被显示出来了。在这
个例子中,我们使用了通配符来代表所有的字段以简化输入,当然,如果把所有字段名称一一列出也是可以的。  2.查询其中部分字段   
如果只需要显示其中一部分字段,则可以在SELECT关键字后面指定需要显示的字段列表,字段之间用逗号“,”隔开即可。例如,只显示St
udentID、SubjectName和Score三个字段,可以输入清单3-6所示的代码,运行结果如图3-12所示。   图3-
12 列出TestInformation表的3个字段3.2.3 WHERE子句、DISTINCT子句和ORDER BY 子句
  1.WHERE子句的使用   WHERE子句用来设定返回记录的限制条件,上面的两个例子中没有限定条件,所以返回了所有的记录。但
在很多情况下,若只查询符合一定条件的记录,这就要用到WHERE子句了。如SELECT语句的语法结构所述,WHERE子句包含有一个条
件表达式,在这个表达式中可以包含丰富的运算符,在表3-1中列出了一些常用的运算符。   表3-1 常用的运算符  假设现在要列出
StudentID为20020503的学生的考试情况,可以输入如清单3-7所示的代码,但在这里要注意,因为StudentID字段是
字符型数据,所以在表达式中20020503要用单引号括起来,运行结果如图3-13所示。   图3-13 列出StudentID
为20020503的学生的考试情况  假设现在要列出成绩为85分以上(含85分)的学生的考试情况,可以输入如清单3-8所示的代码,
运行结果如图3-14所示。   图3-14 列出成绩为85分以上(含85分)的学生的考试情况  对于一些要求比较复杂的情况,往
往需要用逻辑运算符把若干个条件组合起来使用。例如,假设现在要列出考试科目为“全国英语等级考试”并且级别为“一级”的学生的考试情况,
在这里,存在两个条件,这两个条件是“并且”的关系,应该用逻辑运算符 “AND”将它们连接起来,所以可以输入如清单3-9所示的代码,
运行结果如图3-15所示。   图3-15 列出全国英语等级考试(一级)的学生的考试情况  又如,现在要列出考“局域网管理员”
和“Photoshop”的学生的考试情况,这里也存在两个条件,这两个条件是“或者”的关系,应该用逻辑运算符“OR”将它们连接起来,
所以可以输入如清单3-10所示的代码,运行结果如图3-16所示。   图3-16 列出考“局域网管理员”和“Photoshop
”的学生的考试情况  在有的情况下,BETWEEN可以使得我们比较容易构造出满足条件的表达式。例如,若要列出成绩为“良好”(即成绩
处于70~79分)的学生的考试情况,使用BETWEEN构造就比较合适了,所以可以输入如清单3-11所示的代码,运行结果如图3-17
所示。   图3-17 列出成绩为“良好”的学生的考试情况    想一想,在这个例子中如果使用逻辑运算符应该怎么做?   答案
是:SELECT FROM TestInformation WHERE Score >=70 AND Score <=79,但
相比起来,应该是前一种方法的逻辑更直接和自然。   还有的情况,通配符能起到很大的作用,比如要列出02-7班(即StudentID
的前6位为200207,而后两位可以是任意数字)的学生的考试情况,在这里,可以使用LIKE运算符和2个“_”通配符,可以输入如清单
3-12所示的代码,运行结果如图3-18所示。   图3-18 列出02-7班的学生的考试情况   在列出02-7班学生考试
情况的例子中,由于知道了这个班的StudentID后两位可以是任意数字,因此可以用2个“_”通配符。但是在某些情况下却不知道存在着
多少个任意字符,例如想要列出属于“全国性质”的考试情况,这里有“全国英语等级考试”和“全国计算机等级考试”,它们的字符数目是不同的
,则需要用到可以代表任意字符的“%”通配符,即输入如清单3-13所示的代码,运行结果如图3-19所示。   图3-19 列出“全
国性质”的考试情况   如果我们想要找出某字段为NULL值的记录,IS NULL就派上用场了。例如,要列出缺考的学生的考试情况
,则将缺考学生记录的Scroe字段设置为NULL,应输入如清单3-14所示的代码,运行结果如图3-20所示。   图3-20
列出缺考的学生的考试情况  2.DISTINCT子句的使用   DISTINCT子句的作用是不选择重复的字段。假设要查询目前一共举
办了多少科目的   考试,因为很多同学所参加的科目都是相同的,所以不能列出所有的记录,只能列出SubjectName字段的值不重复
的记录,具体代码见清单3-15,运行结果如图3-21所示。   图3-21 列出目前一共举办了多少科目的考试  这样就可一目了
然:一共举办了4个科目的考试。同样地,如果想要了解一共有多少学生参加了各科目的考试,由于有的学生一个人参加了好几个科目的考试,这里
也是只能显示StudentID字段不重复的记录,具体代码见清单3-16,运行结果如图3-22所示。   结果是:一共有11名
学生参加了考试。   图3-22 列出目前一共有多少学生参加了考试  3.ORDER BY子句的使用   ORDER BY子句的
作用是对结果按照指定的字段排序,可以指定一个或多个字段,也可以指定升序(ASC)或者降序 (DESC),如果不指定,那就默认为升序
。   例如,按照成绩从高分到低分的顺序显示所有记录,具体代码见清单3-17,运行结果如图3-23所示。   图3-23 从高
分到低分的顺序显示所有记录  这个结果可看到学生们的大致考试情况,但是各种科目的考试混在一起,如果还想进一步了解每一科目的考试情况
,很明显上面的结果是没有很大帮助的。为了达到这个目的,可以对上面的代码作一点改动,增加一个排序的字段SubjectName,具体代
码见清单3-18,运行结果如图3-24所示。   现在,记录就首先按照科目进行排序,不但相同科目的记录排列在一起,而且同一科
目的记录也按照成绩的高低顺序排列。   图3-24 按照科目从高分到低分的顺序显示所有记录3.2.4 聚合函数、GROUP B
Y子句和HAVING子句   1.聚合函数的使用   聚合函数对于结果分析有很大的帮助,比如想要了解有多少人参加了“全国英语等级考
试”,有多少人参加了“全国计算机等级考试”,而且每种考试的最高分、最低分和平均分分别为多少等等。在举例子之前,先介绍几个常用的聚合
函数。  1) ?COUNT函数   COUNT函数用来统计总数,其返回值是一个数值。在很多情况下COUNT函数是和DISTINC
T子句一起使用的。例如,前面利用DISTINCT子句显示出一共有多少学生参加了考试,但它是将记录显示出来,如果记录数目比较多,这种
方法还不是很好。这里通过使用COUNT函数,希望只显示出一个数字,同时利用一个修改标题显示的方法,使得所显示的结果具有更强的可读性
。具体代码见清单3-19,运行结果如图3-25所示。   图3-25 显示一共有多少学生参加了考试  从图3-25可以看到,函
数COUNT(DISTINCT StudentID )返回了一个数字11,由于使用了AS关键字,使得标题变成了“考试人数”,这一方
法对于其它字段也是适用的。   又如,若想知道考“局域网管理员考试”的人数,则具体代码见清单3-20,运行结果如图3-26所示。
  图3-26 显示“局域网管理员考试”的人数  2) ?MAX   MAX函数用来求最大值,其返回值是一个数值。如得到所有考
试中的最高分,具体代码见清单3-21,运行结果如图3-27所示。   图3-27 显示所有考试中的最高分  3) ?MIN  
 MIN函数用来求最小值,其返回值是一个数值。它的用法与MAX相似,如得到所有考试中的最低分,具体代码见清单3-22,运行结果如图
3-28所示。   图3-28 显示所有考试中的最低分  4) ?SUM   SUM函数用来求和,其返回值是一个数值。如通过考
证途径来获取的所有学分总共为多少,具体代码见清单3-23,运行结果如图3-29所示。   图3-29 显示通过考证途径来获取的
所有学分  5) ?AVG   AVG函数用来求平均值,其返回值是一个数值。如得到“全国英语二级考试”的平均分,具体代码见清单3-
24,运行结果如图3-30所示。   图3-30 显示“全国英语二级考试”的平均分  2.GROUP BY子句的使用   GR
OUP BY子句可以将查询结果按照指定的字段进行分组,将具有相等值的记录划分为同一组,然后利用聚合函数对每一个分组分别进行统计。G
ROUP BY子句的功能很强大,灵活地运用它,可以很简单地完成通常需要多个步骤才能完成的任务。   如果想知道每一科目分别有多少考
生参加考试,那么可以让查询结果按照科目(即SubjectName字段)分组,然后每组分别用COUNT函数求人数,这里使用GROUP
BY子句就非常合适。同时会看到,在很多情况下,GROUP BY子句和聚合函数一起使用能发挥其强大的功能,具体代码见清单3-25,
运行结果如图3-31所示。   图3-31 显示每一科目的考生人数  可以看到输出结果是非常直观明了的。有时COUNT函数可以
用作为它自身的参数,因为在这里不用指明具体的字段,有一条记录就代表有一个考生。最后需要强调的是,当使用了GROUP BY子句时,
允许出现在SELECT关键字后面的字段名要么包含在聚合函数里,要么是在GROUP BY子句中出现过的字段名。   如果想进一步知道
每一科目的每一级别的考生人数,只需要对上例的代码做相应的修改:   (1) 在GROUP BY子句的字段列表中增加一个Degree
字段。   (2) 在SELECT后添加一个Degree字段。  (3) 为了让结果按一定顺序显示,在最后添加ORDER BY子句
。   具体代码见清单3-26,运行结果如图3-32所示。   图3-32 显示每一科目的每一级别的考生人数  3.HAVIN
G子句的使用   HAVING子句的作用是对分组后的结果再进行筛选,只有满足特定条件的记录才能够输出。注意要将HAVING子句和W
HERE子句进行区分,WHERE子句是对数据表进行筛选,而HAVING子句是对利用GROUP BY子句进行分组之后的数据进行筛选。
  例如,若想了解有哪些学生报考了2门科目以上(含2门)的考试,则具体代码见清单3-27,运行结果如图3-33所示。   图3-
33 显示报考了2门科目以上(含2门)的学生情况  又如,要列出总学分数在3分以上(含3分)的学生情况,具体代码见清单3-28,
运行结果如图3-34所示。   图3-34 显示总学分数在3分以上(含3分)的学生情况3.2.5 使用JOIN子句联接多个表
查询   前面所举的例子都是在单个表里进行的,叫做单表查询。但是在有些情况下,所需数据分布在不同的表中,这就产生了同时从两个或多个
表中检索数据的需求,我们把这种查询叫做联接查询。   1.内联接   内联接是根据一个或多个相同的字段将记录匹配在一起,并且只返回
那些存在字段匹配的记录。内联接的语法结构为   SELECT <字段名列表>  FROM <第1张表> INNER JOIN
<第2张表> ON (连接条件)   例如,若要显示出TestInformation表的信息,并且在最前面加上学生姓名,则
具体代码见清单3-29,运行结果如图3-35所示。   图3-35 显示添加上姓名的TestInformation表的信息  
下面分析一下这个语句。FROM子句指定了第一张表TestInformation ,并给予它一个别名T,这个别名可以用来区别和第二张
表中同名的列,还可以增强代码的可读性。在内联接的关键字INNER JOIN之后指定第二张表student ,并给予它一个别名S。紧
接着是ON子句,它指明了两张表的联接条件“T.StudentID=S.studentID”其中T.StudentID表示TestI
nformation表中的StudentID字段值(TestInformation表的别名是T),S.studentID表示stu
dent表中的studentID字段值(student表的别名是S),两个值相等的记录就被联接在了一起,联接的过程如图3-36所示
。   图3-36 内联接的过程  图3-36中,位于方框内的两条记录满足了联接条件“T.StudentID=S.student
ID”(都是20020548),所以它们被联接起来。“SELECT S.StudentName,T.”子句用来选择student
表中的StudentName字段,以及选择TestInformation表的所有字段,所以就得到了图3-35所示的输出。  2.外
联接   外联接有三种:左联接、右联接和完整联接。在外联接中,可以返回在FROM子句中指定的至少一个表的全部行。如果是左联接,则至
少返回左表的所有行;如果是右联接,则至少返回右表的所有行;而完整联接则返回两个表的所有行。   完整联接的语法和内联接的语法差不多
,只是指定联接类型的关键字不同而已。三种外联接的FROM子句中可以使用的关键字如下:   ● 左联接:LEFT OUTER JOI
N   ● 右联接:RIGHT OUTER JOIN   ● 完整联接:FULL OUTER JOIN   1) 左联
接   左联接至少返回左表(即写在JOIN子句左边的表)的所有行,但不包括右表中不满足联接条件的行,举例见代码清单3-30,运行结
果如图3-37所示(由于student表行数比较多,这里只是部分截图,完整结果请使用本书配套资源中的代码上机测试)。   图3-
37 显示左联接的效果  从图中可以看出,返回的行数大大超出了TestInformation表的原有行数(20行)。需要强调的是
,虽然左表的记录全部被返回,但如果某些记录没有在右表中找到匹配的行,则在输出结果中,相应的属于右表的字段值显示为NULL。  2)
右联接   右联接至少返回右表(即写在JOIN子句右边的表)的所有行,但不包括左表中的不满足联接条件的行。实际上右联接的效果和左
联接的是一样的,将上例左联接改成使用右联接,输出内容是一样的,只是调换两个表的位置,顺序有所不同而已,具体代码见清单3-31,运行
结果如图3-38所示(由于student表行数比较多,这里只是部分截图,完整结果请使用本书配套资源中的代码上机测试)。   图3-
38 显示右联接的效果  3) 完整联接   完整联接能返回两个表的所有行,但如果某些记录没有在另外的表中找到匹配的行,则在输出
结果中,相应地属于另外的表的字段值显示为NULL,具体代码见清单3-32,运行结果如图3-39所示(由于student表行数比较多
,这里只是部分截图,完整结果请使用本书配套资源中的代码上机测试)。   图3-39 显示完整联接的效果3.2.6 INTO子句
的使用   使用INTO子句可以在语句的运行中创建一个新表,这个表可以是保存在数据库中的   永久表,如果想创建一个存在内存的临时
表,则在表名前加上前缀“#”。   1.使用INTO子句创建永久表   例如,想利用参加“全国英语等级考试”的学生信息生成一个永久
表EnglishTest,具体代码见清单3-33,运行结果如图3-40所示。 图3-40 使用INTO子句创建永久表  从图中看
到,EnglishTest已经在“对象资源管理器”中就被创建了,将EnglishTest表的内容显示出来,具体代码见清单3-34,
运行结果如图3-41所示。   从图3-41中可以看到,输出结果与预期的是一样的。   图3-41 显示English
Test表  2.使用INTO子句创建临时表   若不想把所创建的表永久保存起来,可以只创建临时表,但要注意,临时表只在本次联接中
有效。例如,想创建保存参加了“全国计算机等级考试”的学生考试情况表ComputerTest,然后再显示临时表的内容,具体代码见清单
3-35,运行结果如图3-42所示。   图3-42 创建临时表ComputerTest并显示  从代码清单3-35看到,正确
的名字为“#ComputerTest”。从图3-42中可以看到,输出结果与预期的是一样的。   SELECT语句还有很多其他的功能
,这里不一一详细介绍了,有兴趣的读者可以进一步查看相关书籍。    3.3.1 UPDATE语法简介   数据库里的数据并不是
永久不变的,相反,我们经常要根据需求对数据库里的数据进行修改,对数据进行修改的语句是UPDATE,它的语法结构为   UPDATE
<表名>   SET <字段1>=<值1> [,<字段2>=<值2> […] ]   [WHERE <修改条件> ]
3.3 修改表中的记录3.3.2 使用UPDATE修改表中的记录   UPDATE语法简单、直观,下面举例说明,假设Stude
ntID为“20020551”的记录,由于疏忽而将他的成绩输入为NULL,通过核查,确定他的成绩应该是“95”,现在使用UPDAT
E语句来进行修改,具体代码见清单3-36(在UPDATE语句前后各添加了SELECT语句,以方便对照更改前后的数据),运行结果如图
3-43所示。   图3-43 UPDATE语句前后对比  从图3-43中可以看到,在UPDATE语句执行前,Score字段是
NULL,执行后就变成了95,但学分还是0,所以需再次执行UPDATE语句,具体代码见清单3-37,运行结果如图3-44所示。
  图3-44 UPDATE语句前后对比  实际上,如果需要在一条UPDATE语句中同时修改2个或多个字段,没有必要像上面的例子
那样分两个步骤,可以在SET子句后输入多个修改表达式,中间用逗号隔开即可一次完成。例如,将StudentID为“20020802”
的记录中的Degree改为“一级”,Score值改为“73”,Credit值改为“1”,具体代码见清单3-38,运行结果如图3-4
5所示。   图3-45 同时更改2个字段的UPDATE语句前后对比  从图3-45中可以看到,两个字段同时被修改了。   有时
需要在一条UPDATE语句中同时对多条记录进行修改,例如,对于已经通过二级考试的同学,在原来所获的学分基础上再加2分,具体代码见清
单3-39,运行结果如图3-46所示。   图3-46 同时更改多条记录的UPDATE语句前后对比    3.4.1 DEL
ETE语法简介   DELETE语句的语法结构为   DELETE <表名>   [WHERE <删除条件> ]   这个语法相当
简单,含义就是在指定表中把满足删除条件的记录删除。3.4 删除表中的记录3.4.2 使用DELETE删除表中的记录   如果想
要删除StudentID为“20020799”的记录,具体代码见清单3-40,运行结果如图3-47所示。   图3-47 删除
记录的DELETE语句前后对比  从图3-47可以看出,第一条SELECT语句能够找到相应记录并输出,然后执行DELETE语句将记
录删除,再执行一次SELECT语句时已经找不到相应的记录了,输出只有表头,没有内容。如果在图3-47所示的界面中单击“消息”,则看
到图3-48所示的提示消息,其中的第一条“(1行受影响)”是指第一条SELECT语句的执行结果,第二条“(1行受影响)”是指第DE
LETE语句的执行结果,而“(0行受影响)”是指第二条SELECT语句的执行结果。   图3-48 提示消息  我们也可以同时删
除多条记录,这取决于WHERE子句的条件设置。例如,想要删   除成绩不合格的记录,具体代码见清单3-41,运行结果如图3-49所
示,执行消息如图3-50所示。      图3-49 删除记录的DELETE语句前后对比
图3-50 提示消息  对此结果的分析与上例一样,但需注意的是,DELETE会把数据从数据库中删除,在执行
命令之前一定要仔细检查命令是否正确,以防误删数据。      在某些情况下,通过可视化图形界面来操作显得更直观和方便,这个界面
就是管理控制台。   (1) 右击节点“TestInformation”,在右键菜单中选择“打开表(O)...”,如图3-51所示
。3.5 使用管理控制台管理表中的记录   图3-51 打开表  (2) 打开显示TestInformation表内容的窗口(
注意,经过3.3和3.4节的操作,这里的记录数目只剩下17条,而且数据也已经有所改变),如图3-52所示,接下来要介绍的几种操作都
是在这个界面中进行的。   图3-52 管理控制台主界面3.5.1 使用管理控制台查看表中的记录   此外,还可以在视图中浏览
数据,但必须首先设置视图类型。当打开一个表时,在管理控制台主界面的左上角有四个按钮,它们与浏览数据的方式有关,如图3-53所示。
  这四个按钮全都处于按下状态(即按钮周围有边框线)后,界面右侧的区域被分成四个窗格(从上向下依次为第1、2、3、4方框),分别是
关系窗格(第1方框部分)、条件窗格(第2方框部分)、SQL窗格(第3方框部分)和结果窗格(第4方框部分),如图3-54所示。   
  图3-53 四个按钮   图3-54 同时显示四个窗格  想要列出参加“全国计算机二级考试”的信息并且按照成绩从高到低的
顺序排列,可按照以下步骤进行:   (1) 首先在条件窗格中用鼠标右击第一行(即“列”的值为的),然后选择“删除”,目的是先清除
默认选择的所有字段,如图3-55所示。   (2) 在关系窗格中勾选“StudentID”、“SubjectName”、“Degr
ee”和“Score”四个字段,这时条件窗格和SQL窗格中的变化已反映在关系窗格中,如图3-56所示。   图3-55 删除默认
选择的所有字段   图3-56 删除默认选择的所有字段  (3) 在条件窗格中将这四个字段的别名分别改为“学号”、“科目”、“等
级”和“成绩”,然后在Score行的“排序类型”中选择“降序”,在SubjectName行的“筛选器”中输入“全国计算机等级考试”
,在Degree行的“筛选器”中选择“二级”。在以上的设置过程中,SQL窗格中也会发生相应的变化,最后,单击工具栏上的“
”按钮,结果如图3-57所示。   经过以上过程我们可以体会到,即便没有写一句代码,通过使用管理控制台强大的功能,
也可以实现一些较复杂的查询。   图3-57 在窗格中可视化设置查询语句3.5.2 使用管理控制台修改表中的记录   在图3-
52所示的界面中,也可以进行数据的修改。操作方法很简单,只需用鼠标定位到相应的数据格,然后直接输入新的数据进行修改即可。   例如
,将StudentID为20020714的记录的成绩改为88,首先把鼠标移动到原来的83分的数据格并单击,便会出现输入光标并闪烁,
接着输入88。这时如果把鼠标移动到旁边的数据格并单击,88分的数据格就会出现红色的叹号,如图3-58所示,这是系统提示该记录还没有
被提交。   图3-58 更改数据  提交记录也很简单,只要把鼠标移动到其他记录处并单击,此时字段旁边的红色叹号将消失,说明数据
已经被提交到数据库中了。其他数据的更改与此类似,这里不再赘述。3.5.3 使用管理控制台删除表中的记录   在图3-52所示的界
面中,假设删除StudentID为20020714的记录,则执行以下步骤:   (1) 把鼠标移动到StudentID为20020
714记录的左边并单击右键,然后在弹出的菜单中选择“删除”,如图3-59所示。   (2) 弹出确认框询问是否真的要删除记录行,如
图3-60所示。   图3-59 删除记录   图3-60 删除确认框  (3) 单击“是”按钮,即完成了删除操作。但要注意,
所删除的记录是不能被恢复的,所以进行删除记录时一定要谨慎。      有时随着业务需求的改变,原有数据表的结构也需要相应地更改,
而完成这一功能的语句就是ALTER TABLE语句。   完整的ALTER TABLE语法很复杂,这里只给出它的常用部分,如下所示
:   ALTER TABLE <表名>   {3.6 修改表的架构  ALTER COLUMN <列名> <新的数据类
型> [ NULL | NOT NULL ]   ADD <列名> <数据类型> [ NULL | NOT NULL ]  
 DROP COLUMN <列名>   }   在这个语句中主要包含了三个子句,其中ALTER COLUMN子句用来修改现有字段的
类型,ADD子句用来增加一个字段,而DROP COLUMN用来删除一个字段,下面将举例说明它们的用法。  1.使用ALTER TA
BLE在表中增加一个字段   若要为现有的表增加字段,例如对于TestInformation表,想给它增加一个表示考试日期的字段“
DateOfTest”,这个字段的数据类型是“日期”型,具体代码见清单3-42,运行结果如图3-61所示。   图3-61 增加
一个字段  从结果中可以看到,“DateOfTest”字段被添加到最后,同时,对于所有的记录,它的数值全为NULL,这是由于没有设
置默认值的缘故。  2.使用ALTER TABLE在表中删除一个字段   删除表的某个字段时,以删除上一小节所增加的字段“Date
OfTest”为例,具体代码见清单3-43,运行结果如图3-62所示。   图3-62 删除一个字段  从图3-62可以看到,
字段“DateOfTest”已经被删除。需要注意的是,在删除字段的时候,如果要被删除的字段在某些记录中有数据,这些数据也将被删除,
所以要谨慎进行删除字段的操作。  3.使用ALTER TABLE在表中更改一个字段的数据类型   现在回顾一下TestInform
ation表的结构(参考图3-1),SubjectName字段的数据类型是char(20),也就是说SubjectName字段只能
存储最长20个字符,仅10个汉字。下面将这个字段的数据类型修改为可以存储50个字符,具体代码见清单3-44。   执行完以上代码
之后,可以验证TestInformation表的结构是否已经被修改。在对象资源管理器中展开节点“WestSVR”|“数据库”|“W
xdStudent”|”表”,右击节点“TestInformation”,在右键菜单中选择“修改”,如图3-63所示。   显示出
TestInformation表的结构时,可以看到SubjectName字段的数据类型已经被改为char(50),如图3-64所示
。   图3-63 打开表   图3-64 删除一个字段      前面所介绍的操作主要都是针对表进行的,而接下来要介绍的操作
是在数据库的级别上进行的,主要包括删除一个表和删除一个数据库。   1.使用DROP TABLE删除数据库中的一个表   删除一个
表的语句是DROP TABLE<表名>,如删除WxdStudent数据库中的表EnglishTest,具体代码见清单3-45。 3
.7 修改数据库的架构  执行以上代码后,EnglishTest表就从WxdStudent数据库中删除了,这时如果刷新管理控制台
的显示,那么就再看不到EnglishTest表了。  2.使用DROP DATABASE删除一个数据库   删除一个数据库的语句是
DROP DATABASE <数据库名>,假设删除SampleDB数据库,具体代码见清单3-46。   SampleDB
数据库删除前的截图如图3-65所示,删除后经刷新显示,截图如图3-66所示。      图3-65 删除
SampleDB数据库前 图3-66 删除SampleDB数据库后      数据库的完整性
是指确保数据库中数据的一致性和正确性,防止数据库中存在不符合语义的数据,以及防止输入错误的数据。数据完整性可以分为四种类型:   
● 实体完整性(Entity Integrity)   ● 域完整性(Field Integrity)   ● 引用完整性(Ref
erence Integrity)   ● 用户定义完整性(User-Defined Integrity)   本节主要介绍前三种
数据完整性,而对于用户定义完整性,有兴趣的读者可以查阅有关书籍。3.8 数据库的完整性3.8.1 数据库完整性简介   实体完
整性保证一个表中的每一行必须是唯一的(元组的唯一性)。为保证实体完整性,需指定一个表中的一列或一组列作为它的主键(Primary
Key)。   域完整性保证一个数据库不包含无意义的或不合理的值,即保证表的某一列的任何值都是该列域(即合法的数据集合)的成员,方
法是限制列的数据类型、精度、范围、格式和长度等。   引用完整性定义了一个关系数据库中不同的列和不同的表之间的关系(主键与外键)。
  用户定义完整性允许用户定义不属于其他任何一类完整性的特定规则,也可以说是一种强制数据定义。   可以有多种方法(规则、默认、
约束、触发器等)实现数据完整性,在这里主要介绍约束的使用方法。下面讲解几种约束的运用。3.8.2 实施主键约束   主键约束利用
表中的一列或多列数据来唯一地标识一个记录。在表中绝对不允许有主键相同的行存在,受主键约束的列决不能为NULL值,而且一个表只能有一
个主键。同时,在创建主键约束时系统会自动地创建一个唯一的聚簇索引。   通常主键约束被用来实现实体完整性,可以在CREATE T
ABLE或者ALTER TABLE语句中指定主键约束。例如,创建一个存放各门课程名称的Course表,同时指定字段CourseID
为主键,还插入了3条记录以便后面的例子引用,具体代码见清单3-47。   在上面的代码中CONSTRAINT PK_CourseI
D PRIMARY KEY(CourseID)从句就指定了主键约束的名称为“PK_CourseID”,而被指定为主键的字段为“Co
urseID”。执行完代码后,从管理控制台中打开Course表的结构,可以看到CourseID字段已经被指定为主键,如图3-67所
示。   除了在新建表的同时创建主键约束外,也可以对已经存在但还没有指定主键的表添加主键约束。下面的例子创建一个存放学生选修课成绩
的ElectiveCoursescore,但这个表在创建的时候并没有指定主键,可用ALTER TABLE语句添加上主键约束,具体代
码见清单3-48。   图3-67 用CREATE TABLE 命令创建主键约束   此时从管理控制台中打开Elec
tiveCourse表的结构,可以看到StudentID和CourseID字段都已经被指定为主键,如图3-68所示。   图3-
68 用ALTER TABLE 命令创建主键约束3.8.3 实施唯一约束   唯一(Unique)约束是用来确保不受主键约束
列上的数据的唯一性。   通常唯一约束被用来实现非主键的实体完整性,下例创建一个用来测试的表SampleTable,其中指定COL
1字段不能包含重复的值,创建完表之后插入两条记录,第一条记录成功插入,但第二条记录的COL1字段的值与第一条记录的COL1字段的值
相同(都是1),所以显示出了错误信息,具体代码见清单3-49,出错信息如图3-69所示。   若打开表SampleT
able来观察,则只能看到一条记录,如图3-70所示。   图3-69 出错信息   图3-70 观察表Sample Tab
le中的记录3.8.4 实施外键约束   外键(Foreign Key)约束主要用来维护两个表之间一致性的关系。外键的建立主要是
通过将一个表中的主键所在的列包含在另一个表中,这些列就是另外一个表的外键。当一行新的数据被加入到表格中,或者对表格中已经存在的“外
键”的数据进行修改时,新的数据或者为NULL或者必须存于主键表中。一般情况下,当主键所在表的数据被“外键表”所引用时,用户将无法对
主键里的数据进行修改或删除。  通常外键约束被用来实现引用完整性,可以在CREATE TABLE或者ALTER TABLE语句中
指定外键约束,在这里我们将ElectiveCourseScore中StudentID和CourseID字段都设置为外键,而对应的主
键表分别为student表和Course表,创建完表之后插入两条记录,第一条记录成功插入,但第二条记录的CourseID字段值“C
0000001”不是Course表CourseID列的值之一,所以显示出了错误信息,具体代码见清单3-50,出错信息如图3-71所
示。   图3-71 插入的记录违反了外键约束3.8.5 实施检查约束   检查(Check)约束通过检查输入表列的数据的值
来维护值域的完整性, 它在数据类型限制的基础上对输入的数据进一步进行限制,或者通过逻辑表达式来定义列的有效值。它就像一个门卫,依次
检查每一个要进入数据库的数据,只有符合条件的数据才允许进入数据库。例如在ElectiveCourseScore表中,Score字段
的值应该在0~100之间,可以通过给ElectiveCourseScore表添加检查约束来达到这个目的。首先为ElectiveCo
urseScore添加检查约束,然后再插入两条记录进行测试,第一条记录成功插入,但第二条记录的Score值为“-50”,违反了约束
条件,所以未能成功执行,并显示出了错误信息,具体代码见清单3-51,出错信息如图3-72所示。   约束的运用还有一些更
复杂和更高级的功能,必须通过大量的实践才能熟练掌握约束的运用技巧。   图3-72 插入的记录违反了检查约束      在本
小节的实验中,假设要在WxdStudent中创建学校2008年度任课老师的数据表Teachers2008以及课程表Course20
08,这两张表的各字段含义如下:3.9 上 机 实 验1.实验一:创建用于实验的数据表以及设置表的关系   1) 实验要求   
(1) 运用CREATE TABLE语句创建表。   (2) 运用INSERT语句向表中插入记录。   2) 实验目的   创建数
据表以及添加记录,为后面的实验做好准备。  3) 实验步骤   (1) 进入“Microsoft SQL Server Manag
ement Studio”界面。在对象资源管理器中展开节点“WestSVR”|“数据库”,单击选中数据库节点“WxdStudent
”,再单击工具栏按钮“ ”,在新打开的查询窗口中输入代码清单3-52
所示的代码(由于代码较长,不必手工输入全部代码,可以只输入关键部分,其余的从本书的配套资源中复制),然后再单击工具栏按钮“
”。     上述代码先创建Teachers2008表,这个表的主键为Teacher
ID,然后插入10条记录,接着又创建Course2008表,这个表的主键为CourseID,然后插入15条记录。   现在数据库中
已经存在上述的2张表,但是目前它们之间还没有关系,下面将Course2008表中的TeacherID设置为外键。  (2) 单击工
具栏按钮“ ”,在新打开的查询窗口中,输入代码清单3-53所示
的代码并运行,以创建外键约束。   (3) 创建外键约束之后,执行代码清单3-54所示的代码进行测试,可以看到图3-73所示的错误
信息,说明创建外键成功并且生效了。之所以出现错误信息,是因为所插入记录的TeacherID为18,而Teachers2008表中没
有TeacherID为18的记录。   图3-73 违反外键约束而出现错误提示  2.实验二:基本 SELECT查询   1)
实验要求   (1) 以Teachers2008表和Course2008表为例,练习SELECT语句的用法。   (2) 掌握W
HERE子句的运用。   2) 实验目的   能够运用SELECT语句进行简单的单表查询。  3) 实验步骤   进入“Micro
soft SQL Server Management Studio”界面。在对象资源管理器中展开节点“WestSVR”|“数据库”
,单击选中数据库节点“WxdStudent”,再单击工具栏按钮“
”,在所打开的查询窗口中完成以下任务:  (1) 查询所有男性(Sex字段为true)教师,并按出生日期降序排列。   在
代码窗口中输入代码清单3-55所示的代码并运行,运行结果如图3-74所示。   图3-74 查询结果  (2) 查询年龄为30
岁以上(含30岁)教师,并增加一列输出“年龄”。   在代码窗口中输入代码清单3-56所示的代码并运行,运行结果如图3-75所示。
  图3-75 查询结果  (3) 查询姓“李”的教师,并按性别升序排列。   在代码窗口中输入代码清单3-57所示的代码并
运行,运行结果如图3-76所示。   图3-76 查询结果  (4) 查询职称为“高级讲师”的女教师。   在代码窗口中输入代
码清单3-58所示的代码并运行,运行结果如图3-77所示。   图3-77 查询结果  (5) 查询不是在“课室”上课的课程。
  在代码窗口中输入代码清单3-59所示的代码并运行,运行结果如图3-78所示。   图3-78 查询结果  (6) 查询在
机房上课的课程。   在代码窗口中输入代码清单3-60所示的代码并运行,运行结果如图3-79所示。   图3-79 查询结果 
 在这里介绍一下CHARINDEX()函数的用法。   CHARINDEX()函数的作用是返回字符串中指定表达式的开始位置。如果返
回值搜索不到expression,则返回值为零,否则返回值为一个正数。具体语法为   CHARINDEX ( expression
1 ,expression2 [,start_ location])  各参数含义如下:   ● expression1:表达式,
其中包含要查找的字符的序列。expression1属于字符串数据   类别。   ● ?expression2:表达式,通常是一个
为指定序列搜索的列。expression2属于字符串数据类别。   ● start_location:开始在expression2
中搜索expression1时的字符位置。如果start_location未被指定、是一个负数或零,则将从expression2的
开头开始搜索。start_location可以是bigint类型。  (7) 查询所有课程,学分按照降序排列,学时按照升序排列。
  在代码窗口中输入代码清单3-61所示的代码并运行,运行结果如图3-80所示。   图3-80 查询结果  (8) 查询于2
007/2008年度第一学期开始的课程(提示:即开始时间为2007年9月的课程)。   在代码窗口中输入代码清单3-62所示的代码
并运行,运行结果如图3-81所示。   图3-81 查询结果  (9) 查询学分为2且学时为4的课程。   在代码窗口中输入代
码清单3-63所示的代码并运行,运行结果如图3-82所示。   图3-82 查询结果  3.实验三:运用聚合函数和GROUP
BY子句的SELECT查询   1) 实验要求   (1) 熟练掌握各个聚合函数的运用。   (2) 理解GROUP BY 子句的
作用。   2) 实验目的   能够运用聚合函数和GROUP BY子句进行SELECT查询。  3) 实验步骤   进入“Micr
osoft SQL Server Management Studio”界面。在对象资源管理器中展开节点“WestSVR”|“数据库
”,单击选中数据库节点“WxdStudent”,再单击工具栏按钮“
”,在所打开的查询窗口中完成以下任务:  (1) 查询所有教师的平均年龄。   在代码窗口中输入代码清单3-64
所示的代码并运行,运行结果如图3-83所示。   图3-83 查询所有教师的平均年龄  (2) 查询30岁以上教师的人数。  
 在代码窗口中输入代码清单3-65所示的代码并运行,运行结果如图3-84所示。   图3-84 查询30岁以上教师的人数  (
3) 查询“高级讲师”的人数。   在代码窗口中输入代码清单3-66所示的代码并运行,运行结果如图3-85所示。   图3-85
查询“高级讲师”的人数  (4) 查询“高级讲师”中的最大年龄和最小年龄。   在代码窗口中输入代码清单3-67所示的代码并运
行,运行结果如图3-86所示。   图3-86 查询“高级讲师”中的最大年龄和最小年龄  (5) 查询所有女老师的最大年龄。
  在代码窗口中输入代码清单3-68所示的代码并运行,运行结果如图3-87所示。   图3-87 查询所有女老师的最大年龄  
(6) 查询在“课室”上课的课程门数。   在代码窗口中输入代码清单3-69所示的代码并运行,运行结果如图3-88所示。   图
3-88 查询在“课室”上课的课程门数  (7) 查询在“机房”(包括第1、2、3机房)上课的课程门数。   在代码窗口中输入代
码清单3-70所示的代码并运行,运行结果如图3-89所示。   图3-89 查询在“机房”(包括第1、2、3机房)上课的课程门
数  (8) 查询于2007/2008年度第一学期开始所有课程的学时总数。   在代码窗口中输入代码清单3-71所示的代码并运行,
运行结果如图3-90所示。   图3-90 查询于2007/2008年度第一学期开始所有课程的学时总数  (9) 查询于200
7/2008年度第二学期开始且在“课室”上课的学分总数。   在代码窗口中输入代码清单3-72所示的代码并运行,运行结果如图3-9
1所示。   图3-91 查询于2007/2008年度第二学期开始且在“课室”上课的学分总数  (10) 分别列出“高级讲师”
、“讲师”和“助理讲师”的人数。   在代码窗口中输入代码清单3-73所示的代码并运行,运行结果如图3-92所示。   图3-9
2 列出“高级讲师”、“讲师”和“助理讲师”的人数  (11) 按照学分降序列出每种学分的课程门数。   在代码窗口中输入代码清
单3-74所示的代码并运行,运行结果如图3-93所示。   图3-93 按照学分降序列出每种学分的课程门数  (12) 分别列
出在不同地点上课的课程总学时数。   在代码窗口中输入代码清单3-75所示的代码并运行,运行结果如图3-94所示。   图3-9
4 列出在不同的地点上课的课程总学时数  (13) 分别列出“高级讲师”、“讲师”和“助理讲师”的平均年龄。   在代码窗口中输
入代码清单3-76所示的代码并运行,运行结果如图3-95所示。   图3-95 列出“高级讲师”、“讲师”和“助理讲师”的平均
年龄  (14) 分别列出男、女教师的人数和平均年龄。   在代码窗口中输入代码清单3-77所示的代码并运行,运行结果如图3-96
所示。   图3-96 列出男、女教师的人数和平均年龄  在这里简单介绍一下CASE函数,它的功能就是计算条件列表并返回多个可
能的结果表达式之一。   CASE函数的具体语法如下:   CASE WHEN <条件表达式>   THEN <条件表达式
为真时返回的值>   [ ELSE <条件表达式为假时返回的值> ]   END   从语法上很容易理解,CASE函数首先判断
<条件表达式>的值,如果为真,就返回THEN子句的值;如果为假,就返回ELSE子句的值。  4.实验四:联接表查询   1) 实验
要求   (1) 理解几种联接表的含义。   (2) 掌握联接表查询的语法。   2) 实验目的   能够对在内容上有关联的两个表
(或多个表)执行联接表查询。  3) 实验步骤   进入“Microsoft SQL Server Management Stud
io”界面。在对象资源管理器中展开节点“WestSVR”|“数据库”,单击选中数据库节点“WxdStudent”,再单击工具栏按钮
“ ”,在所打开的查询窗口中完成以下任务:  (1) 列出所有的课程名称
、授课教师和职称。   在代码窗口中输入代码清单3-78所示的代码并运行,运行结果如图3-97所示。   图3-97 列出课程
名称、授课教师和职称  (2) 列出每个教师的上课门数。   在代码窗口中输入代码清单3-79所示的代码并运行,运行结果如图3-9
8所示。   图3-98 列出每个教师的上课门数  (3) 列出每种职称的教师所上的课程总门数。   在代码窗口中输入代码清单
3-80所示的代码并运行,运行结果如图3-99所示。   图3-99 列出每种职称的教师所上的课程总门数   (4) 列出上2
门课以上的教师姓名。   在代码窗口中输入代码清单3-81所示的代码并运行,运行结果如图3-100所示。   图3-100 列
出上2门课以上的教师姓名  5.实验五:更改和删除查询   1) 实验要求   (1) 掌握UPDATE语句的使用。   (2)
掌握DELETE语句的使用。   2) 实验目的   能够运用UPDATE语句和DELETE语句对表进行更改和删除操作。  3)
实验步骤   进入“Microsoft SQL Server Management Studio”界面。在对象资源管理器中展开节点
“WestSVR”|“数据库”,单击选中数据库节点“WxdStudent”,再单击工具栏按钮“
”,在所打开的查询窗口中完成以下任务:   (1) 将课程名称“3DMax”改为“三维动画制作”。   在代码
窗口中输入代码清单3-82所示的代码并运行,运行结果如图3-101所示。   图3-101 将课程名称“3DMax”改为“三维动
画制作”  (2) 将“应用文写作”课程的学分改为4。   在代码窗口中输入代码清单3-83所示的代码并运行,运行结果如图3-10
2所示。   图3-102 将“应用文写作”课程的学分改为4  (3) 将所有由“陈浩强”老师上的课程改为由“张旭”老师上(提
示:陈浩强老师的TeacherID为3,张旭老师的TeacherID为5,只要在Course2008表中将TeacherID为3的
所有记录的TeacherID改为5即可)。   在代码窗口中输入代码清单3-84所示的代码并运行,运行结果如图3-103所示。
  图3-103 由“陈浩强”老师上的课程改为由“张旭”老师上  (4) 将“谭春霞”的职称改为“高级讲师”。   在代码窗口中
输入代码清单3-85所示的代码并运行,运行结果如图3-104所示。   图3-104 将“谭春霞”的职称改为“高级讲师”  (
5) 将“电子商务基础”的授课地点改为“第2机房”。   在代码窗口中输入代码清单3-86所示的代码并运行,运行结果如图3-105
所示。   图3-105 将“电子商务基础”的授课地点改为“第2机房”  (6) 将所有由“陈晓梅”上的课程从Course20
08表中删除(提示:陈晓梅老师的TeacherID为6,只要在Course2008表中将TeacherID为6的所有记录删除即可)
。   在代码窗口中输入代码清单3-87所示的代码并运行,相应的记录就会被删除。   (7) 将“计算机图像处理”课程从Cour
se2008表中删除。   在代码窗口中输入代码清单3-88所示的代码并运行,相应的记录就会被删除。      一、单项
选择题   1.插入记录的命令是下列哪一项?   A.INSERT B.SELECT C.UPDA
TE D.DELETE   2.表示逻辑或的运算符是下列哪一项?   A.NOT B.AND
C.OR D.IS习 题  3.判断一个表达式的值是否在一组值之中的运算符是下列哪一项?   A.BETWEEN B.IN C.LIKE D.EXISTS   4.判断一个表达式的值是否处于由两个值确定的一个范围之中的运算符是下列哪   一项?   A.BETWEEN B.IN C.LIKE D.EXISTS  5.代表任意多个字符的通配符是下列哪一项?    A. B.% C.& D.$   6.用于执行分组查询的子句是下列哪一项?   A.DISTINCT B.ORDER BY C.GROUP BY D.WHERE   7.用于求平均值的聚合函数是下列哪一项?   A.COUNT B.MAX C.AVG D.SUM   8.生成表查询必须用到以下哪一个子句?   A.HAVING B.INTO C.JOIN D.ON  9.删除表的命令是下列哪一项?    A.DELETE TABLE B.ALTER TABLE    C.REMOVE TABLE D.DROP TABLE   10.用来实施引用完整性的约束是下列哪一项?    A.PRIMARY KEY约束 B.UNIQUE约束    C.FOREIGN KEY约束 D.CHECK约束  二、填空题   1.在TestInformation表中,用SELECT语句选择数据,并要求用中文别名“学号”、“科目”和“成绩”表示各列数据,语句为________________________________________。   2.在TestInformation表中,列出所有的记录,并按照StudentID升序、Score降序排列的语句为_______________________________________。   3.在student表中,列出所有姓“李”的记录的语句为___________________________。   4.在student表中,列出所有已经退学(提示:利用IsLost字段)的记录的语句为______________________。  5.在TestInformation表中,列出85分以上的人数的语句为______________________。   6.在TestInformation表中,列出全国英语二级考试中的最高分的语句为_______________________________。   7.在student表中,列出各班人数的语句为____________________________________。   (提示:可以利用LEFT函数选择studentID字段的左6位字符作为班别的根据。)   8.在TestInformation表中,列出各科目考试各级别的最高分和最低分的语句为_________________。  9.在student表中,利用所有性别为“男”的记录来生成一个能够被永久地存放在数据库的表MaleStudent的语句为________________________________________。   10.利用student表和TestInformation表,列出所有考试不及格的考生的姓名、科目、级别和成绩四列数据的语句为____________________________________________。   11.在student表中,把学号为“20020714”的学生的家庭电话(HomePhone)改为“020-87592362”的语句为___________   12.在TestInformation表中,把所有考“一级”的记录删除,语句为______________。  三、简答题   1.在使用INSERT语句向表中插入记录时,遇到identity类型的字段时应如何处理?   2.GROUP BY子句的主要作用是什么?   3.简述所学过的聚合函数的功能。   4.简述几种类型的表联接查询的含义。   5.约束有哪几种?它们的主要作用分别是什么?
献花(0)
+1
(本文系大高老师首藏)