说明:若要删除已被其它表引用的记录,即有主、外键约束的记录时,会出现禁止删除的提示。如图5-18中,从系部表中删除“计算机系”的记录,但由于系部表与班级表之间存在着参照完整性关系,出现了冲突,所以无法删除。
图5-18 删除记录时与外键约束发生冲突
【例5-39】在学生成绩表XA05中,删除指定学年('2001-2002')、学期('1')与班级编码('100121')的学生成绩记录。
Delete From XA05
Where XA0502='3001231' And
XA0504='2004-2005' And XA0505='1'
【例5-40】在学生成绩表XA05中,删除“周明明”学生的所有成绩。 Delete From XA05
Where XA0501 In (Select XA0101
From XA01
Where XA0104='周明明')
5.4.2 使用Truncate语句清除表中全部数据
在SQL Server 2000提供了一种快速删除表中所有行的方法。它比不用WHERE子句的DELECT语句要快,因为DELETE 语句要记录删除的每个改变以用来备份。
语句格式:Truncate Table <数据表名>
【例5-41】 在学生成绩表XA05中清除所有记录。 Truncate Table XA05
说明:用Truncate语句清除数据表内容时,系统不进行日志记录,所以在进行清除数据表内容前,先应对数据库进行备份,防止由于错误操作引起数据的丢失。
5.5 数据修改语句
修改语句用于更新数据表中满足条件记录的字段值,语句格式如下: Update <数据表名 | 视图名>
- 171 -
Set <字段名1>=<表达式值1> [, <字段名2>=<表达式值2>, …<字段名n>=<表达式值n>] Where <条件表达式>
该语句执行时,先在数据表或视图找到满足条件记录,然后将表达式值赋给字段。 【例5-42】从系部编码表TB06中,将“计算机系”改为“信息工程系”。 Update TB06
Set TB0602='信息工程系' Where TB0602='计算机系'
说明:若不加Where 条件,则对表中所有记录进行替换操作。
【例5-43】在学生成绩表XA05中,将指定学年('2001-2002')、学期('1')、学生编码('0000000404')与课程名('JAVA程序设计')的学生成绩改为90分。
Update XA05 Set XA0509='90' Where XA0501='0000000404' And
XA0504='2004-2005' And XA0505='1' And
XA0506=(Select TB0101 From TB01 Where TB0103= ' JAVA程序设计')
【例5-44】用学生档案表XA01统计出的学生人数,更新班级编码表TB03中的学生人数字段TB0306。
Update TB03 Set TB0306=(Select Count(XA0101) From XA01 Where XA0114= TB0301)
该语句执行过程为,从班级编码表TB03的第1条记录开始,先取出该记录的班级编码TB0301,然后执行相关子查询语句:
Select Count(XA0101) From XA01 Where XA0114= TB0301
子查询语句从学生档案表XA01中统计出由TB0301指定班级的学生人数,结果返回给父查询,父查询将结果值赋给班级人数TB0306字段。然后父查询再从班级编码表TB03中取第2条记录的班级编码TB0301,按上述步骤依次计算每班学生人数,并赋给TB0306,直到最后1 条记录为止。
本章小结
1.Select查询语句
Select语句可完成对数据表的投影、选择、连接、排序、统计汇总等运算。一般格式为: Select Distinct <目标表达式> (投影运算)
From <表1>
<连接方式> Join <表2> On 表1.列名=表2.列名 … … …
- 172 -
<连接方式> Join <表n> On 表1.列名=表n.列名
Where <条件表达式> (选择运算) Order By <表达式> [Asc | Desc] (排序运算) Group By <分组字段> Having <条件表达式> (分组运算)
在语句中,Select子句为投影运算,子句的目标表达式有4种表达方式,如图5-19(a)所示;From子句中的连接方式有7种表达方式,如图5-19(b)所示;Where子句为选择运算,子句中的条件表达式有6种表达方式,如图5-19(c)所示,在Where 子句中还允许进行嵌套子查询与相关子查询;Oder By子句完成排序运算;Group By子句完成分组统计运算。
列名 As 别名 * 目标表达式 表达式 As 别名 统计函数 As 别名 统计函数为:Sum、Avg、Max、 Min、Count (a)目标表达式的4种表达方式 内连接 :Inner
左外连接:Left 右外连接:Right 连接方式 全外连接:Full 自连接 :A.列=B.列 交叉连接:Cross (b)连接方式的7种表达方式 关系查询:>、>=、=、<、<=、<> 逻辑查询:And、Or、 Not 范围查询:Between 下界 and 上界 集合查询:In (集合元素表) 条件表达式 空值查询:Is Null 或 Is Not Null 模糊查询:Like ‘d字符串d’ ,其中通配符d=%、_等 (c)条件表达式的6种表达方式 图5-19目标表达式、连接方式、条件表达式的表达方式
2.嵌套子查询语句
Select <目标表达式>
From <表名> Where <字段表达式> <运算符> (
嵌套子查询的运算符、使用条件与返回结果如表5-7所示。
表5-7 嵌套子查询的类型、运算符、使用条件与返回结果
子查询类型 关系子查询 IN子查询 Any子查询 All 子查询 <运算符> >、>=、=、<、<=、<> IN <关系运算符>Any <关系运算符>All 使用条件 单值 多值 多值 多值 返回结果 满足关系表达式的记录集 满足集合运算的记录集 满足子查询某一条件的记录 满足子查询所有条件的记录 3.相关子查询 相关子查询的查询条件依赖于外部父查询的某个属性值,一般查询过程如下:首先取外部查询中的第一个记录,根据它与子查询相关的属性值处理内层查询;若Where子句返回值为真(即子查询结果非空),则取此记录放入结果表;然后再检查外部表的下一个记录;重复这一过程,直至外部表全部检查完毕为止。Exists子查询是相关子查询的典型应用。
- 173 -
4.视图
视图是由一个或多个数据基表导出的二维虚表,其数据来源于多个基表。语句格式为: Create View [数据库拥有者.]<视图名> [(列名1,…,列名n)] [With Encryption] As Select 语句 5.数据操作语句 (1)Insert 语句
语句格式1:Insert Into <数据表名> [字段名表] Values (字段值) 语句格式2:Insert Into <数据表名> [字段名表] Select 子句 (2)Delete语句
Delete From <数据表名> Where <条件表达式> (3)Update语句
Update <数据表名> Set <字段名>=<表达式值> Where <条件表达式>
习题5
5.1 Select数据查询语句由哪些子句组成,分别对应于关系代数中的哪些运算?
5.2 Select语句中连接查询可为哪几类查询?嵌套子查询又可分为哪几类查询?叙述相关子查询的查询过程。
5.3 简述视图的定义,视图是数据库三级体系中的哪一级?为什么要将视图称为虚表? 5.4 编写Select语句,查询tblStudent表中的Stud_Id、Stud_Name和Stud_Sex列。 5.5 编写Select语句,从tblDepart表中查询出系部编号为“30”的专业信息。
5.6 编写Select语句,从tblStudent表中查询出籍贯为‘南京’、‘无锡’或‘苏州’的学生学号(Stud_Id)、学生姓名(Stud_Name)和学生性别(Stud_Sex)信息。
5.7编写Select语句,显示tblCourse表中的所有课程编号(Course_Id)、课程名称(Course_Name)、课时数(Hours)及学分数(课时数/16),使用别名“Course_Num”标识被计算列。查询结果按课时数由高到低排列。
5.8 编写Select语句,查询出所有尚未定课时的课程信息。
5.9 编写Select语句,查询出tblCourse表中的所有编号(Course_Id)中前两个字符为“30”的课程信息,显示这些课程的名称和课时。
5.10 编写Select语句,查询1983年上半年前(1月1日到6月30日)出生,在校时间在2到3年之间的学生信息(包括学号、姓名、班级)。
5.11 编写Select语句,统计出tblScore表中每一个学生所得学分(Test_Num)的总和。 5.12 编写Select语句,查询tblScore表中所得学分低于20的学生学号。 5.13 编写Select语句,显示每个学生的学号、姓名、班级名和专业名。
- 174 -
5.14 实现外连接,编写Select语句,查询出班级号为“3031001”的每个学生的选课情况(包含学生学号、姓名、课程号、成绩)。如果学生没有选课,则课程号和成绩列用空值填充。
5.15 表的自连接,编写Select语句,在tblstudent表中查询同姓的学生。
5.16 嵌套子查询,编写Select语句,查询tblCourse表中课时数大于所有课程平均课时数的课程信息。
5.17 相关子查询,编写Select语句,查询课程考试成绩低于该同学平均考试成绩的课程记录。
5.18 向表中添加行,编写一条Insert语句,在tblDepart表中添加一行,不指出列名,并使用以下值:
DptMj_Id
DptMj_Name
UpperId
Describe
--------------------------------------------------------------------------------------------------------------------
34 软件技术 30 计算机系
5.19 编写Insert语句,在tblCourse表中添加一行,只提供课程的编号和名称,数据如下: Course_Id Course_Name 30012 Delphi程序设计
5.20 编写Update语句,将tblClass表中在校年份超过学制年份(Length)的毕业标志字段(Flag)更新为1。
5.21 编写Select语句,删除tblStudent表中已经毕业的学生的记录。(提示:已经毕业学生所在班级毕业标志为1)
5.22 Group By子句的作用是什么?Having子句与Where子句中的条件有什么不同? 5.23 有几种连接表的方法?它们之间有什么区别? 5.24 简述嵌套子查询和相关子查询的区别。
5.25 删除一个表中所有行的两种方法是什么?哪种方法更好些? 说明:以上习题均使用附录B中的数据表。
实验题5
5.1 在班级编码表TB03中,查询计算机系所属班级的班级名称、班级编码、专业名称、在校标志与系部名称。用等值连接查询方式。
5.2 用内连接方式查询学生档案表XA01中计算机系姓王男生的信息(系名、班级名、学号、姓名、性别、民族、籍贯、政治面貌、身份证号、家庭地址、邮政编码)。
5.3 在学生成绩表XA05中,查询指定学年(‘2000-2001’)、学期(‘1’)、班级编码(‘1000221 ’)与课程编码(‘1001’)的成绩信息(学年、学期、班级名、学号、姓名、课程名、考核标志、成绩)。
5.4 职工档案表JA01的表结构如表5-4所示,表内容如表5-5所示。
- 175 -