1、第4章T-SQL与可编程对象,SQL语言是结构化查询语言(Structure Query Language)的简称,它是一个通用的、功能强大的关系数据库操作语言,最初由IBM公司在20世纪70年代中期开发成功。并被国际标准化组织采纳为关系数据库语言的国际标准。 Transact-SQL( 简称T-SQL)是SQL Server中支持的扩展SQL语言,它提供了数据定义、数据操纵、数据控制等语句,支持对数据库的操纵和管理,是开发数据库应用程序的基本语言。 SQL Server支持采用T-SQL语言定义服务器端应用程序,这些应用程序被统称为可编程对象。,4.1.1 T-SQL概述,1. T-SQL语
2、言的特点 1)非过程化 :使用T-SQL时,不必描述解决问题的全过程,只需提出“做什么”,至于“如何做”的细节则由语言系统本身去完成并给出操作的结果。 2)两种不同的使用方式:两种方式下,T-SQL语言的语法结构基本相同。 联机交互方式:SQL语言可独立使用 嵌入程序设计语言中:例如嵌入C#、VB.net中。 3) 高度一体化:集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和T-SQL增加的语言元素于一体,可独立完成数据库生命周期的所有活动。 4) 语言简洁、易学易用。,面向过程的程序设计语言,必须一步 一步地将解题的全过程描述出来,不 仅要告诉计算机“做什么”,而且
3、还 要告诉计算机“怎么做”。,2.T-SQL语言的组成元素 DDL(Data Definition Language) 数据库定义语言,用于定义或修改数据库。包括Create、Alter、Drop等语句。 例如:Create DATABASE Student DML(Data Manipulation Language) 数据库操纵语言,实现对数据库基本操作,包括Selete、Insert 、Update、Delete等语句。 DCL(Data Control Language) 数据库控制语言,实现对数据对象的授权、数据完整性规则描述及控制事务等,包括Grant、Revoke、Deny等语句
4、。 T-SQL增加的语言元素 变量、运算符、函数、流程控制语句和注解等。,3T-SQL语言书写规则,在T-SQL语句中,不区分字母大小写,即大小写字母的意义完全相同。, 一条语句可以写在一行,也可以写在若干行上。,在本讲义中: 为了阅读方便,用大写字母书写SQL语句的关键词,用小写字母书写标识符、表达式及各种参数; 为了体现语法结构,一条语句写在多行上。,例如: SELECT * FROM Student,4注释 为了增强程序代码的可读性,可在适当的地方加上注释。 T-SQL有两种注释方法: 单行注释(-)。语法格式如下: - 注释文本内容 多行注释(/* */)。语法格式如下: /* 注释文
5、本内容*/ 例如: USE School /*打开School数据库。当第一次访问某数据库时,需要使用USE语句打开数据库,否则其他访问该数据库的SQL语句不能执行*/ SELECT * FROM Student -查询显示学生表中所有学生的信息,数据定义语言主要是定义数据库中的对象,包括数据库、数据表、视图、索引、存储过程、触发器等的建立或修改。常用语句如下:,4.1.2 数据定义语言DDL,1DDL概述,如果想查看或保存已存在的数据库对象的DDL语句,可在SQL Server Management Studio中自动生成各种数据库对象的SQL脚本 ,也可将其保存到一个扩展名为.sql的文件
6、中 ,在查询编辑器中可打开.sql文件,执行SQL脚本,重建相应的数据库 。,提示:使用SQL定义脚本重建的数据库不包括表中数据。,2自动生成数据库定义的SQL脚本,前面已经学习过使用SQL Server Management Studio创建各种数据库对象,实质上手工创建的过程就是在构建DDL语句。,SQL脚本的生成方法如下:, 右击要生成SQL脚本的数据库或数据表,选“编写数据库(或表)脚本为/Create到/新查询编辑窗口”。, 在“查询编辑”窗口可查看和复制SQL脚本。选择“文件/保存”或“文件/另存为”菜单可将这些SQL脚本保存到一个扩展名为“.sql”的文本文件。, 使用“文件/打
7、开”菜单可打开脚本文件。执行可创建新的表。,(1)创建数据库,【例4.1】创建一个名为SchoolTest的数据库。,3几个常用DDL语句,CREATE DATABASE 数据库名 ON NAME=逻辑文件名, FILENAME=物理文件名,答案1 : CREATE DATABASE SchoolTest -数据库名,提示: 表示可选项,以系统数据库model作为模板在SQL Server安装文件夹的Data文件夹下(一般为C:Program FileMicrosoft SQL ServerMSSQLData)建立数据库文件SchoolTest.mdf(大小为3MB)和日志文件SchoolTe
8、st_log.LDF(大小为1MB)。,答案2 : CREATE DATABASE SchoolTest -数据库名 ON (NAME=SchoolTest, -主数据文件逻辑名 FILENAME=D: SchoolTest.MDF) -主数据文件物理名,创建了一个数据库SchoolTest,其主数据文件为大小为3MB的D:SchoolTest.mdf“ ;并且自动创建一个大小为1MB的“D:SchoolTest_log.LDF”作为日志文件。,(2)打开和删除数据库语句,打开数据库: USE 数据库名 -其中数据库名是要打开作为当前数据库的数据库例如:USE School -打开数据库Sch
9、ool,当用户登录到SQL Server后,系统指定系统数据库master作为默认当前数据库。所谓当前数据库是指当前可以操作的数据库。,删除数据库: DROP DATABASE 数据库名 例如: DROP DATABASE SchoolTest -删除SchoolTest,注意删除数据库时不允许该数据库有对象处于打开状态。,(3)建立数据表语句,CREATE TABLE数据表名 (列名 列数据类型 列约束Constraint 约束说明 ),【例4.2】在数据库“SchoolTest”中建立学生表StudentTest。,CREATE TABLE StudentTest(StudentCode
10、CHAR(8) NOT NULL UNIQUE, /*不允许空,取值唯一*/ StudentName VARCHAR(16) NOT NULL, Sex CHAR(2) NOT NULL, LiveInDorm BIT DEFAULT 1, /*默认值为1*/ Constraint StudentPK Primary Key(StudentCode),/* StudentCode主键*/ Constraint SexCheck Check(Sex=男 or Sex=女) /* Sex检查约束*/ ),【例4.3】删除StudentTest表。,(4)删除表语句,当数据表不再需要时,可以使用DR
11、OP TABLE语句将其删除。,DROP TABLE 数据表名,DROP TABLE StudentTest,(5)建立索引语句,【例4.4】在StudentTest表的姓名(StudentName)和生日(Birthday)字段上建立唯一索引NameIndex, 姓名按升序排列,姓名相同时,按生日降序排列。,(6)删除索引语句,CREATE INDEX 索引名 ON 数据表名(字段 ASC|DESC) -默认为索引顺序为ASC。,DROP INDEX 数据表名.索引名,【例4.5】删除StudentTest表中名称为NameIndex的索引。,CREATE UNIQUE INDEX Name
12、Index onStudentTest (StudentName, Birthday DESC),DROP INDEX StudentTest.NameIndex,4.1.3数据操纵语言DML,SELECT 语句:从一个表或多个表查询数据 INSERT语句:向一个表中添加一条记录 UPDATE语句:修改表中某一个或几个字段的值 DELETE语句:从一个表中删除记录,DML语句实现对数据的查询和更新,主要语句及功能如下:,1查询语句SELECT,又称为选择查询语句,用于从数据库的一个或多个表中检索满足一定条件的记录集,并按一定顺序显示指定的字段内容。,SELECT 字段表 FROM 表名 WHE
13、RE 查询条件 GROUP BY 分组字段 HAVING 分组条件 ORDER BY 字段名 ASC/DESC , 表示可选项。 第2行至最后一行称作SQL子句,不同的子句完成不同的功能。 在书写SELECT语句时,字母大小写意义完全相同。 语句可以写在若干行上(如上述语法格式中的描述),也可以不换行。,字段表位于关键字SELECT后面,这些字段将作为查询的结果被显示。,可选任意多个字段,字段与字段之间用逗号分隔。,【例4.6】查询Student表中的所有学生的姓名和性别。,(1) 字段表,SELECT StudentName, Sex FROM Student,可以使用通配符“*”表示表中的
14、所有字段。,【例4.7】查询Student表中所有学生的全部字段信息。,SELECT * FROM Student, 若字段名或表名中含有空格,则该字段名或表名必须用方括号括起来 。,在字段表中,可以使用如下方式将原字段名以字段别名显示: 字段名 AS 字段别名,【例4.8】查询Class表中班号和班名班号别名为Class Number 。,提示: “Class Number”含空格,要写为Class Number,SELECT ClassCode AS Class Number, ClassName FROM Class,SELECT ClassCode AS 班级编号, ClassName
15、 AS 班级名称 FROM Class,在字段名前可以加上一些关键字,以便进一步优化查询结果。常用的关键字有:,DISTINCT:若多条记录的字段值具有相同数据,只显示一条记录。,【例4.11】显示Course表中开课的学院名称Academy(与所开课程无关)。,SELECT DISTINCT Academy FROM Course,由于每个学院都开设了多门课程,因此多条记录在字段Academy具有部分相同的值。,增加Distinct限制后,查询结果中相同的值只显示一次。,TOP n |m PERCENT:查询前n条记录或前m%的记录。,【例4.9】查询Course表中的前3条记录。,【例4.
16、10】查询Course表中前20%的记录,显示课程号和课程名称。,SELECT TOP 3 * FROM Course,SELECT TOP 20 PERCENT CourseCode, CourseName FROM Course, 新增字段查询。查询的字段可以是表中字段名,也可以是常量和表达式,表达式中可以使用内部聚合函数进行统计计算。,常用函数表,【例4.12】 查询Grade表,显示学号、所选课程号及加2分调整后的成绩(Grade),并显示一列说明 “情况属实”。,【例4.13】查询Grade表,统计所有学生的分数总和、平均分、最高分、最低分及总选课人次。,SELECT Student
17、Code, CourseCode, Grade+2 AS 成绩, 情况属实 AS 说明 FROM Grade,SELECT Sum (Grade) AS 总分, Avg(Grade) AS 平均分, Max (Grade) AS 最高分, Min(Grade) AS 最低分, Count(StudentCode) AS 总人次 FROM Grade,【例4.14】将Student表中所有记录的学生姓名、出生日期复制到一张新表NewTable。, 使用查询创建新表。在字段名后加上“INTO 表名”可将查询结果复制到一张新表中。,StudentName, BirthDay INTO NewTabl
18、e FROM Student,提示:语句运行后,数据库School中产生一张表名为NewTable的新表。刷新数据库,即可查看到。,(2)FROM子句,FROM子句是SELECT语句必不可少的一个子句,指定要查询的数据来自哪个或哪些表或视图。,FROM 表名1 ,表名2,表名n,【例4.15】查询Student表和Grade表,显示学生的选课和成绩情况。,SELECT Grade.StudentCode, StudentName, CourseCode, Grade FROM Student, Grade WHERE Grade.StudentCode=Student.Studentcode,
19、SELECT StudentCode, StudentName, CourseCode, Grade FROM Student, Grade (),注意:表的排列顺序不影响执行结果;如果FROM子句中包含多个表名,且不同的表中具有相同的字段,那么SELECT子句的字段名必须表示成“表名.字段名”。,(3)WHERE子句,WHERE子句说明查询条件,它是一个可选的子句。它必须紧跟在FROM子句的后面。,WHERE 查询条件,T-SQL中常用的关系和逻辑运算,其中,查询条件是一个关系或逻辑表达式。, 比较和逻辑运算,【例4.16】查询Student表中所有女学生的姓名。,【例4.17】查询未住校的
20、女学生的情况。,SELECT StudentCode,StudentName, LiveInDorm FROM Student WHERE LiveInDorm=0 AND Sex=女,SELECT StudentName FROM Student WHERE Sex=女, BETWEENAND运算,BETWEEN 值1 AND 值2,NOT BETWEEN 值1 AND 值2,【例4.18】在Grade表中查询选修课程号为“101”、成绩在70分到90分之间的所有学生,显示其学号及成绩。,查询某字段的值在指定范围内的数据记录(结果包括值1和值2)。,查询不在指定范围中的数据记录。,SELEC
21、T StudentCode, CourseCode, Grade FROM Grade WHERE CourseCode= 101 AND Grade BETWEEN 70 AND 90,此例的WHERE子句也可以改为: WHERE CourseCode=101 AND Grade= 70 AND Grade=90,【例4.19】查询Student表中不在1990年到1994年中出生的学生的学号和姓名。,SELECT StudentCode, StudentName, Birthday FROM Student WHERE Birthday NOT BETWEEN 1990-01-01 AND
22、 1994-12-30,在WHERE子句中可 使用Year()函数: SELECT StudentCode, StudentName, Birthday FROM Student WHERE Year(Birthday) NOT BETWEEN 1990 AND 1994,确定在集合中的IN运算:查询某字段值在或不在某集合的数据记录,【例4.20】查询Student表中班号为“11”、“21”、“31”的学生。,SELECT StudentCode, StudentName, Sex, ClassCode FROM Student WHERE Classcode IN (11,21,31),此
23、例的WHERE子句也可以改为: WHERE ClassCode=11 OR ClassCode=21 OR ClassCode=31,字符串模式匹配的LIKE运算:确定某字符字段的子串值是否符合指定的模式,可查询满足字符串匹配的数据记录。,例如: 姓“王”的名字: 王%; 第2个字是“小”的姓名: _小% 姓“张”的单名: 张_,【例4.21】查询Course表中课程名称中包含“化学”两个字的课程号及课程名称。,【例4.22】查询Student表中不姓“王”的学生 。,SELECT CourseCode,CourseName FROM Course WHERE CourseName LIKE
24、%化学%,SELECT StudentCode, StudentName FROM Student WHERE StudentName LIKE 王%,【例4.30】统计每门课程的选课人数和平均分。,(4) GROUP BY子句 :用于对数据记录进行分类汇总,即按指定字段把具有相同值的记录通过汇总计算合并成一条记录。,GROUP BY 分组 HAVING 分组条件 ,HAVING子句:与WHERE子句作用类似,在使用GROUP BY完成分组后,显示满足HAVING子句中分组条件的所有记录。,SELECT CourseCode, Count(StudentCode) AS 选课人数, STR(A
25、VG(Grade),5,2) AS 平均分 FROM Grade GROUP BY CourseCode,如只查询平均分大于等于80的记录,则在语句后增加:HAVING avg(Grade)=80,如果GROUP BY后的分组字段有多个,则表示多次分组。,【例4.31】统计各学院男、女教师的人数。,SELECT Academy, Sex, Count(TeacherCode) AS 教师人数 FROM Teacher GROUP BY Sex, Academy,注意:使用GROUP BY子句时,在SELECT后的字段必须出现在分组字段中(除非该字段包含在聚合函数中),否则不允许分组。,SELE
26、CT Academy, Count(TeacherCode) AS 教师人数 FROM Teacher GROUP BY Sex,出错信息:,【例4.32】按成绩升序显示Grade表中的所有数据。,(5) ORDER BY子句:按指定字段为查询结果排序。通常是 SQL 语句最后一项。,ORDER BY 字段名 ASC/DESC,其中:ASC为升序排序,DESC为降序排序。缺省排列次序为升序。,ASC: Ascending,DESC:Descending,SELECT * FROM Grade ORDER BY Grade,可以指定多个排序的字段。规则:首先用指定的第一个字段对记录排序,然后对此
27、字段中具有相同值的记录用第二个字段进行排序,依此类推。,若在SELECT语句中无此子句,则按原数据表的次序显示数据。,【例4.33 】按性别升序(若性别相同,则按出生日期降序)显示学生姓名、性别及出生日期。,SELECT StudentName ,Sex,Birthday FROM Student ORDER BY Sex, Birthday DESC,Sex 默认为ASC,(6). 联接查询 :涉及多表的查询称为联接查询,可以用两种方法实现。,在FROM子句中指出需查询的表,在WHERE子句中说明两个表相关联字段的联接条件 。,【例4.24】查询优异生的情况。要求显示学生姓名、所在班级、认定
28、时间、学分积点。,SELECT StudentName, ClassName, GrantTime, GPA FROM ExcellentStudent, Student, Class WHERE ExcellentStudent.StudentCode=Student.StudentCodeAND Student.ClassCode=Class.ClassCode,注意:指明Student表 和ExcellentStudent表中StudentCode字段值相同的记录相联接。若在查询时无此条件,查询结果错误。,注意:Student表和Grade表都有StudentCode字段,所以要在Sel
29、ect后的该字段名前指明其中一个表名Student.StudentCode 。,【例4.23】查询未住校学生的选课及成绩的情况。(显示学号、姓名、课程号以及是否住校),SELECT Student.StudentCode, StudentName, CourseCode, Grade, LiveinDorm FROM Grade, Student WHERE Grade.StudentCode=Student.StudentCode AND LiveInDorm=0,使用联接关键字JOIN ON说明两个表及相关联字段的联接条件。,FROM 表1 联接关键字 表2 ON 表1.字段名1 表2.字
30、段名2,其中: 表1、表2是被联接的表名; 字段名是被联接的字段。必须有相同的数据类型并包含同类数据,但不需要有相同的名称。 比较运算符:=、=、 常用联接关键字:INNER JOIN (内联接)、LEFT OUTER JOIN(左外联接)、RIGHT OUTER JOIN(右外联接),INNER JOIN(内联接):查询结果仅包含两个表中每对联接匹配的行。内联接是系统默认的,可以将关键词INNER省略。,【例4.25】使用内联接查询未住校学生的选课及成绩情况。,SELECT Student.StudentCode, StudentName, CourseCode, Grade, Livein
31、Dorm FROM Student INNER JOIN Grade ON Student.StudentCode = Grade.StudentCode WHERE LiveInDorm=0,本句的查询结果与例4.23完全相同,但语句中表的联接关系表达更为清晰,WHERE子句只有一个条件“LiveInDorm=0”。,LEFT OUTER JOIN(左外联接):结果除了包含两张表中符合联接条件的记录,还包含左表(写在关键字LEFT OUTER JOIN左边的表)中不符合联接条件、但符合WHERE条件的全部记录。可以将关键字OUTER省略。,【例4.26】使用左外联接查询未住校学生的选课及成绩
32、情况。,SELECT Student.StudentCode, StudentName, CourseCode, Grade, LiveInDorm FROM Student LEFT JOIN Grade ON Student.StudentCode = Grade.StudentCode WHERE LiveInDorm=0,有2条记录的CourseCode和Grade字段值为NULL。这2条记录是左表(Student)中未住校学生的信息,但在Grade表中没有其相关选课记录。,RIGHT OUTER JOIN(右外联接):结果除了包含两张表中符合联接条件的记录,还包含右表(写在关键字RI
33、GHTT OUTER JOIN右边的表)中不符合联接条件、但符合WHERE条件的全部记录。可以将关键字OUTER省略。,【例4.27】使用右外联接查询未住校学生的选课及成绩情况。,SELECT Student.StudentCode, StudentName, CourseCode, Grade, LiveInDorm FROM Grade RIGHT JOIN Student ON Student.StudentCode = Grade.StudentCode WHERE LiveInDorm=0,结果与例4.25内联接完全相同。由于在表设计时,在表Student和Grade之间通过外键建立
34、了参照完整性约束,表Grade中的所有StudentCode必须是Student中出现的值。, 多表联接嵌套:如果查询所涉及的数据表在3个以上,形成联接嵌套 。,1)使用WHERE子句设置查询条件,例如,查询学生所选课程成绩,显示学生姓名、课程名称,成绩。涉及Student 、Grade 、Course 三张表。,SELECT StudentName, CourseName , Grade FROM Student, Grade , Course WHERE Student.StudentCode = Grade.StudentCode AND Grade.CourseCode = Cours
35、e.CourseCode,2)使用联接关键字的语句,FROM 表1 JOIN表2 ON 表1.字段i 表2.字段j JOIN 表3 ON 表2.字段k 表3.字段l JOIN表n ON 表y.字段m 表n.字段n x=2, y=n-1,SELECT StudentName, CourseName, Grade FROM Student JOIN Grade ON Student.StudentCode =Grade.StudentCode JOIN Course ON Grade.CourseCode = Course.CourseCode,或者写为如下格式: FROM 表1 JOIN表2 J
36、OIN 表3 JOIN表n ON 表n.字段i 表n-1字段j ON 表x.字段k 表n-2.字段l ON 表y.字段m 表1.字段n x=n-1, y=2,SELECT StudentName, CourseName, Grade FROM Student JOIN Grade JOIN Course ON Grade.CourseCode = Course.CourseCode ON Student.StudentCode =Grade.StudentCode,【例4.28】用嵌套联结实现例4.24查询优异生的情况。,SELECT StudentName, ClassName, Grant
37、Time, GPA FROM ExcellentStudent JOIN Student ON ExcellentStudent.StudentCode=Student.StudentCode JOIN Class ON Student.ClassCode=Class.ClassCode,结果与例4.24使用Where子句说明联接条件的结果完全相同。,【例4.29】查询班号是“61”的学生姓名、班号、所选课程名称和成绩。该查询需要用到3张表Student、Course和Grade。,SELECT StudentName, ClassCode, CourseName, Grade FROM St
38、udent JOIN Grade JOIN Course ON Grade.CourseCode = Course.CourseCode ON Student.StudentCode = Grade.StudentCode WHERE ClassCode=61,【例4.34】查询“林豆豆”同班同学的学号、姓名。,(7).子查询 : 当一个查询的结果是另一个查询的条件时,称该查询为子查询。也被称为嵌套查询。,SELECT StudentCode, StudentName, ClassCode FROM Student WHERE ClassCode=(SELECT ClassCode FROM
39、Student WHERE StudentName=林豆豆),IN子查询:用来判断一个给定值是否在子查询的结果集中。,【例4.35】查询选修了课程代码为“101”的学生的学号、姓名和班号。,如果子查询结果返回多值则子查询要与下面介绍的IN、EXIST等结合使用。,SELECT StudentCode,StudentName, ClassCode FROM Student WHERE StudentCode IN(SELECT StudentCode FROM GradeWHERE CourseCode=101),提示:在执行过程中,子查询得到选修课程“101”的所有学生学号返回给主查询,主查询
40、再查询这些学生的学号、姓名和班号。,该查询也可以利用联接查询完成:,SELECT Student.StudentCode,StudentName,ClassCode FROM Student INNER JOIN Grade ON Student.StudentCode=Grade.StudentCode WHERE CourseCode= 101,提示:多数情况下,包含子查询的语句可以用联接表示。但子查询与联接相比,有一个显著的优点,就是子查询可以计算一个变化的聚集函数值,并返回到主查询进行比较,而联接做不到。,【例4.36】查询年龄最大的学生的学号和姓名。,SELECT StudentCo
41、de, StudentName, Birthday FROM Student WHERE Birthday IN(SELECT MIN(Birthday) FROM Student),提示:子查询获取Student表中最小的出生日期即年龄最大学生的出生日期,主查询再查询这一日期出生的学生的学号、姓名和出生日期。,EXISTS子查询 :用于判断一个子查询的结果集是否为非空,如果非空则返回TRUE,否则返回FALSE。NOT EXISTS的返回值与EXISTS相反 。,【例4.35】用EXISTS子查询实现:查询选修了课程代码为“101”的学生的学号、姓名和班级代号。,SELECT Student
42、Code, StudentName, ClassCode FROM Student WHERE EXISTS(SELECT * FROM Grade WHERE Student.StudentCode=Grade.StudentCodeAND Grade.CourseCode=101),提示:本查询的执行过程是:首先查找主查询中Student表的第一行,将该行的学号提供给子查询,然后子查询执行,若结果集不为空,则把该行的StudentCode,StudentName,ClassCode作为结果集的第一行输出;然后再找Student表中的第2、3行,重复上述处理过程,直到Student中的数据行
43、全部处理完毕。,【例4.37】查询所有未选修任何课程的学生。,SELECT StudentCode, StudentName FROM Student WHERE NOT EXISTS (SELECT * FROM GradeWHERE Student.StudentCode=Grade.StudentCode),数据插入语句INSERT INTO, 向表中插入一条数据记录。,INSERT INTO 表名(字段名1,字段名2,) VALUES (表达式1,表达式2,),其中: (1)字段可以是某几个字段。表达式1、表达式2分别对应字段名1、字段名2,它们是所要添加的记录的值。 (2)如果表中的
44、字段没有在添加记录语句中出现,则对应的值为NULL。 (3)如果在定义表结构时已经说明了某个字段为必填字段(不能是空值)则在语句中必须为该字段添加对应的数值。 (4)当插入一条完整的记录时,可省略字段名,但字段值次序要与表中字段的次序一一对应。,【例4.38】向Grade表插入一条记录。,【例4.39】向Student表插入一条记录。,INSERT INTO Grade VALUES (2102, 113, 90,2012-12-20),INSERT INTO Student(StudentCode, Sex, StudentName, ClassCode) VALUES (3105, 女,
45、张琳,31),本例插入完整记录,可省略字段名,但注意值要与表中字段次序一致。,本例插入记录的部分字段值,注意非空字段必须有值;字段次序可与表不同,但与值的对应顺序一致。, 从其他表提取一组记录插入到目标表中。,INSERT INTO 表名 (字段1,字段2,) SELECT 源字段名表 FROM 源表名 WHERE 添加条件 ,【例4.40】向StudentTest表插入记录,数据为Student中所有女同学。,INSERT INTO StudentTest SELECT StudentCode, StudentName, Sex, LiveInDorm From Student WHERE
46、Sex=女,提示:此处数据表必须已经存在,且其结构定义与SELECT语句返回的字段值类型一致。,3. 修改记录语句UPDATE,UPDATE 表名 SET 字段名1= 表达式1 ,字段名2 = 表达式2 WHERE 条件表达式,实现对一条或多条符合条件记录中某个或某些字段值的修改 。,提示: 一个UPDATE语句可以更新多个字段值;如没有WHERE子句,将更新数据表中所有记录。,【例4.41】更新Student表中学号为“8101”的联系电话为“67792280”,【例4.42】更新Course表中信息,将所有开课学院为“计算机学院”的课程的实验学时增加10%,上课学时增加10。,UPDATE
47、 Student SET Telephone=67792280 WHERE StudentCode=8101,UPDATE Course SET LabHour=LabHour*(1+0.1),ClassHour=ClassHour+10 WHERE Academy=计算机学院,4.删除语句DELETE,DELETE FROM 表名 WHERE 删除条件 ,【例4.43】删除Student表中学号为“3105”的记录。,【例4.44】删除Student表中平均成绩低于70的学生。,删除指定表中满足条件的一条或多条记录。如果没有WHERE子句,即没有指定删除条件,则该语句执行后将删除指定表中的所
48、有记录。,DELETE FROM Student WHERE StudentCode= 3105 ,DELETE FROM Student WHERE StudentCode IN(SELECT StudentCode FROM GradeGROUP BY StudentCodeHAVING AVG(Grade)70),4.1.4 T-SQL的运算功能和控制流程,T-SQL虽然和高级语言不同,但它也有运算、控制等功能,以支持复杂的数据检索和集合操纵。,1. 标识符、常量和变量,(1)标识符:由用户定义的名称,用来标识各种对象如服务器、数据库、数据库对象、变量等。第一个字符必须是字母 、下划线(
49、_) 、或# 。,注意:在SQL Server中,如果标识符中包含空格,要用双引号(“”)或方括号()扩起来。 如:my table不合法,必须将其表示为my table或my table。,(2)常量:在程序运行过程中值不变的量。,注意:在T-SQL语句中不同类型常量的写法 数值型:直接写。如:23, 45.6 字符串:用西文单引号扩起来。如: 男。 如字符串包含单引号,则可以使用两个单引号表示嵌入的单引号。 211 工程 -211工程 日期时间型:用西文单引号扩起来。如:2008-08-08,2008-0808 20:08:08 Bit型:直接写。如:0, 1,ERROR:返回最后执行的 Transact-SQL 语句的错误代码。,