版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
数据查询5.1投影查询5.2选择查询5.3分组查询和统计计算5.4排序查询5.5连接查询5.6子查询5.7SELECT查询的其他子句5.8综合训练1SQLServer数据库教程(第3版)第5章
数据查询T-SQL语言中最重要的部分是它的查询功能,查询语言用来对已经存在于数据库中的数据按照特定的行、列、条件表达式或者一定次序进行检索。T-SQL对数据库的查询使用SELECT语句,SELECT语句具有灵活的使用方式和强大的功能。语法格式:SELECTselect_list/*指定要选择的列*/FROMtable_source/*FROM子句,指定表或视图*/[WHEREsearch_condition]/*WHERE子句,指定查询条件*/[GROUPBYgroup_by_expression]/*GROUPBY子句,指定分组表达式*/[HAVINGsearch_condition]/*HAVING子句,指定分组统计条件*/[ORDERBYorder_expression[ASC|DESC]]/*ORDER子句,指定排序表达式和顺序*/2SQLServer数据库教程(第3版)
5.1投影查询语法格式:SELECT[ALL|DISTINCT][TOPn[PERCENT][WITHTIES]]<select_list>select_list指出了结果的形式,其格式为:{* /*选择当前表或视图的所有列*/|{table_name|view_name|table_alias}.*/*选择指定的表或视图的所有列*/|{colume_name|expression|$IDENTITY|$ROWGUID[[AS]column_alias]/*选择指定的列并更改列标题,为列指定别名,还可用于为表达式结果指定名称,*/|column_alias=expression }[,…n]3SQLServer数据库教程(第3版)
5.1投影查询1.投影指定的列使用SELECT语句可选择表中的一个列或多个列,如果是多个列,各列名中间要用逗号分开。语法格式:SELECTcolumn_name[,column_name…]FROMtable_nameWHEREsearch_condition其中,FROM子句用于指定表,WHERE在该表中检索符合search_condition条件的列。4SQLServer数据库教程(第3版)
5.1投影查询【例5.1】查询student表中所有学生的学号、姓名和专业。USEstscSELECTstno,stname,specialistFROMstudent查询结果:stnostnamespeciality------------------------------121001李贤友通信121002周映雪通信121005刘刚通信122001郭德强计算机122002谢萱计算机122004孙婷计算机5SQLServer数据库教程(第3版)
5.1投影查询2.投影全部列在SELECT子句指定列的位置上使用*号时,则为查询表中所有列。【例5.2】查询student表中所有列。USEstscSELECT*FROMstudent该语句与下面语句等价USEstscSELECTstno,stname,stsex,stbirthday,specialist,tcFROMstudent6SQLServer数据库教程(第3版)
5.1投影查询7SQLServer数据库教程(第3版)查询结果:stnostnamestsexstbirthdayspecialitytc---------------------------------------------------------------121001李贤友
男1991-12-30通信52121002周映雪
女1993-01-12通信49121005刘刚
男1992-07-05通信50122001郭德强
男1991-10-23计算机48122002谢萱
女1992-09-11计算机52122004孙婷
女1992-02-24计算机503.修改查询结果的列标题为了改变查询结果中显示的列标题,可以在列名后使用AS子句。语法格式如下:AScolumn_alias其中column_alias是指定显示的列标题,AS可省略。
5.1投影查询8【例5.3】查询student表中通信专业学生的stno、stname、tc,并将结果中各列的标题分别修改为学号,姓名,总学分。USEstscSELECTstnoAS'学号',stnameAS'姓名',tcAS'总学分'FROMstudent查询结果:
学号姓名总学分----------------------------------121001李贤友52121002周映雪49121005刘刚50122001郭德强48122002谢萱52122004孙婷50SQLServer数据库教程(第3版)
5.1投影查询4.去掉重复行去掉结果集中的重复行可使用DISTINCT关键字,其语法格式是:SELECTDISTINCTcolumn_name[,column_name…]【例5.4】查询student表中specialist列,消除结果中的重复行。USEstscSELECTDISTINCTspecialistFROMstudent查询结果:speciality------------计算机通信9SQLServer数据库教程(第3版)5.2选择查询语法格式:选择查询通过WHERE子句实现,WHERE子句给出查询条件,该子句必须紧跟FROM子句之后。WHERE<search_condition>其中search_condition为查询条件,<search_condition>语法格式为:{[NOT]<precdicate>|(<search_condition>)}[{AND|OR}[NOT]{<predicate>|(<search_condition>)}]}[,…n]其中predicate为判定运算,<predicate>语法格式为:{expression{=|<|<=|>|>=|<>|!=|!<|!>}expression/*比较运算*/|string_expression[NOT]LIKEstring_expression[ESCAPE'escape_character'/*字符串模式匹配*/|expression[NOT]BETWEENexpressionANDexpression/*指定范围*/|expressionIS[NOT]NULL /*是否空值判断*/
10SQLServer数据库教程(第3版)5.2选择查询
|CONTAINS({column|*},'<contains_search_condition>')/*包含式查询*/|FREETEXT({column|*},'freetext_string')
/*自由式查询*/|expression[NOT]IN(subquery|expression[,…n])
/*IN子句*/|expression{=|<|<=|>|>=|<>|!=|!<|!>}{ALL|SOME|ANY}(subquery)
/*比较子查询*/
|EXIST(subquery)
/*EXIST子查询*/}表5.1查询条件11SQLServer数据库教程(第3版)
5.4.2选择查询1.表达式比较比较运算符用于比较两个表达式值,比较运算的语法格式如下:expression{=|<|<=|>|>=|<>|!=|!<|!>}expression其中expression是除text、ntext和image之外类型的表达式。12SQLServer数据库教程(第3版)5.2选择查询13【例5.5】查询student表中专业为计算机或性别为女的学生。USEstscSELECT*FROMstudentWHEREspecialist='计算机'orstsex='女‘查询结果:stnostnamestsexstbirthdayspecialitytc------------------------------------------------------------------121002周映雪女1993-01-12通信49122001郭德强男1991-10-23计算机48122002谢萱女1992-09-11计算机52122004孙婷女1992-02-24计算机502.范围比较BETWEEN、NOTBETWEEN、IN是用于范围比较的三个关键字,用于查找字段值在(或不在)指定范围的行。SQLServer数据库教程(第3版)
5.2选择查询【例5.6】查询score表成绩为82、91、95的记录。USEstscSELECT*FROMscoreWHEREgradein(82,91,95)查询结果:stnocnograde--------------------------12100120591121005801821220028019514SQLServer数据库教程(第3版)
5.2选择查询3.模式匹配字符串模式匹配使用LIKE谓词,LIKE谓词表达式的语法格式如下:string_expression[NOT]LIKEstring_expression[ESCAPE'escape_character']其含义是查找指定列值与匹配串相匹配的行,匹配串(即string_expression)可以是一个完整的字符串,也可以含有通配符。通配符有以下两种:%:代表0或多个字符。_:代表一个字符。15SQLServer数据库教程(第3版)5.2选择查询【例5.7】查询student表中姓孙的学生情况。USEstscSELECT*FROMstudentWHEREstnameLIKE'孙%‘查询结果:stnostnamestsexstbirthdayspecialitytc--------------------------------------------------------------------122004孙婷女1992-02-24计算机5016SQLServer数据库教程(第3版)
5.2选择查询4.空值使用空值是未知的值,判定一个表达式的值是否为空值时,使用ISNULL关键字,语法格式如下:expressionIS[NOT]NULL【例5.8】查询已选课但未参加考试的学生情况。USEstscSELECT*FROMscoreWHEREgradeISnull查询结果:stnocnograde---------------------------122001801NULL17SQLServer数据库教程(第3版)5.3分组查询和统计计算1.聚合函数SQLServer所提供常用的聚合函数如表5.3所示。聚合函数一般参数语法格式如下:([ALL|DISTINCT]expression)其中,ALL表示对所有值进行聚合函数运算,ALL为默认值,DISTINCT表示去除重复值,expression指定进行聚合函数运算的表达式。表5.3聚合函数18SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.9】查询102课程的最高分、最低分、平均成绩。
USEstscSELECTMAX(grade)AS'最高分',MIN(grade)AS'最低分',AVG(grade)AS'平均成绩'FROMscoreWHEREcno='102‘查询结果:最高分最低分平均成绩-------------------------------------------92728319SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.10】求学生的总人数。
USEstscSELECTCOUNT(*)AS'总人数'FROMstudent查询结果:总人数-----------6【例5.11】查询计算机专业学生的总人数。
USEstscSELECTCOUNT(*)AS'总人数'FROMstudentWHEREspecialist='计算机‘20SQLServer数据库教程(第3版)5.3分组查询和统计计算查询结果:总人数---------32.GROUPBY子句GROUPBY子句用于将查询结果表按某一列或多列值进行分组,其语法格式为如下:
[GROUPBY[ALL]group_by_expression[,…n][WITH{CUBE|ROLLUP}]]
其中,group_by_expression为分组表达式,通常包含字段名,ALL显示所有分组,WITH指定CUBE或ROLLUP操作符,在查询结果中增加汇总记录。
21SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.12】查询各门课程的最高分、最低分、平均成绩。
USEstscSELECTcnoAS'课程号',MAX(grade)AS'最高分',MIN(grade)AS'最低分',AVG(grade)AS'平均成绩'FROMscoreWHERENOTgradeISnullGROUPBYcno查询结果:课程号最高分最低分平均成绩-------------------------------------------10292728320394818720591658080195738622SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.13】求选修各门课程的平均成绩和选修人数。USEstscSELECTcnoAS'课程号',AVG(grade)AS'平均成绩',COUNT(*)AS'选修人数'FROMscoreGROUPBYcno查询结果:课程号平均成绩选修人数---------------------------------------10283320387220580380186623SQLServer数据库教程(第3版)5.3分组查询和统计计算3.HAVING子句HAVING子句用于对分组按指定条件进一步进行筛选,最后只输出满足指定条件的分组,HAVING子句的格式为:
[HAVING<search_condition>]
其中,search_condition为查询条件,可以使用聚合函数。
当WHERE子句、GROUPBY子句、HAVING子句在一个SELECT语句中时,执行顺序如下:(1)执行WHERE子句,在表中选择行。(2)执行GROUPBY子句,对选取行进行分组。(3)执行聚合函数。(4)执行HAVING子句,筛选满足条件的分组。24SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.14】查询选修课程2门以上且成绩在80分以上的学生的学号。USEstscSELECTstnoAS'学号',COUNT(cno)AS'选修课程数'FROMscoreWHEREgrade>=80GROUPBYstnoHAVINGCOUNT(*)>=2查询结果:学号选修课程数--------------------------121001312100531220022122004225SQLServer数据库教程(第3版)5.3分组查询和统计计算【例5.15】查询至少有4名学生选修且以8开头的课程号和平均分数。
USEstscSELECTcnoAS'课程号',AVG(grade)AS'平均分数'FROMscoreWHEREcnoLIKE'8%'GROUPBYcnoHAVINGCOUNT(*)>4查询结果:课程号平均分数---------------------8018626SQLServer数据库教程(第3版)5.4排序查询
SELECT语句的ORDERBY子句用于对查询结果按升序(默认或ASC)或降序(DESC)排列行,ORDERBY子句的格式如下:
[ORDERBY{order_by_expression[ASC|DESC]}[,…n]
其中,order_by_expression是排序表达式。【例5.16】将计算机专业的学生按出生时间先后排序。
USEstscROMstudentSELECT*WHEREspecialist='计算机'ORDERBYstbirthday查询结果:stnostnamestsexstbirthdayspecialitytc------------------------------------------------------122001郭德强男1991-10-23计算机48122004孙婷女1992-02-24计算机50122002谢萱女1992-09-11计算机5227SQLServer数据库教程(第3版)5.4排序查询【例5.17】将通信专业学生按“数字电路”课程成绩降序排序。
USEstscSELECTa.stname,ame,c.gradeFROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDame='数字电路'ANDa.specialist='通信'ORDERBYc.gradeDESC查询结果:stnamecnamegrade-------------------------------李贤友数字电路92刘刚数字电路87周映雪数字电路7228SQLServer数据库教程(第3版)5.5连接查询5.5.1
连接谓词在SELECT语句的WHERE子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词表示形式。其一般语法格式为:
[<表名1.>]<列名1><比较运算符>[<表名2.>]<列名2>比较运算符有:<、<=、=、>、>=、!=、<>、!<、!>连接谓词还有以下形式:
[<表名1.>]<列名1>BETWEEN[<表名2.>]<列名2>AND[<表名2.>]<列名3>由于连接多个表存在公共列,为了区分是哪个表中的列,引入表名前缀指定连接列。例如,student.stno表示student表的stno列,score.stno表示score表的stno列经常用到的连接如下:●等值连接:表之间通过比较运算符“=”连接起来,称为等值连接。●非等值连接:表之间使用非等号进行连接,则称为非等值连接。●
自然连接:如果在目标列中去除相同的字段名,称为自然连接。●
自连接:将同一个表进行连接,称为自连接。29SQLServer数据库教程(第3版)5.5连接查询【例5.18】查询学生的情况和选修课程的情况。
USEstscSELECTstudent.*,score.*FROMstudent,scoreWHEREstudent.stno=score.stno查询结果:30SQLServer数据库教程(第3版)stnostnamestsexstbirthdayspecialitytcstnocnograde----------------------------------------------------------------------------------121001李贤友
男1991-12-30通信5212100110292121001李贤友
男1991-12-30通信5212100120591121001李贤友
男1991-12-30通信5212100180194121002周映雪
女1993-01-12通信4912100210272121002周映雪
女1993-01-12通信4912100220565121002周映雪
女1993-01-12通信4912100280173121005刘刚
男1992-07-05通信5012100510287121005刘刚
男1992-07-05通信5012100520585121005刘刚
男1992-07-05通信5012100580182122001郭德强
男1991-10-23计算机48122001801NULL122002谢萱
女1992-09-11计算机5212200220394122002谢萱
女1992-09-11计算机5212200280195122004孙婷
女1992-02-24计算机5012200420381122004孙婷
女1992-02-24计算机50122004801865.5连接查询【例5.19】对上例进行自然连接查询。
USEstscSELECTstudent.*,o,score.gradeFROMstudent,scoreWHEREstudent.stno=score.stno
查询结果:31SQLServer数据库教程(第3版)stnostnamestsexstbirthdayspecialitytccnograde---------------------------------------------------------------------------121001李贤友
男1991-12-30通信5210292121001李贤友
男1991-12-30通信5220591121001李贤友
男1991-12-30通信5280194121002周映雪
女1993-01-12通信4910272121002周映雪
女1993-01-12通信4920565121002周映雪
女1993-01-12通信4980173121005刘刚
男1992-07-05通信5020585121005刘刚
男1992-07-05通信5080182122001郭德强
男1991-10-23计算机48801NULL122002谢萱
女1992-09-11计算机5220394122002谢萱
女1992-09-11计算机5280195122004孙婷
女1992-02-24计算机5020381122004孙婷
女1992-02-24计算机50801865.5连接查询【例5.20】查询选修了“微机原理”且成绩在80分以上的学生姓名。
USEstscSELECTa.stno,a.stname,ame,c.gradeFROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDame='微机原理'ANDC.grade>=80
查询结果:stnostnamecnamegrade---------------------------------------121001李贤友微机原理91121005刘刚微机原理8532SQLServer数据库教程(第3版)5.5连接查询【例5.21】查询选修了“801”课程的成绩高于学号为“1002”的成绩的学生姓名。
USEstscSELECTo,a.stno,a.gradeFROMscorea,scorebWHEREo='801'ANDa.grade>b.gradeANDb.stno='1002'ANDo='801'ORDERBYa.gradeDESC
查询结果:cnostnograde-------------------------8011220029580112100194801122004868011210058233SQLServer数据库教程(第3版)5.5连接查询5.5.2以JOIN关键字指定的连接T-SQL扩展了以JOIN关键字指定连接的表示方式,使表的连接运算能力有了增强。JOIN连接在FROM子句的<joined_table>中指定。语法格式
:<joined_table>::={<table_source><join_type><table_source>ON<search_condition>|<table_source>CROSSJOIN<table_source>|<joined_table>}说明:<join_type>为连接类型,ON用于指定连接条件,<join_type>的格式如下:[INNER|{LEFT|RIGHT|FULL}[OUTER][<join_hint>]JOININNER表示内连接,OUTER表示外连接,CROSS表示交叉连接,此为JOIN关键字指定的连接的3种类型。34SQLServer数据库教程(第3版)5.5连接查询1.内连接
内连接按照ON所指定的连接条件合并两个表,返回满足条件的行。
内连接是系统默认的,可省略INNER关键字。【例5.22】查询学生的情况和选修课程的情况。
USEstscSELECT*FROMstudentINNERJOINscoreONstudent.stno=score.stno
35SQLServer数据库教程(第3版)5.5连接查询【例5.23】查询选修了102课程且成绩在85分以上的学生情况。
USEstscSELECTa.stno,a.stname,o,b.gradeFROMstudentaJOINscorebONa.stno=b.stnoWHEREo='102'ANDb.grade>=85查询结果:
stnostnamecnograde-------------------------------------121001李贤友10292121005刘刚1028736SQLServer数据库教程(第3版)5.5连接查询2.外连接
在内连接的结果表,只有满足连接条件的行才能作为结果输出。外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接有以下3种:
●
左外连接(LEFTOUTERJOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行;
●
右外连接(RIGHTOUTERJOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行;●
完全外连接(FULLOUTERJOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。37SQLServer数据库教程(第3版)5.5连接查询【例5.24】采用左外连接查询教师任课情况。
USEstscSELECTteacher.tname,ameFROMteacherLEFTJOINcourseON(teacher.tno=course.tno)查询结果:tnamecno---------------------刘林卓102周学莉NULL吴波203王冬琴205李伟80138SQLServer数据库教程(第3版)5.5连接查询【例5.25】采用右外连接查询教师任课情况。USEstscSELECTteacher.tname,ameFROMteacherRIGHTJOINcourseON(teacher.tno=course.tno)查询结果:tnamecname-----------------------刘林卓数字电路吴波数据库系统王冬琴微机原理NULL计算机网络李伟高等数学
39SQLServer数据库教程(第3版)5.5连接查询
3.交叉连接【例5.26】采用交叉连接查询教师和课程所有可能组合。
USEstscSELECTteacher.tname,ameFROMteacherCROSSJOINcourse
查询结果:40SQLServer数据库教程(第3版)5.6子查询在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。在WHERE子句或HAVING子句所指定条件中,可以使用另一个查询块的查询的结果作为条件的一部分,这种将一个查询块嵌套在另一个查询块的子句指定条件中的查询称为嵌套查询。T-SQL允许SELECT多层嵌套使用。5.6.1
IN子查询
IN子查询用于进行一个给定值是否在子查询结果集中的判断,语法格式如下:
expression[NOT]IN(subquery)
当表达式expression与子查询subquery的结果集中的某个值相等时,IN谓词返回TRUE,否则返回FALSE。若使用了NOT,则返回的值相反。41SQLServer数据库教程(第3版)5.6子查询【例5.27】查询选修了课程号为203的课程的学生情况。USEstscSELECT*FROMstudentWHEREstnoIN(SELECTstnoFROMscoreWHEREcno='203')查询结果:stnostnamestsexstbirthdayspecialitytc-----------------------------------------------------122002谢萱女1992-09-11计算机52122004孙婷女1992-02-24计算机5042SQLServer数据库教程(第3版)5.6子查询【例5.28】查询选修某课程的学生人数多于4人的教师姓名。USEstscSELECTtnameAS'教师姓名'FROMteacherWHEREtnoIN(SELECTa.tnoFROMcoursea,scorebWHEREo=oGROUPBYa.tnoHAVINGCOUNT(a.tno)>4)查询结果:教师姓名--------------李伟43SQLServer数据库教程(第3版)5.6子查询
5.6.2比较子查询语法格式:expression{<|<=|=|>|>=|!=|<>|!<|!>}{ALL|SOME|ANY}(subquery)其中,expression为要进行比较的表达式,subquery是子查询,ALL、SOME和ANY是对比较运算的限制。【例5.29】查询比所有计算机专业学生年龄都小的学生。USEstscSELECT*FROMstudentWHEREstbirthday>ALL(SELECTstbirthdayFROMstudentWHEREspecialist='计算机')查询结果:44stnostnamestsexstbirthdayspecialitytc----------------------------------------------------121002周映雪女1993-01-12通信49SQLServer数据库教程(第3版)5.6子查询【例5.30】查询课程号801的成绩高于课程号205成绩的学生。
USEstscSELECTstnoAS'学号'FROMscoreWHEREcno='801'ANDgrade>=ANY(SELECTgradeFROMscoreWHEREcno='205')
45查询结果:学号--------------121001121002121005122002122004SQLServer数据库教程(第3版)5.6子查询5.6.3
EXISTS子查询EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE,如果为NOTEXISTS,其返回值与EXIST相反,其语法格式如下:[NOT]EXISTS(subquery)46查询结果:姓名------------李贤友周映雪刘刚SQLServer数据库教程(第3版)【例5.31】查询选修205课程的学生姓名。USEstscSELECTstnameAS'姓名'FROMstudentWHEREEXISTS(SELECT*FROMscoreWHEREscore.stno=student.stnoANDcno='205')5.6子查询【例5.32】查询所有认课教师姓名和学院。
USEstscSELECTtnameAS'教师姓名',schoolAS'学院'FROMteacheraWHEREEXISTS(SELECT*FROMcoursebWHEREa.tno=b.tno)47查询结果:教师姓名学院---------------------------刘林卓通信学院吴波计算机学院王冬琴计算机学院李伟数学学院SQLServer数据库教程(第3版)
5.7SELECT查询的其它子句
1.UNION
使用UNION可以将两个或多个SELECT查询的结果合并成一个结果集,其格式如下:
{<queryspecification>|(<queryexpression>)}UNION[ALL]<queryspecification>|(<queryexpression>)[UNION[ALL]<queryspecification>|(<queryexpression>)[…n]]
说明:
<queryspecification>和(<queryexpression>都是SELECT查询语句。
使用UNION合并两个查询的结果集的基本规则是:
●
所有查询中的列数和列的顺序必须相同。●
数据类型必须兼容。48SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.33】查询总学分大于50及学号小于1051的学生。
USEstscSELECT*FROMstudentWHEREtc>50UNIONSELECT*FROMstudentWHEREstno<105149查询结果:SQLServer数据库教程(第3版)tnostnamestsexstbirthdayspecialitytc----------------------------------------------------------121001李贤友
男1991-12-30通信52121002周映雪
女1993-01-12通信49121005刘刚
男1992-07-05通信50122002谢萱
女1992-09-11计算机525.7SELECT查询的其它子句2.EXCEPT和INTERSECT
语法格式:
{<query_specification>|(<query_expression>)}{EXCEPT|INTERSECT}{<query_specification>|(<query_expression>)}
说明:
<queryspecification>和<queryexpression>都是SELECT查询语句。
使用EXCEPT或INTERSECT的两个查询的结果集组合起来的基本规则:
●所有查询中的列数和列的顺序必须相同。
●
数据类型必须兼容。50SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.34】查询学过801课程但未学过102课程的学生。USEstscSELECTa.stnoAS'学号',a.stnameAS'姓名'FROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDo='801'EXCEPTSELECTa.stnoAS'学号',a.stnameAS'姓名'FROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDo='102‘
51学号姓名------------------122001郭德强122002谢萱122004孙婷查询结果:SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.35】查询既学过801课程又学过102课程的学生。USEstscSELECTa.stnoAS'学号',a.stnameAS'姓名'FROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDo='801'INTERSECTSELECTa.stnoAS'学号',a.stnameAS'姓名'FROMstudenta,courseb,scorecWHEREa.stno=c.stnoANDo=oANDo='102‘52查询结果:学号姓名-----------------121001李贤友121002周映雪121005刘刚SQLServer数据库教程(第3版)5.7SELECT查询的其它子句3.INTO子句
INTO子句用于创建新表并将查询所得的结果插入新表中。
语法格式:
[INTOnew_table]
说明:new_table是要创建的新表名,创建的新表的结构由SELECT所选择的列决定,新表中的记录由SELECT的查询结果决定,若SELECT的查询结果为空,则创建一个只有结构而没有记录的空表。53SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.36】由student表创建st表,包括学号、姓名、性别、专业和学分。USEstscSELECTstno,stname,stsex,specialist,tcINTOstFROMstudent该语句通过INTO子句创建新表st,新表的结构和记录由SELECT…INTO语句决定。54SQLServer数据库教程(第3版)5.7SELECT查询的其它子句4.CTE子句用于指定临时结果集,这些结果集称为公用表表达式(CommonTableExpression,CTE)。
语法格式:
[WITH<common_table_expression>[,...n]]<common_table_expression>::=expression_name[(column_name[,...n])]AS(CTE_query_definition)
说明:
●expression_name:CTE的名称。
●column_name:在CTE中指定的列名,其个数要和CTE_query_definition返回的字段个数相同。
●CTE_query_definition:指定一个其结果集填充CTE的SELECT语句。CTE下方的SELECT语句可以直接查询CTE中的数据。55SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.37】使用CTE从score表中查询学号、课程号和成绩,并指定新列名为c_stno、c_cno、c_grade,再使用SELECT语句从CTE和student表中查询姓名为”孙婷”的学号、课程号和成绩。
USEstsc;WITHcte_st(c_stno,c_cno,c_grade)AS(SELECTstno,cno,gradeFROMscore)SELECTc_stno,c_cno,c_gradeFROMcte_st,studentWHEREstudent.stname='孙婷'ANDstudent.stno=cte_st.c_stno
查询结果:c_stnoc_cnoc_grade----------------------------122004203811220048018656SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.38】计算从1到10的阶乘。WITHCfact(n,k)AS(SELECTn=1,k=1UNIONALLSELECTn=n+1,k=k*(n+1)FROMCfactWHEREn<10)SELECTn,kFROMCfact
57nk-----------------11223642451206720750408403209362880103628800SQLServer数据库教程(第3版)查询结果:5.7SELECT查询的其它子句5.FROM子句语法格式:
[FROM{<table_source>}[,…n]]<table_source>::={table_or_view_name[[AS]table_alias]|rowset_function[[AS]table_alias] /*行集函数*/[(bulk_column_alias[,...n])]|user_defined_function[[AS]table_alias]/*指定表值函数*/|OPENXML<openxml_clause> /*XML文档*/|derived_table[AS]table_alias[(column_alias[,...n])]/*子查询*/|<joined_table> /*连接表*/|<pivoted_table> /*将行转换为列*/|<unpivoted_table> /*将列转换为行*/}58SQLServer数据库教程(第3版)5.7SELECT查询的其它子句
说明:
●table_or_view_name:指定SELECT语句要查询的表或视图。
●rowset_function:rowset_function是一个行集函数,行集函数通常返回一个表或视图。●derived_table是由SELECT查询语句的执行而返回的表,必须使用为其指定一个别名,也可以为列指定别名。
●joined_table:joined_table为连接表。
●pivoted_table:将行转换为列。
●<unpivoted_table>:将列转换为行。59SQLServer数据库教程(第3版)5.7SELECT查询的其它子句【例5.39】查找student表中1992年12月31日以前出生的学生的姓名和性别,并列出其专业属于通信还是计算机,1表示是,0表示否。USEstscSELECTstname,stsex,通信,计算机FROMstudentPIVOT(COUNT(stno)FORspecialistIN(通信,计算机))ASpvtWHEREstbirthday<'1992-12-31'
60stnamestsex通信计算机---------------------------------郭德强男01李贤友男10刘刚男10孙婷女01谢萱女01SQLServer数据库教程(第3版)查询结果:5.7SELECT查询的其它子句【例5.40】将teacher表中职称和学院列转换为行输出。
USEstscSELECTtno,tname,选项,内容FROMteacherUNPIVOT(
内容FOR选项IN(title,school))unpvt
61SQLServer数据库教程(第3版)查询结果:tnotname选项内容--------------------------------------------102101刘林卓title教授102101刘林卓school通信学院102105周学莉title讲师102105周学莉school通信学院204101吴波title
教授204101吴波school计算机学院204107王冬琴title副教授204107王冬琴school计算机学院
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025四川雅安市交通建设(集团)有限责任公司招聘经营管理人员4人笔试历年参考题库附带答案详解
- 2026年字画基础鉴定实操试题及答案
- 2026年井冈山市工业园投资开发有限公司面向社会公开招聘工作人员考试备考题库及答案详解
- 2026年江西省南昌市中小学编制教师招聘笔试参考题库及答案详解
- 2026年眉山青神农商银行暑期实习生招聘笔试参考试题及答案详解
- 中国呼吸系统药物行业发展分析及投资价值预测研究报告
- 2026中国科学院南海海洋研究所海洋环流动力学学科组科研助理招聘1人考试备考试题及答案详解
- 煤气生产行业市场供需分析及投资评估规划分析研究报告
- 中国壁挂式紧急洗眼器行业市场发展趋势与前景展望战略研究报告
- 2025-2030自动驾驶汽车政策法规演进与基础设施配套发展报告
- 2026中国农业科学院蔬菜花卉所高层次人才引进11人(北京)笔试题库及完整答案详解一套
- 2026年广东省深圳市中考数学试卷真题及答案解析
- 2026公司安全生产管理制度及文件汇编(2026版)
- 新疆维吾尔自治区2026年中考数学真题
- 2026年铁路线路工技师考试试题库题库(答案+)
- 2025年事业单位规划设计岗面试题库及参考答案
- 西北农林科技大学2026年强基计划面试模拟试题及答案解析
- 2025年7月浙江省普通高中学业水平考试历史试卷(含答案)
- 2020-2021学年安徽省安庆市岳西县七年级(下)期末数学试卷(附答案详解)
- 山东省药品网络交易第三方平台备案表、网络销售企业报告信息表、链接网址
- 常用桥牌词语(中英文对照)
评论
0/150
提交评论