Transact-SQL语句的高级应用.ppt
《Transact-SQL语句的高级应用.ppt》由会员分享,可在线阅读,更多相关《Transact-SQL语句的高级应用.ppt(68页珍藏版)》请在三一办公上搜索。
1、SQL Server 2005 数据库应用与开发,第06章 Transact-SQL语句的高级应用,6.1 多表连接6.2 使用子查询 6.3 利用游标处理结果集 6.4 管理大对象类型数据 6.5 小结,第06章 Transact-SQL语句的高级应用,内容提要 1.利用Transact-SQL语句查询的相关技巧和高级应用2.连接与子查询的区别3.游标的概念和应用4.大对象类型数据的管理,6.1 多表连接,6.1.1 连接概述连接可以根据各个表之间的逻辑关系来利用一个表中的数据选择另外的表中的行。连接条件可在 FROM 或 WHERE 子句中指定。连接条件与WHERE和HAVING搜索条件组
2、合,用于控制FROM子句引用的基表中所选定的行。,6.1 多表连接,6.1.1 连接概述SQL Server处理连接时,查询引擎从多种可能的方法中选择最高效的方法处理连接。尽管不同连接的物理执行采用多种不同的优化,但是逻辑序列都应用下列子句实现:FROM 子句中的连接条件。WHERE 子句中的连接条件和搜索条件。HAVING 子句中的搜索条件。,6.1 多表连接,6.1.2 内连接内连接(INNER JOIN)通过比较数据源表间共享列的值,从多个源表检索符合条件的行的操作。可以使用等号运算符的连接,也可以连接两个不相等的列中的值,例6.1 查询选修课程号为c05109的学生的学号、姓名和期末成
3、绩。分析:本例中要求所输出的列分别在student 表和score表中,可以通过studentno列、使用内连接的方式连接两个表,找出选修课程号为c05109的行。程序中两个表存在相同的列,引用时需要标明该列所属的源表。,6.1 多表连接,程序代码如下:SELECT student.studentno,sname,final FROM student INNER JOIN score ON student.studentno=score.studentnoWHERE score.courseno=c05109,程序执行结果如下:studentno sname final-0822111208
4、韩吟秋 91.000824113307 崔岩坚 79.00 0935222201 夏文斐 92.000937221508 平靖 91.00(7 行受影响),6.1 多表连接,6.1.2 内连接,例6.2 查询选修课程号为c05103且平时成绩高于80分的学生的学号、姓名、平时成绩和期末成绩。分析:本例通过studentno列连接两个表,找出选修课程号为c05103的行。同时要求输出行中的平时成绩高80分,则可以使用不是用等号的比较运算符实现。关键词INNER也可以省略。,程序代码如下:SELECT student.studentno,sname,usually,final FROM stude
5、nt JOIN score ON student.studentno=score.studentno and usually80 WHERE score.courseno=c05103,程序执行结果如下:studentno sname usually final-0823210007 宿致远 82.00 69.000824113307 崔岩坚 85.00 77.000922210009 许海冰 87.00 82.000922221324 何影 88.00 62.00(4 行受影响),6.1 多表连接,6.1.3 外连接外部连接(outer join)包括满足搜索条件的连接表中的所有行,甚至包括
6、在其他连接表中没有匹配行的一个表中的行。(1)左外连接(left outer join)。包括 JOIN子句中左侧表中的所有行。右表中的行与左表中的行不匹配时,将为来自右表的所有结果集列赋以 NULL 值。,6.1 多表连接,6.1.3 外连接,例6.3利用左外连接方式查询08级学生的学号、姓名、平时成绩和期末成绩。分析:左外连接方式将会对右表中的行与左表中的行不匹配时,将右表的所有结果集列赋以NULL 值。,程序代码如下:SELECT student.studentno,sname,usually,final FROM student LEFT JOIN score ON student.s
7、tudentno=score.studentno WHERE substring(student.studentno,1,2)=08,程序执行结果如下:studentno sname usually final-0822111208 韩吟秋 85.00 91.000822111208 韩吟秋 89.00 95.000824113307 崔岩坚 66.00 82.000828261367 赵毓 NULL NULL(10 行受影响),6.1 多表连接,6.1.3 外连接(2)右外连接(right outer join)。外部连接的一种,其中包含 JOIN 子句中最右侧表的所有行。如果右侧表中的行与
8、左侧表中的行不匹配,则将为结果集中来自左侧表的所有列分配 NULL 值。,6.1 多表连接,6.1.3 外连接,例6.4 利用右外连接方式查询教师的排课情况。分析:右外连接方式将会对左表中的行与右表中的行不匹配时,将左表的所有结果集列赋以NULL 值。,程序代码如下:SELECT courseno,tname,teacher.teacherno,majorFROM teach_class RIGHT JOIN teacher ON teach_class.teacherno=teacher.teacherno,程序执行结果如下:courseno tname major teacherno-c0
9、5109 韩晋升 软件工程 t05001 c06172 姚思远 铸造工艺 t06023NULL 马爱芬 经济管理 t07019c08123 田有余 金融管理 t08017c08106 韩慧娟 货币学 t08019(10 行受影响),6.1 多表连接,6.1.3 外连接(3)完全外连接。若要通过在连接的结果中包括不匹配的行来保留不匹配信息,请使用完全外部连接。SQL Server 提供了完全外部连接运算符 FULL OUTER JOIN,它将包括两个表中的所有行,不论另一个表中是否有匹配的值。,6.1 多表连接,6.1.3 外连接,例6.5 利用完全外连接方式查询教师的排课情况。分析:完全外部连
10、接是右外连接与左外连接的并集。无论是左表中的行还是右表中的行不匹配时,将所有结果集中没有匹配值的列赋以NULL值。,程序代码如下:SELECT courseno,tname,major,teacher.teachernoFROM teach_class FULL JOIN teacher ON teach_class.teacherno=teacher.teacherno,程序执行结果如下:courseno tname major teacherno-c05109 韩晋升 软件工程 t05001c05127 韩晋升 软件工程 t05001c08106 韩慧娟 货币学 t08019c05109
11、NULL NULL NULLNULL 马爱芬 经济管理 t07019(11 行受影响),6.1 多表连接,6.1.4 交叉连接(笛卡尔连接)交叉连接(Cross Join)是在没有WHERE子句的情况下,产生的表的笛卡儿积。两个表作交叉连接时,结果集大小为二者行数之积。该种方式在实际过程中用的很少。,6.1 多表连接,6.1.4 交叉连接,例6.6 显示student 表和score表的笛卡儿积。分析:student 表10数据,score表有24行数据,其结果集应为240行数据。程序代码如下:SELECT student.studentno,sname,score.*FROM student
12、 CROSS JOIN score,程序执行结果如下:studentno sname studentno courseno usually final-0822111208 韩吟秋 0822111208 c05109 85.00 91.000822111208 韩吟秋 0822111208 c06108 89.00 95.000937221508 平靖 0937221508 c08106 78.00 95.000937221508 平靖 0937221508 c08123 78.00 89.000937221508 平靖 0937221508 c08171 88.00 98.00(240 行受
13、影响),6.1 多表连接,6.1.5 连接多个表 使用SELECT语句进行连接的表数目没有上限。但在一条SELECT语句中连接的表多于10个,那么数据库就很可能达不到最优化设计,SQL Server 2005引擎的执行计划会变得非常繁琐。需要注意:对于3个以上关系表的连接查询,一般遵循下列规则:连接n个表至少需要n-1个连接条件,以避免笛卡儿积的出现。为了缩小结果集,采用多于n-1个连接条件或使用其他条件都是允许的。,6.1 多表连接,6.1.5 连接多个表,例6.7 查询08级学生的学号、姓名、课程名、期末成绩及学分。分析:本例要求输出的各项分别存在于student、course和 scor
14、e等3个表中,因此至少需要创建2个连接条件。程序代码如下:SELECT student.studentno,sname,cname,final,creditFROM score JOIN student ON student.studentno=score.studentno JOIN course ON score.courseno=course.coursenowhere substring(student.studentno,1,2)=08,程序执行结果如下:studentno sname cname final credit-0822111208 韩吟秋 C语言 91.00 4.508
15、22111208 韩吟秋 机械制图 95.00 3.50824113307 崔岩坚 数据结构 87.00 4.00824113307 崔岩坚 机械制图 82.00 3.5(9 行受影响),6.1 多表连接,6.1.5 连接多个表,例6.8 查询计算机学院的老师的教师号、姓名、上课班级号、课程名和学分。分析:本例要求输出的各项分别存在于teacher、class和course等3个表中,因为各个表要通过teach_class纽带表进行连接,因此至少需要创建3个连接条件。,程序代码如下:SELECT teacher.teacherno,tname,class.classno,cname,credi
16、tFROM teach_class JOIN teacher ON teach_class.teacherno=teacher.teacherno JOIN class ON teach_class.classno=class.classno JOIN course ON teach_class.courseno=course.coursenowhere teacher.department=计算机学院,程序执行结果如下:teacherno tname classno cname credit-t05001 韩晋升 090502 数据结构 4.0t05003 刘元朝 090501 数据结构 4
17、.0t05011 海封 090502 软件工程 3.0t05017 卢明欣 090501 数据结构 4.0(4 行受影响),6.1 多表连接,6.1.6 合并多个结果集 UNION操作符可以将多个SELECT语句的返回结果组合到一个结果集中。该结果集包含联合查询中的所有查询的全部行。下面列出了使用 UNION 合并两个查询结果集的基本规则:所有查询中的列数和列的顺序必须相同。数据类型必须兼容。UNION操作符基本语法格式如下:SELECT_statement UNION all SELECT_statement,6.1 多表连接,6.1.5 连接多个表,例6.9 合并结果集示例。分析:虽然2个
18、表的结构不同,但需要合并的两个结果集结构和列的数据类型兼容。程序代码如下:CREATE TABLE t1(a int,b nchar(4),c nchar(4)INSERT INTO t1 VALUES(1,aaa,jkl)INSERT INTO t1 VALUES(2,bbb,mno)INSERT INTO t1 VALUES(3,ccc,pqr)CREATE TABLE t2(a nchar(4),b float)INSERT INTO t2 VALUES(kkk,1.000)INSERT INTO t2 VALUES(mmm,3.000)SELECT a,b FROM t1 UNION
19、SELECT b,a FROM t2,程序执行结果如下:a b-1 aaa 1 kkk 2 bbb 3 ccc 3 mmm(5 行受影响),6.2 使用子查询,6.2.1 子查询介绍子查询就是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询子查询可以把一个复杂的查询分解成一系列的逻辑步骤,利用单个语句的组合解决复杂的查询问题。可以使用连接替代子查询,也可以使用子查询替代表达式。SQL Server 2005对嵌套查询的处理过程是从内层向外层处理,即先处理最内层的子查询,然后把查询的结果用于其外查询的查询条件,再层层向外求解,最后得出查询结果。,6.2 使
20、用子查询,6.2.1 子查询介绍使用子查询时应该注意如下的事项:子查询需要用括号括起来。当需要返回一个值或一个值列表时,可以利用子查询代替一个表达式。也可以利用子查询返回含有多个列的结果集替代表或连接操作相同的功能。子查询不能够检索数据类型为varchar(max)、nvarchar(max)和 varbinary(max)的列。子查询中可以再包含子查询,嵌套层数可以达到16层。,6.2 使用子查询,利用子查询做表达式在Transact-SQL语句中,可以把子查询的结果当成一个普通的表达式来看待,用在其外查询的选择条件中。此时子查询必须返回一个值或单个列值列表,此时的子查询可以替换WHERE子
21、句中包含IN关键字的表达式。,例6.10 查询学号为的学生的入学成绩、所有学生的平均入学成绩及该学生成绩与所有学生的平均入学成绩的差。分析:利用子查询求学生的平均入学成绩,作为SELECT语句的输出项表达式。,6.2 使用子查询,利用子查询做表达式,程序代码如下:SELECT studentno,sname,point,(SELECT AVG(point)FROM student)AS 平均成绩,point-(SELECT AVG(point)FROM student)AS 分数差值FROM student WHERE studentno=0828261367,程序运行结果如下:student
22、no sname point 平均成绩 分数差值-0828261367 赵毓 887 788 99(1 行受影响),6.2 使用子查询,利用子查询做表达式,例6.11 获取期末成绩中含有高于93分的学生的学号、姓名、电话和Email。分析:利用操作符IN可以允许指定一个表达式(或常量)集合,可以利用SELECT语句的子查询输出表达式(或常量)集合。,程序代码如下:SELECT studentno,sname,phone,EmailFROM student WHERE studentno IN(SELECT studentno FROM score WHERE final93),程序运行结果如下
23、:studentno sname phone Email-0822111208 韩吟秋 0925111109 敬秉辰 0937221508 平靖(3 行受影响),6.2 使用子查询,利用子查询做表达式,例6.12查询选修课程的多于2门、且期末成绩均在85分以上的学生的学号、姓名、电话和Email。分析:在score表中通过studentno列分组,同时利用WHERE限定85分以上、利用HAVING句检测选修课程的多于2门的学生,符合条件的输出相关选项。,程序代码如下:SELECT studentno,sname,phone,EmailFROM studentWHERE studentno IN
24、(SELECT studentno FROM score WHERE final85 GROUP BY studentno HAVING count(*)2),程序运行结果如下:studentno sname phone Email-0925111109 敬秉辰 0937221508 平靖(2 行受影响),6.2 使用子查询,利用子查询关联数据子查询可以作为动态表达式,该表达式可以随着外层查询的每一行的变化而变化。创建关联子查询时,外部查询有多少行,子查询就执行多少次。,例6.13查询期末成绩比该选修课程平均期末成绩低的学生的学号、课程号和期末成绩。分析:在本例中,对score表采用别名形式,
25、一个表就相当于2个表。子查询执行时使用的a.courseno相当于一个常量。在别名为b的表中根据分组计算平均分。然后与外层查询的值进行比较。该过程很费时间。,6.2 使用子查询,利用子查询关联数据,程序代码如下:SELECT studentno,courseno,finalFROM score as aWHERE final(SELECT AVG(final)FROM score as b WHERE a.courseno=b.courseno group by courseno),程序运行结果如下:studentno courseno final-0823210007 c05103 69.0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Transact SQL 语句 高级 应用
链接地址:https://www.31ppt.com/p-6522107.html