1、第第4章章 T-SQL与可编程对象与可编程对象4.1 T-SQL4.1 T-SQL4.2 4.2 视图视图4.3 4.3 存储过程存储过程4.4 4.4 触发器触发器4.4.1 T-SQL1 T-SQL4.4.1.1 T-SQL1.1 T-SQL概述概述 SQL:结构化查询语言(Structure Query Language)关系型数据库管理系统的标准语言:按照ANSI(美国国家标准协会)的规定,最初由IBM公司在七十年代中期开发成功。T-SQL语言是微软公司在SQL Server中对SQL扩展。1.T-SQL1.T-SQL语言的特点语言的特点 1 1)非过程化)非过程化 面向过程的程序设计
2、语言,必须一步一步地将解题的全过程描述出来,不仅要告诉计算机“做什么”,而且还要告诉计算机“怎么做”。非过程化语言,不必描述解决问题的全过程,只需提出“做什么”,至于“如何做”的细节则由语言系统本身去完成并给出操作的结果。2 2)两种不同的使用方式)两种不同的使用方式 联机交互方式:SQL语言既可独立使用 嵌入程序设计语言中:例如C#程序设计语言中。不论使用何种方式,不论使用何种方式,T-SQLT-SQL语言的语法结构基本相同。语言的语法结构基本相同。3)3)高度一体化高度一体化 集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和T-SQL增加的语言元素于一体,可独立完
3、成数据库生命周期的所有活动。4)4)语言简洁、易学易用语言简洁、易学易用2.T-SQL2.T-SQL语言的组成元素语言的组成元素 数据定义语言数据定义语言DDL(DataDDL(Data Definition Language)Definition Language)定义数据库结构、各对象及属性的语句 例如:Creat DATABASE Student 数据库操纵语言数据库操纵语言DML(DataDML(Data Manipulation Language)Manipulation Language)实现对数据库基本操作的语句,主要包括查询、插入、修改、删除等 数据库控制语言数据库控制语言DC
4、L(DataDCL(Data Control Language)Control Language)保证数据库一致性和完整性 T-SQLT-SQL增加的语言元素增加的语言元素 变量、运算符、函数、流程控制语句和注解等。3.T-SQL3.T-SQL书写规则书写规则在T-SQL语句中,不区分字母大小写。为阅读方便,约定:(1)用大写字母书写T-SQL语句中关键字;(2)用小写字母书写语句中的标识符、表达式以及各种参数。4.4.注释注释(1)单行注释(2)多行注释/*/4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL 1.数据定义语言用于定义数据库中的对象,包括数据库、表、视图、索引、存储
5、过程、触发器等的建立或修改。操作对象操作对象操作方式操作方式创建创建删除删除修改修改使用使用数据库数据库CREATE CREATE DATABASEDATABASEDROP DROP DATABASEDATABASEALTER ALTER DATABASEDATABASEUSE USE 基本表基本表CREATE TABLECREATE TABLEDROP TABLEDROP TABLEALTER TABLEALTER TABLE视图视图 CREATE VIEWCREATE VIEWDROP VIEWDROP VIEWALTER VIEWALTER VIEW索引索引CREATE INDEXCRE
6、ATE INDEXDROP INDEXDROP INDEX存储过程存储过程CREATE CREATE PROCEDUREPROCEDUREDROP DROP PROCEDUREPROCEDUREALTER ALTER PROCEDUREPROCEDURE触发器触发器CREATE TRIGGERCREATE TRIGGERDROP TRIGGERDROP TRIGGERALTER TRIGGERALTER TRIGGER表表4-1 SQL4-1 SQL数据定义语言数据定义语言DDLDDL4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL2.2.使用使用SSMSSSMS生成生成SQLSQ
7、L脚本脚本(1)(1)右击要生成脚本的数据库对象,在右键菜单右击要生成脚本的数据库对象,在右键菜单中选择中选择“编写编写脚本脚本”-“Create-“Create到到”-“新查询编辑窗口新查询编辑窗口”(2)(2)在在“查询编辑查询编辑”窗口中可查看、复制、保存窗口中可查看、复制、保存脚本脚本(3)(3)使用使用“文件文件”-“-“打开打开”可打开脚本文件可打开脚本文件1)创建一个数据库SchoolTest;2)数据库主数据文件SchoolTest,物理文件为“D:SchoolTest.mdf”,大小为3MB;3)系统将自动在“D:”中创建大小为1MB、名为“SchoolTest_log.LD
8、F”的日志文件。【例【例4-14-1】创建一个只有一个主数据文件创建一个只有一个主数据文件 SchoolTestSchoolTest的的数据库数据库(不指定该文件的大小)不指定该文件的大小)。CREATE DATABASE SchoolTestON(NAME=SchoolTest,FILENAME=D:SchoolTest.MDF)3 3常用常用DDLDDL语句语句 (1)(1)创建数据库语句(创建数据库语句(CREATE DATABASECREATE DATABASE)4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL(2 2)打开和删除数据库语句)打开和删除数据库语句 USE U
9、SE 数据库名数据库名/*选择当前要操作的数据库选择当前要操作的数据库 */USE USE SchoolTestSchoolTestDROP DATABASE DROP DATABASE 数据库名数据库名/*删除数据库删除数据库 */USE SchoolUSE School-当前数据库必须更改!当前数据库必须更改!DROP DATABASE DROP DATABASE SchoolTest4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL(3 3)建立表语句()建立表语句(CREATE TABLECREATE TABLE)【例【例4-4-2 2】建立学生表建立学生表T_Student
10、TestT_StudentTest。CREATE TABLECREATE TABLE T_StudentTestT_StudentTest(StudentCodeStudentCode CHAR(8)NOT NULL UNIQUE,CHAR(8)NOT NULL UNIQUE,StudentNameStudentName VARCHAR(16)NOT NULL,VARCHAR(16)NOT NULL,Sex CHAR(2)NOT NULL,Sex CHAR(2)NOT NULL,LiveInDormLiveInDorm BIT DEFAULT 1,BIT DEFAULT 1,Constrain
11、t Constraint StudentPKStudentPK Primary Primary Key(StudentCodeKey(StudentCode)在School数据库中创建一个新的空表T_StudentTest。在字段的定义中确定StudentCode、StudentName、Sex不可取空值,LiveInDorm的默认值为1,并将StudentCode设定为主键约束。4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL(4 4)删除表语句()删除表语句(DROP TABLEDROP TABLE)【例【例4-34-3】删除删除T_StudentTestT_StudentTe
12、st表表 DROP TABLEDROP TABLE T_StudentTest注意注意:删除数据表要十分谨慎,因为当数据表被删除时,里面的数据也被全部删除。4.4.1.2 1.2 数据定义语言数据定义语言DDLDDL(5 5)建立索引语句)建立索引语句(CREATE INDEX)CREATE INDEX)CREATE INDEX CREATE INDEX 索引名索引名 ON ON 数据表名数据表名(字段字段 ASC|DESC)ASC|DESC)【例【例4-44-4】在在StudentStudent表的姓名(表的姓名(StudentNameStudentName)字段上建字段上建立升序索引。立升
13、序索引。CREATE INDEXCREATE INDEX NameIndexNameIndex onon Student(StudentNameStudent(StudentName)(6 6)删除索引语句)删除索引语句(DROP INDEX)DROP INDEX)4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML 数据操纵语言实现对数据的查询和更新,主要语句数据操纵语言实现对数据的查询和更新,主要语句及功能如下:及功能如下:表表4-2 SQL4-2 SQL数据操纵语言数据操纵语言DMLDML命令功能SELECT从一个表或多个表查询数据INSERT向一个表中添加一条记录UPDATE修
14、改表中某一个或几个字段的值DELETE从一个表中删除记录 查询数据库表中的数据并返回符合用户查询条件的结果数据。数据查询语句是SQL语言的核心。Select语句由多个子句构成,其语法形式为:SELECT SELECT 字段表字段表FROM FROM 表名表名WHERE WHERE 查询条件查询条件 GROUP BY GROUP BY 分组字段分组字段 HAVING HAVING 分组条件分组条件ORDER BY ORDER BY 字段名字段名 ASC/DESCASC/DESC 表示可选项。在书写SELECT语句时,字母大小写意义完全相同。语句可以写在若干行上(如上述语法格式中的描述),也可以不
15、换行。1 1查询语句查询语句SELECTSELECT 4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1)(1)字段表字段表 字段表位于关键字SELECT后面,这些字段将作为查询的结果被显示。使用字段表规则:1)1)字段与字段之间用逗号分隔。字段与字段之间用逗号分隔。【例【例4-54-5】使用使用SELECTSELECT语句查询语句查询StudentStudent表中的学生姓名表中的学生姓名(StudentNameStudentName)和性别()和性别(SexSex)。)。SELECT SELECT StudentNameStudentName,Sex,Sex FROM Stu
16、dent FROM Student 2)2)可以使用通配符可以使用通配符“*”表示表中的所有字段。表示表中的所有字段。【例【例4-64-6】使用使用SELECTSELECT语句查询语句查询 StudentStudent表中所有字段表中所有字段的值。的值。SELECT SELECT *FROM Student FROM Student 4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML3)如果字段名或表名中含有空格,则该字段名或表名必须用方括号括起。4)在字段表中,可以使用以下方式将原字段名以新的字段名显示。字段名字段名 AS AS 新字段名新字段名 【例【例4-74-7】显示显示Cl
17、assInfoClassInfo表中班级代号,并将表中班级代号,并将ClassCodeClassCode字段改为字段改为Class NumberClass Number。SELECT SELECT ClassCodeClassCode AS Class Number AS Class Number FROM FROM ClassInfoClassInfo 注意注意:字段别名Class Number含有空格,所以用方括号括起来 4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表5)5)在字段名前可加上一些范围限制,以便进一步优化查询在字段名前可加上一些范围限制,
18、以便进一步优化查询结果。常用的范围关键字有:结果。常用的范围关键字有:TOP n TOP n:显示前:显示前n n条记录条记录。TOP m PERCENTTOP m PERCENT :显示前:显示前m%m%的记录的记录。【例【例4-8】查询查询Course表中的前表中的前3条记录。条记录。SELECT TOP 3 SELECT TOP 3 *FROM Course FROM Course【例【例4-9】查询查询Course表中前表中前30%的记录。的记录。SELECT TOP 30 PERCENT SELECT TOP 30 PERCENT *FROM Course FROM Course 4
19、.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表 DISTINCTDISTINCT:若多条记录的字段值具有相同数据,只显若多条记录的字段值具有相同数据,只显示一条记录。示一条记录。【例【例4 4-10-10】查询查询CourseCourse表中开课的学院代码表中开课的学院代码AcademyCodeAcademyCode(与所开课程无关)。与所开课程无关)。SELECT DISTINCT SELECT DISTINCT AcademyCodeAcademyCode FROM Course FROM Course 4.4.1.3 1.3 数据操纵语言数据操纵语言D
20、MLDML(1 1)字段表)字段表6)6)为了增强查询功能,在为了增强查询功能,在SELECTSELECT语句中还可以使用内语句中还可以使用内部聚合函数,它们被用来进行一些简单的统计或计算。部聚合函数,它们被用来进行一些简单的统计或计算。常用统计函数如下表所示。常用统计函数如下表所示。表4-13 常用聚合函数函数名函数功能AVG(ALL|DISTINCT expression)计算某一字段的平均值(此字段的值必须是数值型)COUNT(ALL|DISTINCT expression)统计某一字段的个数MAX(ALL|DISTINCT expression)查找某一字段的最大值MIN(ALL|DI
21、STINCT expression)查找某一字段的最小值SUM(ALL|DISTINCT expression)计算某一字段的总和(此字段的值必须是数值型)表表4-3 4-3 常用聚合函数常用聚合函数4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表【例【例4-11】计算学生的总分、平均分、最高分、最低分及计算学生的总分、平均分、最高分、最低分及学生选课数。学生选课数。SELECT Sum(Grade)as SELECT Sum(Grade)as 总分总分,AvgAvg(Grade)as (Grade)as 平均分平均分,Max(Grade)as Max(Gr
22、ade)as 最高分最高分,Min(Grade)as Min(Grade)as 最低分最低分,Count(Count(StudentCodeStudentCode)as)as 课程人数课程人数 FROM Grade FROM Grade 表4-13 常用聚合函数4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表7 7)使用)使用SELECTSELECT语句复制新表。在字段名后加上语句复制新表。在字段名后加上INTO INTO 表表名可将查询结果复制到一张新表中。名可将查询结果复
23、制到一张新表中。【例【例】将将StudentStudent表中所有记录的学生姓名表中所有记录的学生姓名、出生日期两出生日期两个字段复制一张新表个字段复制一张新表NewTableNewTable。SELECT SELECT StudentNameStudentName,BirthDayBirthDay INTO INTO NewTableNewTable FROM Student FROM Student 运行后,产生一张表名为NewTable的新表。4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML(1 1)字段表)字段表(2)FROM(2)FROM子句子句 FROM FROM 表名
24、表名1 1,表名,表名2 2,表名,表名n n 1)1)在在FROMFROM子句中,表的先后次序可以任意排列。子句中,表的先后次序可以任意排列。2)2)FROMFROM子句中若包含多个表名,且不同的表中具有相同的子句中若包含多个表名,且不同的表中具有相同的字段,那么字段,那么SELECTSELECT子句的字段名必须表示成子句的字段名必须表示成 “.”。【例例4-124-12】查询查询StudentStudent表和表和GradeGrade表,报告表,报告StudentCodeStudentCode、StudentNameStudentName、CourseCodeCourseCode和和Gra
25、deGrade。SELECT SELECT StudentCodeStudentCode,StudentNameStudentName,CourseCodeCourseCode,Grade,Grade FROM Student,GradeFROM Student,Grade 正确语句:正确语句:SELECT SELECT Student.StudentCodeStudent.StudentCode,StudentNameStudentName,CourseCodeCourseCode,Grade ,Grade FROM Student,Grade FROM Student,Grade 4.4.
26、1.3 1.3 数据操纵语言数据操纵语言DMLDML (3)WHERE(3)WHERE子句子句 设置查询的条件,它是一个可选的子句。在使用时,设置查询的条件,它是一个可选的子句。在使用时,WHEREWHERE子句必须在子句必须在FROMFROM子句的后面。子句的后面。WHEREWHERE子句的语法格式:子句的语法格式:WHERE WHERE 查询条件查询条件 查询条件是一个逻辑表达式。常用的运算符有:查询条件是一个逻辑表达式。常用的运算符有:表4-14 T-SQL中常用的关系和逻辑运算查询条件谓词比较、=、=、=(等于)、(不等于)确定范围BETWEEN AND、NOT BETWEEN AND
27、确定集合IN、NOT IN字符匹配LIKE、NOT LIKE空值IS NULL、IS NOT NULL否定NOT逻辑运算AND、OR【例例4-144-14】查询未住校的女学生的情况。查询未住校的女学生的情况。SELECT StudentCode,StudentName,Sex,LiveInDormFROM StudentWHERE Sex=女 and LiveInDorm=01)比较和逻辑运算比较和逻辑运算 比较运算用于比较两个表达式的值;逻辑运算用来比较运算用于比较两个表达式的值;逻辑运算用来连接多个查询条件。连接多个查询条件。【例例4-134-13】在在StudentStudent表中查询
28、所有女同学的姓名。表中查询所有女同学的姓名。SELECT StudentCode,StudentName,Sex,LiveInDormFROM StudentWHERE Sex=女4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML2)2)确定范围确定范围BETWEEN ANDBETWEEN AND BETWEEN BETWEEN 值值1 AND 1 AND 值值2:2:查询值在值查询值在值1 1至值至值2 2之间的记录之间的记录 NOT BETWEEN NOT BETWEEN 值值1 AND 1 AND 值值2:2:查询不在指定范围中的记录查询不在指定范围中的记录【例例4-154-1
29、5】在在GradeGrade表中查询课程代号(表中查询课程代号(CourseCodeCourseCode)为)为“110001”110001”、成绩(、成绩(GradeGrade)在)在7070分到分到9090分之间的学生分之间的学生代号(代号(StudentCodeStudentCode)及成绩。)及成绩。SELECT SELECT StudentCodeStudentCode,CourseCodeCourseCode,Grade,Grade FROM GradeFROM GradeWHERE WHERE CourseCodeCourseCode=110001=110001 AND Grad
30、e BETWEEN 70 AND 90AND Grade BETWEEN 70 AND 90 此例的此例的WHEREWHERE子句也可改为:子句也可改为:WHERE WHERE CourseCodeCourseCode=110001=110001 AND Grade=70 AND Grade=70 AND Grade=90【例例4-164-16】查询查询StudentStudent表中不在表中不在19861986年到年到19951995年中出生年中出生的学生学号和姓名。的学生学号和姓名。SELECT SELECT StudentCodeStudentCode,StudentNameStuden
31、tName,Birthday ,Birthday FROM StudentFROM StudentWHERE Birthday NOT BETWEEN 1986-01-01 AND WHERE Birthday NOT BETWEEN 1986-01-01 AND 1995-12-121995-12-124.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML3)3)确定集合确定集合ININ运算运算使用使用ININ运算可查询某些字段值是否包含在所列出的指定值运算可查询某些字段值是否包含在所列出的指定值的记录的记录.【例例4-174-17】查询查询StudentStudent表中班号(表中班
32、号(ClassCodeClassCode)为)为“153030301”153030301”、“153030302”153030302”的学生。的学生。SELECT SELECT StudentCodeStudentCode,StudentNameStudentName,Sex,Sex,ClassCodeClassCodeFROM StudentFROM StudentWHERE WHERE ClasscodeClasscode IN(IN(153030301153030301,153030302153030302)此例的此例的WHEREWHERE子句也可以改为:子句也可以改为:WHERE WH
33、ERE ClassCodeClassCode=153030301153030301 OR OR ClassCodeClassCode=153030302153030302 4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML4)4)字符匹配字符匹配LIKE LIKE 指定字段的值是否包含在给定的字符串中,其结果是满指定字段的值是否包含在给定的字符串中,其结果是满足字符串匹配的数据记录。足字符串匹配的数据记录。通配符通配符“_”_”表示任意单个字符;表示任意单个字符;“%”%”表示包含零个或表示包含零个或更多字符的任意字符串。更多字符的任意字符串。【例例4-184-18】查询查询Cour
34、seCourse表中课程名称(表中课程名称(CourseNameCourseName)中包)中包含含“化学化学”两个字的课程代号(两个字的课程代号(CourseCodeCourseCode)及课程)及课程名称。名称。SELECT SELECT CourseCode,CourseNameCourseCode,CourseName FROM CourseFROM CourseWHERE WHERE CourseNameCourseName LIKE%LIKE%化学化学%4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML5)5)联接查询联接查询 查询操作中涉及多表的查询也称为联接查询。查询
35、操作中涉及多表的查询也称为联接查询。可以用两种方法实现可以用两种方法实现:在在WHEREWHERE子句中设置查询条件子句中设置查询条件。【例【例4-194-19】查询未住校学生的选课及成绩情况查询未住校学生的选课及成绩情况 SELECT SELECT StudentNameStudentName,CourseCodeCourseCode,Grade,Grade,LiveinDormLiveinDormFROM Grade,StudentFROM Grade,StudentWHERE WHERE LiveInDormLiveInDorm=0 AND=0 AND Grade.StudentCode
36、Grade.StudentCode=Student.StudentCodeStudent.StudentCode4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML5)5)联接查询联接查询在在FROMFROM子句中使用子句中使用联接关键字联接关键字将表与表联接在一起。将表与表联接在一起。T-SQLT-SQL查询嵌套在语言中使用时,多采用该方法查询嵌套在语言中使用时,多采用该方法 。语。语法格式:法格式:FROM FROM 表表1 1 联接关键字联接关键字 表表2 2 ON ON 表表1.1.字段名字段名1 1 表表2.2.字段名字段名2 2 其中:其中:表表1 1、表、表2 2是被联接
37、的表名;是被联接的表名;字段名是被联接的字段。必须有相同的数据类型并包字段名是被联接的字段。必须有相同的数据类型并包含同类数据,但不需要有相同的名称。含同类数据,但不需要有相同的名称。比较运算符:比较运算符:=、=、联接关键字用于确定联接的方式,常用的有联接关键字用于确定联接的方式,常用的有INNER INNER JOIN JOIN(内联接)、(内联接)、LEFT OUTER JOINLEFT OUTER JOIN(左外联接)、(左外联接)、RIGHT OUTER JOINRIGHT OUTER JOIN(右外联接)、(右外联接)、CROSS JOINCROSS JOIN(交(交叉联接);叉联
38、接);4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML INNER JOININNER JOININNER JOININNER JOIN:查询结果仅包含两个表中:查询结果仅包含两个表中每对联结匹配的行。内连接是系统默认的,可以将关键每对联结匹配的行。内连接是系统默认的,可以将关键字字INNERINNER省略。省略。【例例4-204-20】使用内联接查询未住校学生的选课及成绩情况。使用内联接查询未住校学生的选课及成绩情况。SELECT SELECT StudentNameStudentName,CourseCodeCourseCode,Grade,Grade,LiveinDormLi
39、veinDormFROM Student FROM Student INNER JOININNER JOIN Grade Grade ONON Student.StudentCodeStudent.StudentCode=Grade.StudentCodeGrade.StudentCode WHERE WHERE LiveInDormLiveInDorm=0=0本句的查询结果与本句的查询结果与【例例4-194-19】结果完全相同。结果完全相同。4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDMLLEFT OUTER JOINLEFT OUTER JOIN左外联接,查询结果除了包含两左外
40、联接,查询结果除了包含两张表中符合连接条件的记录外,还包含左表(写在关键字张表中符合连接条件的记录外,还包含左表(写在关键字LEFT OUTER JOINLEFT OUTER JOIN左边的表)中不符合联接条件、但符合左边的表)中不符合联接条件、但符合WHEREWHERE条件的全部记录。条件的全部记录。【例【例4-214-21】使用左外联接查询未住校学生的选课及成绩情况。使用左外联接查询未住校学生的选课及成绩情况。SELECT SELECT StudentNameStudentName,CourseCodeCourseCode,Grade,Grade,LiveInDormLiveInDormF
41、ROM Student FROM Student LEFT OUTER JOINLEFT OUTER JOIN Grade Grade ONON Student.StudentCodeStudent.StudentCode=Grade.StudentCodeGrade.StudentCodeWHERE WHERE LiveInDormLiveInDorm=0=0本句的查询结果中有些记录的本句的查询结果中有些记录的CourseCodeCourseCode和和GradeGrade字段的值字段的值为为NULLNULL,也就是说这些记录是不符合联接条件的(即在,也就是说这些记录是不符合联接条件的(即在
42、GradeGrade中没有找到有相同中没有找到有相同StudentCodeStudentCode的记录),但由于使的记录),但由于使用了左外联接的查询方法,所以左表(用了左外联接的查询方法,所以左表(StudentStudent)中的符合)中的符合WHEREWHERE子句条件的全部记录显示在查询结果中。子句条件的全部记录显示在查询结果中。4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML RIGHT OUTER JOINRIGHT OUTER JOIN右外联接,查询结果除了包含右外联接,查询结果除了包含两张表中符合联接条件的记录,还包含右表(写在关键两张表中符合联接条件的记录,还包含
43、右表(写在关键字字RIGHTT OUTER JOINRIGHTT OUTER JOIN右边的表)中不符合联接条件、右边的表)中不符合联接条件、但符合但符合WHEREWHERE条件的全部记录。条件的全部记录。【例【例4-224-22】使用右外联接查询未住校学生的选课及成绩情使用右外联接查询未住校学生的选课及成绩情况。况。SELECT SELECT StudentNameStudentName,CourseCodeCourseCode,Grade,Grade,LiveInDormLiveInDormFROM Student FROM Student RIGHT OUTER JOINRIGHT OU
44、TER JOIN Grade Grade ONON Student.StudentCodeStudent.StudentCode=Grade.StudentCodeGrade.StudentCodeWHERE WHERE LiveInDormLiveInDorm=0=0本句的查询结果与使用内联接完全相同,但含义不同。结果本句的查询结果与使用内联接完全相同,但含义不同。结果相同是由于在表设计时,在表相同是由于在表设计时,在表StudentStudent和和GradeGrade之间通过外键之间通过外键建立了参照完整性约束,表建立了参照完整性约束,表GradeGrade中的所有中的所有Student
45、CodeStudentCode必须必须是是StudentStudent中出现的值。中出现的值。4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML【例【例4-234-23】查询化工学院开设的课程的选修学生和考试成查询化工学院开设的课程的选修学生和考试成绩。绩。SELECT Course.CourseCode,Course.CourseName,SELECT Course.CourseCode,Course.CourseName,StudentCode,AcademyName,GradeStudentCode,AcademyName,GradeFROM Grade RIGHT JOIN
46、Course FROM Grade RIGHT JOIN Course ON Grade.CourseCode=Course.CourseCodeON Grade.CourseCode=Course.CourseCodeJOIN Academy ON JOIN Academy ON Course.AcademyCode=Academy.AcademyCodeCourse.AcademyCode=Academy.AcademyCodeWHERE AcademyName=WHERE AcademyName=化工学院化工学院 4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML CROSS
47、JOINCROSS JOIN(交叉联接):查询结果是将两个表进行拼接,(交叉联接):查询结果是将两个表进行拼接,即第一个表的每行与第二个表的每一行进行拼接,查询结即第一个表的每行与第二个表的每一行进行拼接,查询结果的行数等于两个表行数之积。果的行数等于两个表行数之积。【例例4-244-24】使用交叉联接列出所有学生需选的所有课程情况。使用交叉联接列出所有学生需选的所有课程情况。SELECT SELECT StudentNameStudentName,CourseCodeCourseCode FROM Student CROSS JOIN Course FROM Student CROSS JO
48、IN Course 多表联接嵌套:在多表查询时,所涉及的数据表在多表联接嵌套:在多表查询时,所涉及的数据表在3 3张以张以上,形成联接嵌套。嵌套的格式如下:上,形成联接嵌套。嵌套的格式如下:FROM FROM 表表1 1 JOIN JOIN 表表2 ON 2 ON 表表1.1.字段字段1 1 表表2.2.字段字段1 1 JOIN JOIN 表表3 ON 3 ON 表表2.2.字段字段2 2 表表3.3.字段字段2 2 JOIN JOIN 表表n ON n ON 表表n-1.n-1.字段字段n n 表表n.n.字段字段nn4.4.1.3 1.3 数据操纵语言数据操纵语言DMLDML【例例4-25
49、4-25】查询班号是查询班号是“051011”051011”的学生姓名、所选课的学生姓名、所选课程名称和成绩。程名称和成绩。使用使用WHEREWHERE子句设置查询条件:子句设置查询条件:SELECT SELECT StudentNameStudentName,CourseNameCourseName,Grade ,Grade FROM Student,FROM Student,Course,GradeCourse,Grade WHERE WHERE Course.CourseCodeCourse.CourseCode=Grade.CourseCodeGrade.CourseCode AND
50、AND Student.StudentCodeStudent.StudentCode=Grade.StudentCodeGrade.StudentCode AND AND ClassCode=ClassCode=153030301153030301 使用联接关键字的语句:使用联接关键字的语句:SELECT SELECT StudentNameStudentName,CourseNameCourseName,Grade,GradeFROM StudentFROM Student JOIN JOIN Grade Grade ONON Student.StudentCode=Grade.Studen