《数据库数据查询应用实践资料大全35949.pptx》由会员分享,可在线阅读,更多相关《数据库数据查询应用实践资料大全35949.pptx(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第五章第五章 数据库数据查询应用实践(数据库数据查询应用实践(1)1 内 容Select语句上机实验2 在SQL Server中,对数据库的查询使用SELECT语句语句。SELECT语句功能非常强大,使用灵活,可以对图书管理数据库进行各类查询。图书管理数据库查询3 在进行一些简单的查询操作时,经常需要从单个表中提取数据。【情景1】从图书管理数据库MBOOK中查询出所有读者的信息。在“SQLServerManagementStudio”中单击“新建查询”按钮新建一个查询窗口,在窗口中输入如下语句:USEMBOOKGOSELECT*FROMTReader从单个表中查询数据4 执行完以上语句后,“
2、SQLServerManagementStudio”的结果窗口中将显示TReader表中的所有读者信息,如图5.1所示。图5.1查询所有读者的信息从单个表中查询数据5 说明:在以上SQL语句中,通过SELECT关键字选择列选择列,“*”表示查询一个表或视图中的所有列。FROM子句子句用于指定要查询的对象,这里是从表TReader中查询。【情景2】查询姓名为“王林”的读者的借书证号、专业和借书量。新建一个查询窗口,输入并执行以下语句:SELECT借书证号,专业,借书量FROMTReaderWHERE姓名=王林执行结果如下所示:说明:在以上语句中,SELECT关键字后列出了要查询的列,使用WHER
3、E子句子句指定要查询的条件。从单个表中查询数据6【情景3】计算“SQLServer实用教程(第3版)”借出多少本。SELECT复本量-库存量FROMTBookWHERE书名=SQLServer实用教程(第3版)执行结果如下所示:从单个表中查询数据7【情景4】模糊查询书名中有“SQLSever”字样的图书的书名、作译者和出版社。查询结果中将这三列的标题更改为BookName、Author和Press。SELECT书名ASBookName,作译者ASAuthor,出版社ASPressFROMTBookWHERE书名LIKE%SQLServer%执行结果如下所示:从单个表中查询数据8【情景5】查询电
4、子工业出版社出版的作者为郑阿奇的图书信息。SELECT*FROMTBookWHERE出版社=电子工业出版社AND作译者=郑阿奇执行结果如下所示:从单个表中查询数据9【情景6】查询TReader表中第6到10行的读者记录。SELECTTOP5*FROMTReaderWHERE借书证号NOTIN(SELECTTOP5借书证号FROMTReader)执行结果如下所示:从单个表中查询数据10【情景1】查找读者“081101”对“SQLServer实用教程(第3版)”的借书记录。SELECTTLend.借书证号,TLend.ISBN,图书ID,借书时间,应还时间FROMTLend,TBookWHERET
5、Lend.ISBN=TBook.ISBNANDTLend.借书证号=081101ANDTBook.书名=SQLServer实用教程(第3版)说明:要查找081101的借书记录,首先需要根据书名从TBook表中查找图书的ISBN,再根据ISBN和借书证号在TLend表中查找该借书记录。所以以上语句在FROM子句中指定了两个表TLend和TBook,由于在两个表中都有ISBN字段,所以在指定时,需要在字段名之前加上表名以示区别。从多个表中查询数据11 通过子查询也可以实现以上功能:SELECT*FROMTLendWHERE借书证号=081101ANDISBNIN(SELECTISBNFROMTBo
6、okWHERE书名=SQLServer实用教程(第3版))从多个表中查询数据12【情景2】查找出还书时借书已经超过5天的读者姓名。SELECTDISTINCT姓名FROMTReaderJOINHLendONTReader.借书证号=HLend.借书证号WHERE(HLend.还书时间-HLend.借书时间)5执行结果如下所示:说明:读者的姓名只在TReader表中存储,所以只能从TReader表中查找姓名。但是还书记录只有在还书记录表HLend中查询,所以以上语句中使用了JOIN关键字关键字连接了TReader表和HLend表,ON子句用于指定连接的条件,即两个表的借书证号要相等。在WHERE
7、子句中指定了要查询还书时间和借书时间差大于5的记录。从多个表中查询数据13 SELECT DISTINCT 姓名FROM TReader,HLendwhere TReader.借书证号=HLend.借书证号 and(HLend.还书时间-HLend.借书时间)514 在对图书管理数据库的数据进行检索时,经常需要对结果进行汇总或计算,例如,求图书的总库存量、统计读者的总数等。【情景1】查询图书管理数据库中读者的总数。USEMBOOKGOSELECTCOUNT(*)AS读者总数FROMTReader执行结果如下所示:数据汇总15【情景2】统计图书管理数据库中男女生的人数。SELECT性别,COUN
8、T(性别)AS人数FROMTReaderGROUPBY性别说明:以上语句中使用GROUP BY子句子句对性别进行分组,将性别读者分为0和1两组,再使用COUNT函数统计每组的人数。数据汇总16【情景3】从借阅表TLend中查找借书大于等于2本且借书时间早于2009年9月23日的读者的借书证号。SELECT借书证号FROMTLendWHERE借书时间=2说明:以上语句中使用GROUP BY子句对TLend表中“借书时间2009-09-23”的记录根据借书证号进行分组,再使用HAVING子句子句筛选出有相同借书证号的记录数大于2的记录。数据汇总17 有时需要将查询出的记录按照指定的顺序进行排序。【
9、情景1】将计算机专业的读者信息按照出生时间升序排列。SELECT*FROMTReaderWHERE专业=计算机ORDERBY出生时间ASC说明:在以上语句中,使用ORDER BY子句子句将所得记录按照出生时间排列,关键字ASC表示升序。排序18【情景2】将图书管理数据库中的图书信息按照出版年月降序排列。SELECTISBN,书名,作译者,出版社,出版年月,价格FROMTBookORDERBY出版年月DESC排序19 通过T-SQL的SELECT语句可以从表或视图中迅速方便地检索数据,可以实现对表的选择、投影及连接操作,其功能十分强大。语法格式如下:SELECTALL|DISTINCTTOPex
10、pressionPERCENTWITHTIES/*指定要选择的列及其限定*/INTO/*INTO子句,指定结果存入新表*/FROM/*FROM子句,指定表或视图*/WHERE/*WHERE子句,指定查询条件*/GROUPBY/*GROUPBY子句,指定分组表达式*/HAVING/*HAVING子句,指定分组统计条件*/ORDERBYASC|DESC/*ORDER子句,指定排序表达式和顺序*/说明:所有被使用的子句必须按语法说明中显示的顺序严格地排序。例如,一个HAVING子句必须位于GROUP BY子句之后,并位于ORDER BY子句之前。SELECT语句返回一个表的结果集,通常该结果集被称为
11、表值表达式。Select 语句20 通过SELECT语句中SELECT关键字后面的“”项组成结果表的列。语法格式::=*/*选择当前表或视图的所有列*/|.*/*选择指定的表或视图的所有列*/|,./*选择指定的列*/|AS/*AS子句,定义列别名*/|=/*选择指定列并更改列标题*/,.n选择列21 C1选择所有列选择所有列使用“*”表示选择一个表或视图中的所有列。【强化练习】查询学生管理数据库PXSCJ中XSB表的所有的学生数据。USEPXSCJGOSELECT*FROMXSBC2选择一个表中指定的列选择一个表中指定的列使用SELECT语句选择一个表中的某些列,各列名之间要以逗号分隔。【强
12、化练习】查询PXSCJ数据库的XSB表中所有学生的学号、姓名和总学分。SELECTXM,ZY,ZXFFROMXSBC3定义列别名定义列别名当希望查询结果中的某些列或所有列显示时使用自己选择的列标题时,可以在列名之后使用AS子句定义一个列别名来更改查询结果的列标题名。选择列22【强化练习】查询XSB表中计算机系同学的XH(学号)、XM(姓名)和ZXF(总学分),结果中各列的标题分别指定为学号、姓名和总学分。SELECTXHAS学号,XMAS姓名,ZXFAS总学分FROMXSBWHEREZY=计算机更改查询结果中的列标题也可以使用“=”的形式。例如:SELECT学号=XH,姓名=XM,总学分=ZX
13、FFROMXSBWHEREZY=计算机该语句的执行结果与上例的结果完全相同。当自定义的列标题中含有空格时,必须使用引号将标题括起来。例如:SELECTStudentnumber=XH,XMASStudentname,mark=ZXFFROMXSBWHEREZY=计算机说明:不允许在WHERE子句中使用列别名。这是因为,执行WHERE代码时,可能尚未确定列值。选择列23 C4替换查询结果中的数据替换查询结果中的数据在对表进行查询时,有时对所查询的某些列希望得到的是一种概念而不是具体的数据。要替换查询结果中的数据,则要使用查询中的CASE表达式,格式为CASEWHEN条件1THEN表达式1WHEN
14、条件2THEN表达式2ELSE表达式END选择列24【强化练习】查询XSB表中计算机系各同学的XH(学号)、XM(姓名)和ZXF(总学分),对其总学分按以下规则进行替换:若总学分为空值,替换为“尚未选课”;若总学分小于50,替换为“不及格”;若总学分在50与52之间,替换为“合格”;若总学分大于52,替换为“优秀”。列标题更改为“等级”。SELECTXHAS学号,XMAS姓名,等级=CASEWHENZXFISNULLTHEN尚未选课WHENZXF=50andZXF=52THEN合格ELSE优秀ENDFROMXSBWHEREZY=计算机GO选择列25 执行结果如下所示:选择列26 C5计算列值计
15、算列值使用SELECT对列进行查询时,在结果中可以输出对列值计算后的值,即SELECT子句可使用表达式作为结果。【强化练习】按120分计算成绩显示学号为081101的学生的成绩情况。SELECTXHAS学号,KCHAS课程号,成绩120=CJ*1.20FROMCJBWHEREXH=081101执行结果如下所示:选择列27 C6消除结果集中的重复行消除结果集中的重复行在只选择表中某些列时,可能会出现重复行。例如,对PXSCJ数据库的XSB表只选择ZY(专业)和ZXF(总学分),则出现多行重复的情况。可以使用DISTINCT关键字消除结果集中的重复行,其格式是SELECTDISTINCT|ALL关
16、键字DISTINCT的含义是对结果集中的重复行只选择一个,保证行的唯一性。【强化练习】对PXSCJ数据库的XSB表只选择专业和总学分,消除结果集中的重复行。SELECTDISTINCTZY,ZXFFROMXSB执行结果如下所示:选择列28 C7限制结果集返回行数限制结果集返回行数如果SELECT语句返回的结果集的行数非常多,可以使用TOP选项限制其返回的行数。TOP选项的基本格式为TOPexpressionPERCENTWITHTIES指示只能从查询结果集返回指定的第一组行或指定的百分比数目的行。expression可以是指定数目或百分比数目的行。若带PERCENT关键字,则表示返回结果集的前
17、expression%行。TOP子句可以用于SELECT、INSERT、UPDATE和DELETE语句中。【强化练习】对PXSCJ数据库的XSB表选择XM(姓名)、ZY(专业)和ZXF(总学分),返回结果集的前6行。SELECTTOP6XM,ZY,ZXFFROMXSB该语句执行结果如下所示:选择列29 C8聚合函数聚合函数SELECT子句中的表达式中还可以包含所谓的聚合函数。聚合函数常常用于对一组值进行计算,然后返回单个值。聚合函数通常与GROUPBY子句一起使用。如果一个SELECT语句中有一个GROUPBY子句,则这个聚合函数对所有列起作用;如果没有,则SELECT语句只产生一行作为结果。
18、SQLServer常用的聚合函数如表5.10中所示。函 数 名说 明AVG求组中值的平均值BINARY_CHECKSUM返回对表中的行或表达式列表计算的二进制校验值,可用于检测表中行的更改CHECKSUM返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引CHECKSUM_AGG返回组中值的校验值COUNT求组中项数,返回int类型整数COUNT_BIG求组中项数,返回bigint类型整数GROUPING产生一个附加的列MAX求最大值MIN求最小值SUM返回表达式中所有值的和STDEV返回给定表达式中所有值的统计标准偏差STDEVP返回给定表达式中所有值的填充统计标准偏差VAR返回给定
19、表达式中所有值的统计方差VARP返回给定表达式中所有值的填充统计方差表5.10 聚合函数表选择列30 下面对常用的几个聚合函数加以介绍。(1)SUM和AVG。SUM和AVG分别用于求表达式中所有值项的总和与平均值,语法格式为SUM/AVG(ALL|DISTINCTexpression)其中expression是常量、列、函数或表达式,其数据类型只能是:int、smallint、tinyint、bigint、decimal、numeric、float、real、money和smallmoney。ALL表示对所有值进行运算,DISTINCT表示去除重复值,默认为ALL。SUM/AVG忽略NULL值
20、。(2)MAX和MIN。MAX和MIN分别用于求表达式中所有值项的最大值与最小值,语法格式为MAX/MIN(ALL|DISTINCTexpression)其中expression可以是数字、字符和时间日期类型。ALL、DISTINCT的含义及默认值与SUM/AVG函数相同。MAX/MIN忽略NULL值。(3)COUNT。COUNT用于统计组中满足条件的行数或总行数,格式为COUNT(ALL|DISTINCTexpression|*)其中expression可以是除text、image或ntext之外的任何类型。COUNT忽略NULL值。选择列31【强化练习】(1)求选修101课程的学生的平均成
21、绩。SELECTAVG(CJ)AS课程101平均成绩FROMCJBWHEREKCH=101执行结果如下所示:选择列32(2)求选修101课程的学生的最高分和最低分。SELECTMAX(CJ)AS课程101的最高分,MIN(CJ)AS课程101的最低分FROMCJBWHEREKCH=101执行结果如下所示:选择列33(3)统计备注不为空的学生数。SELECTCOUNT(BZ)AS备注不为空的学生数FROMXSB;注意:这里COUNT(BZ)计算时备注为NULL的行被忽略,所以结果是7而不是22。(4)统计总学分在50分以上的人数。SELECTCOUNT(ZXF)AS总学分50分以上的人数FROM
22、XSBWHEREZXF50;执行结果如下:选择列34 FROM子句指定了SELECT语句查询的对象的构成形式。语法格式如下:FROM的构成如下::=AS/*查询表或视图,可指定别名*/|AS(,.n)/*行集函数*/|AS/*指定表值函数*/|AS(,.n)/*结果集*/|/*连接表*/From 子句35 C1.表名表名或视图名或视图名FROM子句后可以指定一个或多个表名或视图名作为查询对象。可以使用AS选项为表指定别名,AS关键字也可以省略,直接给出别名即可。别名主要用在相关子查询及连接查询中。如果FROM子句指定了表别名,这条SELECT语句中的其他子句都必须使用表别名来代替原始的表名。C
23、2.行集函数行集函数行集函数通常返回一个表或视图。可以使用别名来替代返回的表,还可以使用列别名替代结果集内的列名。主要的行集函数有:CONTAINSTABLE、FREETEXTTABLE、OPENDATASOURCE、OPENQUERY、OPENROWSET和OPENXML。C3.表值函数表值函数表值函数就是返回一个表的用户自定义函数。C4.结果集结果集FROM子句中还可以指定一个使用SELECT语句返回的中间结果集,但必须使用AS关键字为产生的中间表定义一个别名。From 子句36【强化练习】(1)查找表KCB中的课程101的KKXQ(开课学期)。USEPXSCJGOSELECTKKXQFR
24、OMKCBWHEREKCH=101(2)从XSB表中查找总学分大于50的男同学的姓名和学号。SELECTXM,XH,ZXFFROM(SELECTXM,XH,XB,ZXFFROMXSBWHEREZXF50)ASSTUDENTWHEREXB=1执行结果如下所示:From 子句37 在SQLServer中,通过在SELECT语句的WHERE子句中指定选择的条件来选择行。WHERE子句必须紧跟在FROM子句之后,其基本格式为WHERE的构成如下所示::=NOT AND|ORNOT,n判定运算的结果为TRUE或FALSE。NOT表示对判定的结果取反。AND用于组合两个条件,两个条件都为TRUE时值才为T
25、RUE。OR也用于组合两个条件,两个条件有一个条件为TRUE时值就为TRUE。Where 子句38 的一般构成如下所示::=|=|!=|!/*比较运算*/|NOTLIKEpatternESCAPEescape_character/*字符串模式匹配*/|NOTBETWEENAND/*指定范围*/|ISNOTNULL/*是否空值判断*/|NOTIN(|,n)/*IN子句*/|=|=|!=|!ALL|SOME|ANY()/*比较子查询*/|EXIST()/*EXIST子查询*/Where 子句39 C1比较运算比较运算比较运算符用于比较两个表达式值,共有9个,分别是:=(等于)、(小于)、(大于)、
26、=(大于等于)、(不等于)、!=(不等于)、!(不大于)。比较运算的格式为=|=|!=|!当两个表达式值均不为空值(NULL)时,比较运算返回逻辑值TRUE(真)或FALSE(假)。而当两个表达式值中有一个为空值或都为空值时,比较运算将返回UNKNOWN。【强化练习】查询PXSCJ数据库XSB表中学号为081101同学的情况。USEPXSCJGOSELECTXM,XH,ZXFFROMXSBWHEREXH=081101执行结果如下所示:Where 子句40 从查询条件的构成可以看出,可以将多个判定运算的结果通过逻辑运算符(NOT、AND和OR)再组成更为复杂的查询条件。例如,查询XSB表中通信工
27、程专业总学分大于等于42的同学的情况:SELECT*FROMXSBWHEREZY=通信工程ANDZXF=42Where 子句41 C2模式匹配模式匹配LIKE谓词用于指出一个字符串是否与指定的字符串相匹配,返回逻辑值TRUE或FALSE。LIKE谓词表达式的格式为NOTLIKEpatternESCAPE说明:l匹配表达式一般为字符串表达式,在查询语句中可以是列名。lpattern为在匹配表达式中的搜索模式串。在搜索模式串中可以使用通配符,表5.11列出了LIKE谓词可以使用的通配符及其说明。通 配 符说 明%代表0个或多个字符_(下画线)代表单个字符 指定范围(如a-f、0-9)或集合(如ab
28、cdef)中的任何单个字符指定不属于范围(如 a-f、0-9)或集合(如abcdef)的任何单个字符表5.11 通配符列表Where 子句42 l转义字符应为有效的SQLServer字符,没有默认值,且必须为单个字符。当模式串中含有与通配符相同的字符时,此时应通过该字符前的转义字符指明其为模式串中的一个匹配字符。使用ESCAPE关键字可指定转义符。lNOTLIKE:使用NOTLIKE与LIKE的作用相反。使用带“%”通配符的LIKE时,若使用LIKE进行字符串比较,模式字符串中的所有字符都有意义,包括起始或尾随空格。Where 子句43【强化练习】(1)查询XSB表中姓“王”且单名的学生情况。
29、USEPXSCJGOSELECT*FROMXSBWHEREXMLIKE王_执行结果如下所示:Where 子句44(2)查询XSB表中学号中倒数第3个数字为1且倒数第1个数在1到5之间的学生学号、姓名及专业。SELECTXH,XM,ZY FROMXSB WHEREXHLIKE%1_12345执行结果如下所示:Where 子句45 C3范围比较范围比较用于范围比较的关键字有两个:BETWEEN和IN。当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围,格式为:NOTBETWEENAND当不使用NOT时,若的值在与(包括这两个值)之间,则返回TRUE,否则
30、返回FALSE;使用NOT时,返回值刚好相反。使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为:IN(,n)【强化练习】(1)查询XSB表中不在1989年出生的学生情况。SELECTXH,XM,ZY,CSSJFROMXSBWHERECSSJNOTBETWEEN1989-1-1and1989-12-31(2)查询XSB表中专业为“计算机”或“通信工程”或“无线电”的学生情况。SELECT*FROMXSBWHERE专业IN(计算机,通信工程,无线电)Where 子句46 C4空值比较空值比较当需要判
31、定一个表达式的值是否为空值时,使用ISNULL关键字,格式为ISNOTNULL当不使用NOT时,若表达式的值为空值,返回TRUE,否则返回FALSE;当使用NOT时,结果刚好相反。Where 子句47 C5子查询子查询在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询。T-SQL允许SELECT多层嵌套使用,用来表示复杂的查询。子查询除了可以用在SELECT语句中,还可以用在INSERT、UPDATE及DELETE语句中。子查询通常与IN、EXIST谓词及比较运算符结合使用。(1)IN子查询。IN子查询用于进
32、行一个给定值是否在子查询结果集中的判断,格式为NOTIN()当表达式与子查询的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE;若使用了NOT,则返回的值刚好相反。【强化练习】查找选修了课程号为206的课程的学生的情况。SELECT*FROMXSBWHEREXHIN(SELECTXHFROMCJBWHEREKCH=206)Where 子句48 执行结果如下所示:在执行包含子查询的SELECT语句时,系统先执行子查询,产生一个结果表,再执行查询。本例中,先执行上面括号里面的子查询:SELECTXHFROMCJBWHEREKCH=206得到一个只含有XH列的表,CJB表中的每个KC
33、H值为206的行在结果表中都有一行。再执行外查询,若XSB表中某行的XH列值等于子查询结果表中的任一个值,则该行就被选择。Where 子句49(2)比较子查询。这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为|=|!=|!ALL|SOME|ANY()ALL、SOME和ANY说明对比较运算的限制。ALL指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE,否则返回FALSE;SOME或ANY表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE,否则返回FALSE。Where 子句50【强化练习】
34、(1)查找选修了离散数学的学生学号。SELECTXHFROMCJBWHEREKCH=(SELECTKCHFROMKCBWHEREKCM=离散数学)(2)查找比所有计算机系的学生年龄都大的学生。SELECT*FROMXSBWHERECSSJALL(SELECTCSSJFROMXSBWHEREZY=计算机)Where 子句51 执行结果如下所示:Where 子句52(3)EXISTS子查询。EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOTEXISTS,其返回值与EXISTS刚好相反。其
35、格式为NOTEXISTS()【强化练习】查找选修206号课程的学生姓名。SELECTXMFROMXSBWHEREEXISTS(SELECT*FROMCJBWHEREXH=XSB.XHANDKCH=206)Where 子句53 GROUPBY子句主要用于根据字段对行分组。例如,在学生成绩管理数据库PXSCJ中根据学生所学的专业对XSB表中的所有行分组,结果是每个专业的学生成为一组。在SQLServer中GROUPBY子句的语法格式如下:GROUPBYALL,n说明:中通常包含字段名。指定ALL将显示所有组。使用GROUPBY子句后,SELECT语句的SELECT关键字后只能包含在GROUPBY中
36、指出的列或在聚合函数中指定的列。【强化练习】(1)将PXSCJ数据库中各专业输出。USEPXSCJGOSELECTZYFROMXSBGROUPBYZY执行结果如下所示:Group by 子句54(2)求被选修的各门课程的平均成绩和选修该课程的人数。SELECTKCHAS课程号,AVG(CJ)AS平均成绩,COUNT(XH)AS选修人数FROMCJBGROUPBYKCH执行结果如下所示:Group by 子句55(3)求每个专业的男生、女生人数。SELECTZY,XB,COUNT(*)AS人数FROMXSBGROUPBYZY,XB执行结果如下所示:Group by 子句56 使用GROUPBY子
37、句和聚合函数对数据进行分组后,还可以使用HAVING子句对分组数据进行进一步的筛选。例如查找PXSCJ数据库中平均成绩在85分以上的学生,就是在CJB表上按学号分组后筛选出符合平均成绩大于等于85的学生。HAVING子句的格式为HAVINGHAVING子句中的条件与WHERE子句的查询条件类似,不过HAVING子句中可以使用聚合函数,而WHERE子句中不可以。在SELECT语句中,当WHERE、GROUPBY与HAVING子句都被使用时,要注意它们的作用和执行顺序。WHERE子句用于筛选由FROM子句指定的数据对象,GROUPBY用于对WHERE子句的结果进行分组,HAVING子句则是对使用了
38、GROUPBY以后的分组数据进行过滤。Having 子句57【强化练习】(1)查找平均成绩在85分以上的学生的学号和平均成绩。USEPXSCJGOSELECTXH,AVG(CJ)AS平均成绩FROMCJBGROUPBYXHHAVINGAVG(CJ)=85执行结果如下所示:Having 子句58(2)查找通信工程专业平均成绩在85分以上的学生的学号和平均成绩。SELECTXH,AVG(CJ)AS平均成绩FROMCJBWHEREXHIN(SELECTXHFROMXSBWHEREZY=通信工程)GROUPBYXHHAVINGAVG(CJ)=85执行结果如下所示:Having 子句59 图书管理数据库
39、视图为了更方便地进行查询,SQL Server中引入了视视图的概念图的概念。本节需要创建“读者借阅图书”视图,名称为RBL。通过“借书证号”将读者表(TReader)和借阅表(TLend)联系起来,通过“ISBN”将借阅表(TLend)和图书信息表(TBook)联系起来,视图RBL包含借书证号、姓名、借书量、图书ID、ISBN、书名、出版社、价格、借书时间等列。60(1)启动“SQLServerManagementStudio”,在“对象资源管理器中”展开数据库“MBOOK”,选择其中的“视图”项,用鼠标右键单击,在弹出的快捷菜单上选择“新建视图(N)”菜单项。(2)在随后出现的“添加表”窗口
40、中,添加所需要关联的基本表、视图、函数、同义词。这里只使用表选项卡,选择表“TReader”,如图5.2所示,单击“添加”按钮。之后再依次添加“TLend”和“TBook”表,添加完表后单击“关闭”按钮关闭该窗口。图5.2“添加表”窗口界面方式创建图书管理数据库视图61(3)基表添加完后,在视图窗口的关系图窗口显示了基表的全部列信息。选择TReader表的“姓名”、“借书量”字段,TLend表的“借书证号”、“ISBN”、“图书ID”、“借书时间”字段,TBook表的“书名”、“出版社”、“价格”字段。另外,可以在子窗口中的“列”一栏指定与视图关联的列,在“列名”一栏为相关联的列在视图中定义一
41、个新列名,在“排序类型”一栏指定列的排序方式,在“筛选器”一栏指定创建视图的规则(例如,可以在“出版社”字段的“筛选器”栏中填写“电子工业出版社”筛选出电子工业出版社出版的图书)。这一步选择的字段、规则等的情况所对应的SELECT语句将会自动显示在窗口底部。界面方式创建图书管理数据库视图62 本操作中视图RBL不需要另外指定列名,所以“列名”一栏不填,“排序类型”和“筛选器”栏也不必填写,如图5.3所示。图5.3创建图书管理数据库视图RBL界面方式创建图书管理数据库视图63(4)上一步完成后,单击面板上的保存按钮,出现保存视图对话框,在其中输入视图名RBL,并单击“确定”按钮,便完成了视图的创建。视图RBL创建成功后可以查看其结构,查看的方法是:在“对象资源管理器中”展开数据库MBOOK下的“视图”节点,用鼠标右键单击视图“dbo.RBL”,选择“设计”菜单项,可以查看并可修改视图结构,选择“编辑前200行”菜单项,将可查看视图数据内容。界面方式创建图书管理数据库视图64 小结Select 语句视图的创建65