




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章数据库的查询和视图,4.1关系运算,4.2数据库的查询,4.3视图,4.4游标,4.1关系运算,1选择(Selection)选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出满足条件的行形成一个新表作为运算结果。选择运算的记号为F(R),其中,是选择运算符,下标F是一个条件表达式,R是被操作的表。例如:若要从T表(表4.1)中找出表中T120的行形成一个新表,则运算式为:F(T),4.1关系运算,式中,F为T1=|!=|!当两个表达式值均不为空值(NULL)时,比较运算返回逻辑值TRUE(真)或FALSE(假)。【例4.16】查询PXSCJ数据库XSB表中学号为081101同学的情况。USEPXSCJGOSELECT姓名,学号,总学分FROMXSBWHERE学号=081101;执行结果如下所示:,4.2.2WHERE子句,【例4.17】查询XSB表中总学分大于50的学生的情况。SELECT姓名,学号,出生时间,总学分FROMXSBWHERE总学分50;执行结果如下所示:,【例4.18】查询XSB表中通信工程专业总学分大于等于42的学生的情况。USEPXSCJGOSELECT*FROMXSBWHERE专业=通信工程AND总学分=42,4.2.2WHERE子句,2模式匹配LIKE谓词用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char、varchar、text、ntext、datetime和smalldatetime类型的数据,返回逻辑值TRUE或FALSE。LIKE谓词表达式的格式为:NOTLIKEESCAPE【例4.19】查询XSB表中姓“王”且单名的学生情况。SELECT*FROMXSBWHERE姓名LIKE王_执行结果如下所示:,4.2.2WHERE子句,【例4.20】查询XSB表中学号中倒数第3个数字为1且倒数第1个数在1到5之间的学生学号,姓名及专业。SELECT学号,姓名,专业FROMXSBWHERE学号LIKE%1_12345执行结果如下所示:,【例4.21】查询XSB表中名字包含下画线的学生学号和姓名。SELECT学号,姓名FROMXSBWHERE学号LIKE%#_%ESCAPE#,4.2.2WHERE子句,3范围比较用于范围比较的关键字有两个:BETWEEN和IN。当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围,格式为:NOTBETWEENAND使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为:IN(,n)【例4.22】查询XSB表中不在1989年出生的学生情况。SELECT学号,姓名,专业,出生时间FROMXSBWHERE出生时间NOTBETWEEN1989-1-1and1989-12-31,4.2.2WHERE子句,【例4.23】查询XSB表中专业为“计算机”或“通信工程”或“无线电”的学生的情况。SELECT*FROMXSBWHERE专业IN(计算机,通信工程,无线电)该语句与下列语句等价:SELECT*FROMXSBWHERE专业=计算机or专业=通信工程or专业=无线电,4.2.2WHERE子句,4空值比较当需要判定一个表达式的值是否为空值时,使用ISNULL关键字,格式为:ISNOTNULL当不使用NOT时,若表达式的值为空值,返回TRUE,否则返回FALSE;当使用NOT时,结果刚好相反。【例4.24】查询总学分尚不定的学生情况。SELECT*FROMXSBWHERE总学分ISNULL,4.2.2WHERE子句,5子查询T-SQL允许SELECT多层嵌套使用,用来表示复杂的查询。子查询除了可以用在SELECT语句中,还可以用在INSERT、UPDATE及DELETE语句中。子查询通常与IN、EXIST谓词及比较运算符结合使用。(1)IN子查询。IN子查询用于进行一个给定值是否在子查询结果集中的判断,语法格式为:NOTIN()(2)比较子查询。这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为:|=|!=|!ALL|SOME|ANY()(3)EXISTS子查询。EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOTEXISTS,其返回值与EXISTS刚好相反。其格式为:NOTEXISTS(),4.2.3FROM子句,FROM子句指定了SELECT语句查询的对象的构成形式。语法格式如下:FROM的构成如下::=AS/*查询表或视图,可指定别名*/|AS(,.n)/*行集函数*/|AS/*指定表值函数*/|AS(,.n)/*结果集*/|/*连接表*/|/*将行转换为列*/|/*将列转换为行*/,4.2.3FROM子句,1表名或视图名【例4.33】查找表KCB中的课程101的开课学期。USEPXSCJGOSELECT开课学期FROMKCBWHERE课程号=101【例4.34】查找“081101”号学生课程名为“计算机基础”的课程成绩。SELECT成绩FROMCJB,KCBWHERECJB.课程号=KCB.课程号AND学号=081101AND课程名=计算机基础,4.2.3FROM子句,2行集函数行集函数通常返回一个表或视图。既可以使用别名来替代返回的表,又可以使用列别名替代结果集内的列名。主要的行集函数有:CONTAINSTABLE、FREETEXTTABLE、OPENDATASOURCE、OPENQUERY、OPENROWSET和OPENXML。3表值函数所谓表值函数就是返回一个表的用户自定义函数。,4.2.3FROM子句,4结果集子查询可以用在FROM子句中,结果集表示由子查询中SELECT语句的执行而返回的表,但必须使用AS关键字为子查询产生的中间表定义一个别名。【例4.36】从XSB表中查找总学分大于50的男生的姓名和学号。SELECT姓名,学号,总学分FROM(SELECT姓名,学号,性别,总学分FROMXSBWHERE总学分50)ASSTUDENTWHERE性别=1;执行结果如下图所示:,4.2.3FROM子句,【例4.37】在XSB表中查找1990年1月1日以前出生的学生的姓名和专业,分别使用别名stu_name和speciality表示。SELECTm.stu_name,m.specialityFROM(SELECT*FROMXSBWHERE出生时间=80执行结果如下图所示:,4.2.4连接,【例4.43】查找选修了“计算机基础”课程且成绩在80分以上的学生学号、姓名、课程名及成绩。SELECTXSB.学号,姓名,课程名,成绩FROMXSB,KCB,CJBWHEREXSB.学号=CJB.学号ANDKCB.课程号=CJB.课程号AND课程名=计算机基础AND成绩=80执行结果如下图所示:,4.2.4连接,2以JOIN关键字指定的连接T-SQL扩展了以JOIN关键字指定连接的表示方式,使表的连接运算能力有了增强。FROM子句的表示将多个表连接起来。语法格式如下::=INNER|LEFT|RIGHT|FULLOUTER|CROSSJOINON,4.2.5GROUPBY子句,GROUPBY子句主要用于根据字段对行分组。例如,根据学生所学的专业对XSB表中的所有行分组,结果是每个专业的学生成为一组。语法格式如下:GROUPBYALL,nWITHCUBE|ROLLUP【例4.51】将PXSCJ数据库中各专业输出。SELECT专业FROMXSBGROUPBY专业执行结果如下图所示:,4.2.5GROUPBY子句,【例4.52】求各专业的学生数。SELECT专业,COUNT(*)AS学生数FROMXSBGROUPBY专业执行结果如下图所示:,4.2.5GROUPBY子句,【例4.53】求被选修的各门课程的平均成绩和选修该课程的人数。SELECT课程号,AVG(成绩)AS平均成绩,COUNT(学号)AS选修人数FROMCJBGROUPBY课程号执行结果如下图所示:,4.2.5GROUPBY子句,【例4.54】在PXSCJ数据库上产生一个结果集,包括每个专业的男生、女生人数、总人数及学生总人数。SELECT专业,性别,COUNT(*)AS人数FROMXSBGROUPBY专业,性别WITHROLLUP执行结果如左图所示。,4.2.5GROUPBY子句,【例4.55】在PXSCJ数据库上产生一个结果集,包括每个专业的男生、女生人数、总人数及男生总数、女生总数、学生总人数。SELECT专业,性别,COUNT(*)AS人数FROMXSBGROUPBY专业,性别WITHCUBE执行结果如下图所示:,4.2.5GROUPBY子句,【例4.56】统计各专业男生、女生人数及学生总人数,标志汇总行。SELECT专业,性别,COUNT(*)AS人数,GROUPING(专业)ASspec,GROUPING(性别)ASsxFROMXSBGROUPBY专业,性别WITHCUBE执行结果如右图所示。,4.2.6HAVING子句,【例4.57】查找平均成绩在85分以上的学生学号和平均成绩。USEPXSCJGOSELECT学号,AVG(成绩)AS平均成绩FROMCJBGROUPBY学号HAVINGAVG(成绩)=85执行结果如下图所示:,4.2.6HAVING子句,【例4.58】查找选修课程超过2门且成绩都在80分以上的学生的学号。SELECT学号FROMCJBWHERE成绩=80GROUPBY学号HAVINGCOUNT(*)2执行结果如下图所示:,4.2.6HAVING子句,【例4.59】查找通信工程专业平均成绩在85分以上的学生学号和平均成绩。SELECT学号,AVG(成绩)AS平均成绩FROMCJBWHERE学号IN(SELECT学号FROMXSBWHERE专业=通信工程)GROUPBY学号HAVINGAVG(成绩)=85执行结果如下图所示:,4.2.7ORDERBY子句,ORDERBY子句的格式为:ORDERBYASC|DESC【例4.60】将通信工程专业的学生按出生时间先后排序。SELECT*FROMXSBWHERE专业=通信工程ORDERBY出生时间【例4.61】将计算机专业学生的“计算机基础”课程成绩按降序排列。SELECT姓名,课程名,成绩FROMXSB,KCB,CJBWHEREXSB.学号=CJB.学号ANDCJB.课程号=KCB.课程号AND课程名=计算机基础AND专业=计算机ORDERBY成绩DESC执行结果如右图所示。,4.2.7ORDERBY子句,【例4.62】查找通信工程专业学生的学号、姓名、出生时间,并产生一个学生总人数行。SELECT学号,姓名,出生时间FROMXSBWHERE专业=通信工程COMPUTECOUNT(学号)执行结果如图所示。,4.2.7ORDERBY子句,【例4.63】将学生按专业排序,并汇总各专业人数和平均学分。SELECT学号,姓名,出生时间,总学分FROMXSBORDERBY专业COMPUTECOUNT(学号),AVG(总学分)BY专业执行结果如下图所示:,4.2.8SELECT语句的其他语法,1INTO使用INTO子句可以将SELECT查询所得的结果保存到一个新建的表中。INTO子句的格式为:INTO【例4.64】由XSB表创建“计算机系学生”表,包括学号和姓名。SELECT学号,姓名INTO计算机系学生FROMXSBWHERE专业=计算机,4.2.8SELECT语句的其他语法,2UNION使用UNION子句可以将两个或多个SELECT查询的结果合并成一个结果集,其格式为:UNIONALLUNIONALLn使用UNION组合两个查询的结果集的基本规则是:(1)所有查询中的列数和列的顺序必须相同。(2)数据类型必须兼容。,4.2.8SELECT语句的其他语法,【例4.65】查找学号为081101和学号为081210两位学生的信息。SELECT*FROMXSBWHERE学号=081101UNIONALLSELECT*FROMXSBWHERE学号=081210;执行结果如下图所示:,4.2.8SELECT语句的其他语法,3EXCEPT和INTERSECTEXCEPT和INTERSECT用于比较两个查询的结果,返回非重复值。语法格式如下:EXCEPT|INTERSECT【例4.66】查找专业为计算机但性别不为男的学生信息。USEPXSCJGOSELECT*FROMXSBWHERE专业=计算机EXCEPTSELECT*FROMXSBWHERE性别=1执行结果如下图所示:,4.2.8SELECT语句的其他语法,【例4.67】查找总学分大于42且性别为男的学生信息。SELECT*FROMXSBWHERE总学分42INTERSECTSELECT*FROMXSBWHERE性别=1执行结果如下图所示:,4.2.8SELECT语句的其他语法,4CTE在SELECT语句的最前面可以使用一条WITH子句来指定临时结果集,语法格式如下:WITH,.n其中::=(,.n)AS(),4.3视图,4.3.1视图概念视图一经定义,就可以像表一样被查询、修改、删除和更新。使用视图有下列优点:(1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。(2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不会影响用户对数据库的使用。(3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。(4)便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次。(5)可以重新组织数据以便输出到其他应用程序中。,4.3.2创建视图,1在“SQLServerManagementStudio”中创建视图以在PXSCJ数据库中创建名为CS_XS(描述计算机专业学生情况)的视图说明在“SQLServerManagementStudio”中创建视图的过程。第1步:启动“SQLServerManagementStudio”在“对象资源管理器”中展开“数据库”“PXSCJ”选择其中的“视图”项,右击鼠标,在弹出的快捷菜单上选择“新建视图”菜单项。第2步:在随后出现的添加表窗口中,添加所需要关联的基本表、视图、函数、同义词。这里只使用表选项卡,选择表“XSB”,如图4.2所示,单击“添加”按钮。,4.3.2创建视图,第3步:基表添加完后,在视图窗口的关系图窗口显示了基表的全部列信息,如图4.3所示。,4.3.2创建视图,2使用CREATEVIEW语句创建视图T-SQL中用于创建视图的语句是CREATEVIEW语句,例如用该语句创建视图CS_XS,其表示形式为:USEPXSCJGOCREATEVIEWCS_XSASSELECT*FROMXSBWHERE专业=计算机语法格式:CREATEVIEW(,.n)WITHENCRYPTION|SCHEMABINDINGAS;WITHCHECKOPTION,4.3.2创建视图,【例4.70】创建CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都要符合专业为计算机的条件。USEPXSCJGOCREATEVIEWCS_KCWITHENCRYPTIONASSELECTXSB.学号,课程号,成绩FROMXSB,CJBWHEREXSB.学号=CJB.学号AND专业=计算机WITHCHECKOPTION【例4.71】创建计算机专业学生的平均成绩视图CS_KC_AVG,包括学号(在视图中列名为num)和平均成绩(在视图中列名为score_avg)。CREATEVIEWCS_KC_AVG(num,score_avg)ASSELECT学号,AVG(成绩)FROMCJBGROUPBY学号,4.3.3查询视图,【例4.72】使用视图CS_KC查找计算机专业的学生学号和选修的课程号。SELECT学号,课程号FROMCS_KC【例4.73】查找平均成绩在80分以上的学生的学号和平均成绩。本例首先创建学生平均成绩视图XS_KC_AVG,包括学号(在视图中列名为num)和平均成绩(在视图中列名为score_avg)。CREATEVIEWXS_KC_AVG(num,score_avg)ASSELECT学号,AVG(成绩)FROMCJBGROUPBY学号再对XS_KC_AVG视图进行查询。SELECT*FROMXS_KC_AVGWHEREscore_avg=80执行结果如图所示。,4.3.4更新视图,1可更新视图要通过视图更新基本表数据,必须保证视图是可更新视图。一个可更新视图可以是以下情形之一:(1)满足以下条件的视图:创建视图的SELECT语句中没有聚合函数,且没有TOP、GROUPBY、UNION子句及DISTINCT关键字;创建视图的SELECT语句中不包含从基本表列通过计算所得的列;创建视图的SELECT语句的FROM子句中至少要包含一个基本表。(2)通过INSTEADOF触发器创建的可更新视图。,4.3.4更新视图,2插入数据使用INSERT语句通过视图向基本表插入数据,有关INSERT语句的语法介绍见第3章。【例4.74】向CS_XS视图中插入以下一条记录:(081115,刘明仪,1,1998-3-2,计算机,50,NULL)INSERTINTOCS_XSVALUES(081115,刘明仪,1,1998-3-2,计算机,50,NULL)使用SELECT语句查询CS_XS依据的基本表XSB:SELECT*FROMXSB,4.3.4更新视图,3修改数据【例4.75】将CS_XS视图中所有学生的总学分增加8。UPDATECS_XSSET总学分=总学分+8【例4.76】将CS_KC视图中学号为081101的学生的101课程成绩改为90。UPDATECS_KCSET成绩=90WHERE学号=081101AND课程号=101,4.3.4更新视图,4删除数据使用DELETE语句可以通过视图删除基本表的数据。但要注意,对于依赖于多个基本表的视图,不能使用DELETE语句。【例4.77】删除CS_XS中女同学的记录。DELETEFROMCS_XSWHERE性别=0,4.3.5修改视图的定义,1通过“SQLServerEnterpriseManager”修改视图启动“SQLServerManagementStudio”,在“对象资源管理器”中展开“数据库”“PXSCJ”“视图”选择“dbo.CS_XS”,右击鼠标,在弹出的快捷菜单中选择“修改”菜单项,进入视图修改窗口。在该窗口与创建视图的窗口类似,可以查看并修改视图结构,修改完后单击“保存”图标按钮即可。2使用ALTERVIEW语句修改视图语法格式:ALTERVIEW(,.n)WITHENCRYPTIONAS;WITHCHECKOPTION,4.3.5修改视图的定义,【例4.78】将CS_XS视图修改为只包含计算机专业学生的学号、姓名和总学分。USEPXSCJGOALTERVIEWCS_XSASSELECT学号,姓名,总学分FROMXSBWHERE专业=计算机【例4.79】视图CS_KC是加密存储视图,修改其定义:包括学号、姓名、选修的课程号、课程名和成绩。ALTERVIEWCS_KCWITHENCRYPTIONASSELECTXSB.学号,XSB.姓名,CJB.课程号,KCB.课程名,成绩FROMXSB,CJB,KCBWHEREXSB.学号=CJB.学号ANDCJB.课程号=KCB.课程号AND专业=计算机WITHCHECKOPTION,4.3.6删除视图,1通过“对象资源管理器”删除视图在“对象资源管理器”中删除视图的操作方法是:展开“数据库”“视图”选择需要删除的视图,右击鼠标,在弹出的快捷菜单上选择“删除”菜单项,出现删除对话框,单击“确定”按钮即可删除指定的视图。2T-SQL命令方式删除视图语法格式:DROPVIEW.,n;使用DROPVIEW可删除一个或多个视图。例如:DROPVIEWCS_XS,CS_KC删除视图CS_XS和CS_KC。,4.4游标,4.4.1游标概念SQLServer通过游标提供了对一个结果集进行逐行处理的能力,游标可看做一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理。使用游标可以在查询数据的同时对数据进行处理。在SQLServer中,有两类游标可以用于应用程序中:前端(客户端)游标和后端(服务器端)游标。服务器端游标是由数据库服务器创建和管理的游标,而客户端游标是由ODBC和DB-Library支持,在客户端实现的游标。SQLServer对游标的使用要遵循:声明游标打开游标读取数据关闭游标删除游标。,4.4.2声明游标,1SQL-92标准语句格式:DECLAREINSENSITIVESCROLLCURSORFORFORREADONLY|UPDATEOF,.n;以下是一个符合SQL-92标准的游标声明:DECLAREXS_CUR1CURSORFORSELECT学号,姓名,性别,出生时间,总学分FROMXSBWHERE专业=计算机FORREADONLY,4.4.2声明游标,2T-SQL扩展语句格式:DECLARECURSORLOCAL|GLOBAL/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学社会体育指导与管理专业题库- 大学生体质健康与生活幸福感
- 2025年大学人文教育专业题库- 社会人文素质在大学生活中的发展
- 2025年大学工会学专业题库- 大学生参与工会活动的益处
- 2025年消防安全知识培训考试题库-职业道德与消防技能
- 2025年大学科学教育专业题库- 科学教育与专业发展的关系
- 2025年初中地理学业水平考试模拟试题(乡土地理特色解析与解析)
- 2025年财政税收法规知识竞赛题库及答案(共57题)
- 2025年大学华文教育专业题库- 大学生口头表达能力实践研究
- 2025年大学科学教育专业题库- 大学生智力发展的科学教育策略
- 2025年职业病防治专业术语填空题答案及解析
- 护理专业全面解析
- 除颤护理课件
- 【化学 云南卷】2025年云南省高考招生统一考试真题化学试卷(含答案)
- 创伤性硬膜下出血查房
- 2025年廉政法规知识试题及答案
- 拔罐适应症研究-洞察及研究
- 2025《政务数据共享条例》法律法规课件
- Q-SY 02045-2024 柔性压裂管汇使用技术规范
- T/CACEM 31.5-2023高速公路经营管理第5部分:服务区服务要求
- 劳动技术-七年级上册-全册教案-湖南教育出版社
- 外贸矿产代理协议书
评论
0/150
提交评论