版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上节回顾1、什么是实体完整性?如何保证实体完整性?2、什么是参照完整性?如何保证参照完整性?任务1、设置姓名为唯一。2、使用altertable命令,为选课表添加外键约束。第四章数据查询学习目标掌握SELECT语句语法;熟练进行简单查询;掌握排序、分组聚合和分组筛选;掌握集合查询和连接查询的方法;掌握嵌套查询和窗口函数的应用;学会在数据更新中使用查询语句。任务在学生选课系统数据库中能根据按照指定的要求灵活、快速地查询相关信息。如:1、查询所有学生的学号,姓名和年龄。2、查询信息系学生的学号,姓名和出生年份。3、查询所有学生中年龄最大、最小的学生学号和姓名。4、查询女生人数,平均年龄。。。。4数据查询4.1SELECT语句4.2简单查询4.3集合查询4.4连接查询4.5嵌套查询4.6在数据更新中使用查询语句4.7窗口函数4.1SELECT语句SELECT<目标列名序列>--需要哪些列
FROM<数据源>--来自于哪些表
[WHERE<检索条件>]--根据什么条件
[GROUPBY<分组依据列>][HAVING<分组筛选条件>][ORDERBY<排序依据列>]INTO子句用于将查询结果插入新表中,其语法格式如下。SELECT[ALL︱DISTINCT][TOPN[PERCENT]列名1[,列名2,…列名N]INTO新表名
FROM表名或视图名INTO子句例:使用INTO子句创建一个包含学生学号、姓名和性别,并命名为new_Student的新表。在查询编辑器中执行如下Transact-SQL语句。USE学生选课GOSELECTSno,Sname,SsexINTOnew_StudentFROMStudentGO4.2简单查询选择表中若干列
1.查询指定的列查询表中部分属性列。例1:查询全部学生的学号与姓名。SELECTSno,SnameFROMStudent例2.查询全体学生的姓名、学号、所在系SELECTSname,Sno,Sdept FROMStudent2.查询全部列例3.查询全体学生的记录SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent等价于:
SELECT*FROMStudent
3.查询经过计算的列例4.查询全体学生的姓名及其出生年份。
SELECTSname,2023-Sage
FROMStudent4.常量列例5.查询全体学生的姓名,出生年份,所在系,并在出生年份列前加入一个列,此列每行数据均为“出生年份”常量值。SELECTSname,'出生年份',2023-Sage,sdeptFROMStudent5.显示列标题
语法:列名|表达式[AS]列标题或:列标题=列名|表达式例:
SELECTSname姓名,2023-Sage出生年份,所在系=sdeptFROMStudent
查询结果:4.2简单查询选择表中若干元组
1.消除重复的行例6.查询选修了课程的学生的学号SELECTSnoFROMSC有重复行!用DISTINCT去掉结果集中的重复行SELECTDISTINCTSnoFROMSC2.查询满足条件的元组(where)查询条件谓词比较运算符=,>,>=,<,<=,<>(或!=)NOT+比较运算符确定范围BETWEEN…AND,NOTBETWEEN…AND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL逻辑谓词AND,OR(1)比较大小例7.查询信息系全体学生的姓名。
SELECTSnameFROMStudentWHERESdept=‘信息系'例8.查询年龄在20岁以下的学生的姓名及年龄。
SELECTSname,SageFROMStudentWHERESage<20例9.查询考试成绩有不及格的学生的学号
SELECTDISTINCTSnoFROMSCWHEREGrade<60(2)确定范围用BETWEEN…AND和NOTBETWEEN…ANDBETWEEN…AND…的格式为:
列名|表达式[NOT]BETWEEN下限值AND上限值如果列或表达式的值在[不在]下限值和上限值范围内,则结果为True,表明此记录符合查询条件。示例例10.查询年龄在21~23岁之间的学生的姓名、所在系和年龄。SELECTSname,Sdept,SageFROMStudent WHERESageBETWEEN21AND23例11.查询年龄不在21~23之间的学生姓名、所在系和年龄。SELECTSname,Sdept,SageFROMStudent WHERESageNOTBETWEEN21AND23关于日期类型查询例12.查询2020年8月份出版的全部图书的详细信息。SELECT*FROM图书表
WHERE出版日期BETWEEN'2019/8/1'AND'2019/8/31'注意:日期类型的常量要用单引号括起来,而且年、月、日之间通常用分隔符隔开,常用的分隔符有“/”和“-”(3)确定集合使用IN运算符。用来查找属性值属于指定集合的元组。格式为:
列名[NOT]IN(常量1,常量2,…常量n)示例例13.查询信息系、数学系和计算机系学生的姓名和性别。
SELECTSname,SsexFROMStudent WHERESdeptIN('信息系','数学系','计算机系')例14.查询数学系和计算机系之外的其他系的学生姓名、性别和所在系。
SELECTSname,SsexFROMStudent WHERESdeptNOTIN(‘数学系','计算机系')(4)字符串匹配使用LIKE运算符一般形式为:
列名[NOT]LIKE<匹配串>匹配串中可包含如下四种通配符:_:匹配任意一个字符;%:匹配0个或多个字符;[]:匹配[]中的任意一个字符;对于连续字母的匹配,例如匹配[abcd],可简写为[a-d],
[^]:不匹配[]中的任意一个字符。
示例例15.查询姓‘张’的学生的详细信息。
SELECT*FROMStudentWHERESnameLIKE
'张%'例16.查询学生表中姓‘张’、‘王’和‘李’的学生的情况。
SELECT*FROMStudentWHERESnameLIKE
'[张王李]%'例17.查询名字中第2个字为‘小’或‘晓’的学生的姓名和学号。
SELECTSname,SnoFROMStudentWHERESnameLIKE
'_[小晓]%'示例例18.查询所有不姓“王”也不姓“李”的学生姓名
SELECTSnameFROMStudentWHERESnameNOTLIKE
'[王李]%'或者:
SELECTSnameFROMStudentWHERESnameLIKE'[^王李]%'或者:SELECTSnameFROMStudentWHERESnameNOTLIKE'王%'
ANDSnameNOTLIKE'李%'
示例例19.查询姓“刘”且名字是2个字的学生姓名。
SELECTSnameFROMStudentWHERESnameLIKE'刘_'
示例例20.查询姓刘且名字是3个字的学生姓名SELECTSnameFROMStudentWHERESnameLIKE'刘__'
注意:尾随空格需采用如下方法:
SELECTSnameFROMStudentWHERErtrim(Sname)LIKE'刘__'例21.在Student表中查询学号的最后一位不是1、3、5的学生信息。
SELECT*FROMStudentWHERESnoLIKE'%[^135]'转义字符如果要查找的字符串正好含有通配符,比如下划线或百分号,就需要使用一个特殊子句来告诉数据库管理系统这里的下划线或百分号是作为一个普通的字符,而不表示通配符,这个特殊的子句就是ESCAPE。ESCAPE的语法格式为:ESCAPE转义字符“转义字符”是任何一个有效的字符。在匹配串中包含转义字符,表明位于该字符后面的第一个字符是普通字符,而不是通配符。示例例如,查找“比例”字段中包含字符串“30%”的记录:
WHERE比例LIKE'%30!%%'ESCAPE'!'
查找“比例”字段中包含下划线(_)的记录:
WHERE比例LIKE'%!_%'ESCAPE'!'(5)有空值的查询空值(NULL)在数据库中表示不确定的值。例如,学生选修课程后还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成绩为空值。判断某个值是否为NULL值,不能使用普通的比较运算符。判断取值为空的语句格式为:列名ISNULL判断取值不为空的语句格式为:列名ISNOTNULL
示例例22.查询没有考试成绩的学生的学号和相应的课程号。
SELECTSno,CnoFROMSCWHEREGradeISNULL例23.查询所有有考试成绩的学生的学号和课程号。
SELECTSno,CnoFROMSCWHEREGradeISNOTNULL
课前练习1、查询所有选课学生的学号2、查询考试成绩有不及格的学生的学号3、查询既不姓郑又不姓王的学生学号和姓名4、查询信息系和数学系的学生姓名和所在系(6)多重条件查询在WHERE子句中可以使用逻辑运算符AND和OR来组成多条件查询。用AND连接的条件表示必须全部满足所有的条件的结果才为True;用OR连接的条件表示只要满足其中一个条件结果即为True。例24.查询计算机系年龄在20岁以下的学生姓名。
SELECTSnameFROMStudentWHERESdept='计算机系'
ANDSage<20
示例例25.查询计算机系和信息系年龄大于等于21岁的学生姓名、所在系和年龄。SELECTSname,Sdept,SageFROMStudentWHERE(Sdept='计算机系'
ORSdept='信息系')ANDSage>=21或:SELECTSname,Sdept,SageFROMStudentWHERESdeptIN('计算机系','信息系')ANDSage>=21
4.2简单查询对查询结果进行排序
对查询结果进行排序(orderby)排序子句为:
ORDERBY<列名>[ASC|DESC][,<列名>…]说明:按<列名>进行升序(ASC)或降序(DESC)排序,默认是按升序进行排序。示例例26.将学生按年龄的升序排序。
SELECT*FROMStudentORDERBYSage例27.查询选修了3号课程的学生的学号及其成绩,查询结果按成绩降序排列。SELECTSno,GradeFROMSC WHERECno='3'
ORDERBYGradeDESC
例28.查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。SELECT*FROMStudent
ORDERBYSdept,SageDESC
4.2简单查询使用聚合函数汇总数据
使用计算函数汇总数据SQL提供的聚合函数有:COUNT(*):统计表中元组个数;COUNT([DISTINCT]<列名>):统计本列列值个数;SUM([DISTINCT]<列名>):计算列值总和;AVG([DISTINCT]<列名>):计算列值平均值;MAX([DISTINCT]<列名>):求列值最大值;MIN([DISTINCT]<列名>):求列值最小值。上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。示例例29.统计学生总人数。
SELECTCOUNT(*)FROMStudent
例30.统计选修了课程的学生的人数。
SELECTCOUNT(DISTINCTSno)FROMSC例31.统计95002号学生的考试总成绩之和。SELECTSUM(Grade)FROMSCWHERESno='95002'
示例例32.计算选修1号课程学生的考试平均成绩。
SELECTAVG(Grade)FROMSCWHERECno='1'例33.查询1号课程的考试最高分和最低分。
SELECTMAX(Grade),MIN(Grade)FROMSCWHERECno='1'注意:计算函数不能出现在WHERE子句中示例例34.查询“95001”学生的选课门数、考试课程门数以及考试最高分、最低分和平均分。SELECTCOUNT(*)AS选课门数,
COUNT(Grade)AS考试门数,MAX(Grade)AS最高分,
MIN(Grade)AS最低分,AVG(Grade)AS平均分FROMSCWHERESno='95001'4.2简单查询对查询结果进行分组统计
对查询结果进行分组统计
作用:可以控制计算的级别:对全表还是对每一分组。目的:细化计算函数的作用对象。分组语句的一般形式: GROUPBY<分组依据列>[,…n]
[HAVING<组选择条件>](1)使用GROUPBY例35.统计每门课程的选课人数,列出课程号和人数。SELECTCnoas课程号,
COUNT(Sno)as选课人数FROMSCGROUPBYCno
对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生人数。SnoCnoGrade95001187950012769500137995001480950021899500418395004256CnoCount(Sno)13223141SnoCnoGrade95001187950021899500418395001276950042569500137995001480例36.查询每个学生的选课门数和最高分。SELECTSnoas学号,
COUNT(*)as选课门数,
MAX(Grade)as最高成绩FROMSCGROUPBYSno注意GROUPBY子句中的分组依据列必须是表中存在的列名,不能使用AS指派的列别名。例如,例36中不能将GROUBY子句写成:GROUPBY学号。带有GROUPBY子句的SELECT语句的查询列表中只能出现分组依据列或聚合函数,因为分组后每个组只返回一行结果。示例例37.统计每个系的学生人数和平均年龄。SELECTSdept,COUNT(*)AS学生人数,
AVG(Sage)AS平均年龄
FROMStudentGROUPBYSdept示例例38.带WHERE子句的分组。统计每个系的男生人数。SELECTSdept,Count(*)男生人数
FROMStudentWHERESsex='男'
GROUPBYSdept示例例39.按多列分组。统计每个系的男生人数和女生人数,以及男生的最大年龄和女生的最大年龄。结果按系名的升序排序。SELECTSdept,Ssex,Count(*)人数,
Max(Sage)最大年龄FROMStudentGROUPBYSdept,SsexORDERBYSdept(2)使用HAVINGHAVING用于对分组进行筛选,它有点象WHERE子句,但它用于分组而不是对单个记录。如:查询修了3门以上课程的学生的学号
SELECTSnoFROMSCGROUPBYSno
HAVINGCOUNT(*)>3
示例例40.查询选修了3门以上课程的学生的学号和选课门数。SELECTSno,Count(*)选课门数
FROMSCGROUPBYSnoHAVINGCOUNT(*)>3处理过程:先执行GROUPBY子句对SC表数据按Sno进行分组,然后再用统计函数COUNT分别对每一组进行统计,最后筛选出统计结果满足大于3的组。分组统计筛选处理过程示意图示例例41.查询修课门数等于或大于4的学生的平均成绩和选课门数。
SELECTSno,AVG(Grade)平均成绩,
COUNT(*)修课门数
FROMSCGROUPBYSno
HAVINGCOUNT(*)>=4
几个子句比较WHERE子句用来筛选FROM子句中指定的数据源所产生的行数据。GROUPBY子句用来对经WHERE子句筛选后的结果数据进行分组。HAVING子句用来对分组后的结果数据再进行筛选。示例例42.查询计算机系和数学系的学生人数。方法1:SELECTSdept,COUNT(*)FROMStudentGROUPBYSdeptHAVINGSdeptIN('计算机系','数学系')方法2:SELECTsdept,COUNT(*)FROMStudentWHERESdeptIN('计算机系','数学系')GROUPBYSdept第二种写法先筛选数据,再分组,效率更高。示例例43.查询每个系年龄小于等于21岁的学生人数。SELECTSdept,COUNT(*)FROMStudentWHERESage<=21GROUPBYSdept该查询语句不能写成:SELECTSdept,COUNT(*)FROMStudentGROUPBYSdeptHAVINGSage<=21练习1、查询数学系女生学号和姓名,查询结果按学号升序排列2、查询每个系学生人数,按人数降序排列3、查询选课人数在2人以上的课程的课程号4、查询选课门数大于等于3门的学生的学号,和选课门数,按选课门数的降序排列上节知识回顾1、查询选课人数大于等于3人的课程号和选课人数。4.3集合查询如果有多个不同的查询结果集,但又希望将它们按照一定的关系连接在一起,组成一组数据,这就可以用集合运算来实现。UNION(并)、INTERSECT(交)、EXCEPT(差)参加联合查询操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。集合并运算(UNION)集合并运算是将来自不同查询结果集合组合起来,形成一个查询结果集(并集),UNION操作会自动将重复元组去除。例44:查询选修了1号课程或选修了2号课程的学生的学号。集合交运算(INTERSECT)集合交运算是将来自不同查询结果集合中公共的元组组合起来,形成一个查询结果集(交集)。INTERSECT操作会自动将重复的元组去除。例45:查询既选修了1号课程又选修了2号课程的学生的学号。集合差运算(EXCEPT)集合差运算是将属于左查询结果集但不属于右查询结果的元组组合起来,形成一个查询查询集(差集)。例46:查询选修了1号课程但没有选修2号课程的学生的学号。集合运算举例例47:查询学生表,列出除数学系的女生外,所有学生的学号、姓名、所在系和性别。4.4连接查询若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询连接查询包括内连接、自身连接、外连接等。连接基础知识连接查询中用于连接两个表的条件称为连接条件或连接谓词。一般格式为:
[<表名1.>][<列名1>]<比较运算符>[<表名2.>][<列名2>]必须语义相同!内连接内连接语法如下:
SELECT…FROM表名[INNER]JOIN被连接表
ON连接条件执行连接操作的过程:首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2,…重复这个过程,直到表1中的全部元组都处理完毕为止。
示例例48.查询每个学生及其选课的详细信息。SELECT*FROMStudentINNERJOINSCONStudent.Sno=SC.Sno改进例1SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentJOINSCONStudent.Sno=SC.Sno示例例49.查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程号和成绩。
SELECTSname,Cno,GradeFROMStudentJOINSCONStudent.Sno=SC.SnoWHERESdept='计算机系'
表别名可以为表提供别名,其格式如下:
FROM<源表名>[AS]<表别名>为表指定别名可以简化表的书写。当为表指定了别名,在查询语句中的其他地方,所有用到表名的地方都要使用别名,而不能再使用原表名。示例例50.查询信息系修了“数据库”课程的学生信息,要求列出学生姓名、课程名和成绩。SELECTSname,Cname,GradeFROMStudentsJOINSCONs.Sno=SC.Sno
JOINCoursecONc.Cno=SC.CnoWHERESdept='信息系'
ANDCname='数据库'
示例例51.查询所有修了C++课程的学生的修课情况,要求列出学生姓名、所在系和选课成绩。SELECTSname,Sdept,GradeFROMStudentSJOINSCONS.Sno=SC.Sno
JOINCourseCONC.Cno=SC.cnoWHERECname='C++'示例例52.有分组的多表连接查询。统计每门课(列出课程名)的学生考试平均成绩。SELECTCname,AVG(grade)asAverageGradeFROMCoursecJOINSCONC.Cno=SC.CnoGROUPBYCname示例例53.有分组和行选择条件的多表连接查询。统计信息系每门课程的选课人数、平均成绩、最高成绩和最低成绩。SELECTCno,COUNT(*)ASTotal,AVG(Grade)asAvgGrade,MAX(Grade)asMaxGrade,MIN(Grade)asMinGrade
FROMStudentSJOINSCONS.Sno=SC.SnoWHERESdept=‘信息系'
GROUPBYCno2.自身连接为特殊的内连接相互连接的表物理上为同一张表。必须为两个表取别名,使之在逻辑上成为两个表。
FROM表1ASA1--在内存中生成“A1”表
JOIN表1ASA2--在内存中生成“A2”表示例例54.查询与刘超华在同一个系学习的学生的姓名和所在的系。SELECTS2.Sname,S2.SdeptFROMStudentS1JOINStudentS2ONS1.Sdept=S2.SdeptWHERES1.Sname='刘超华'
ANDS2.Sname!='刘超华'示例例55.查询与“数据库”学分相同的课程的课程名和学分。SELECTC1.Cname,C1.CreditFROMCourseC1JOINCourseC2ONC1.Credit=C2.CreditWHEREC2.Cname='数据库'3.外连接只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条件。
外连接的语法格式为:
FROM表1LEFT|RIGHT[OUTER]JOIN表2ON<连接条件>示例例56.查询学生的修课情况,包括修了课程的学生和没有修课的学生。SELECTStudent.Sno,Sname,Cno,GradeFROMStudentLEFTOUTERJOINSC ONStudent.Sno=SC.Sno示例例57.查询哪些课程没有人选,列出其课程号,课程名。SELECTC.cno,CnameFROMCourseCLEFTJOINSCONC.Cno=SC.CnoWHERESC.CnoISNULL示例例58.查询数学系没有选课的学生,列出学生的学号,姓名和性别。SELECTSno,Sname,SsexFROMStudentSLEFTJOINSCONS.Sno=SC.SnoWHERESdept='数学系'ANDSC.SnoISNULL示例例59.统计信息系每个学生的选课门数,包括没有选课的学生,结果按选课门数递减排序。SELECTS.Sno学号,COUNT(SC.Cno)选课门数FROMStudentSLEFTJOINSCONS.Sno=SC.SnoWHERESdept='信息系'GROUPBYS.SnoORDERBYCOUNT(SC.Cno)DESC当堂练习查询数学系男生的选课情况。查询选修了数据库的学生的学号和姓名。课前回顾1.查询和数据库同一学期开设的其他课程的课程名和学分。2.查询没有选课的学生的学号和姓名。4.5子查询(嵌套查询)在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块;子查询是一个SELECT查询,它嵌套在SELECT、INSERT、UPDATE、DELETE语句的WHERE或HAVING子句内,或其他子查询中;子查询的SELECT查询总是使用圆括号括起来。1.基于集合的子查询使用子查询表示查询的范围一般格式为:列名[NOT]IN(子查询)注意使用子查询进行基于集合的查询时,由子查询返回的结果集中的列的个数、数据类型以及语义必须与表达式中的列的个数、数据类型以及语义相同。当子查询返回结果之后,外层查询将用这个结果作为筛选条件。示例例60.查询与刘超华在同一个系的学生。
SELECTSno,Sname,SdeptFROMStudent WHERESdept= (SELECTSdeptFROMStudent WHERESname='刘超华'
)
ANDSname!='刘超华'
②①示例例61.查询成绩为大于80分的学生的学号、姓名。
SELECTSno,SnameFROMStudent WHERESnoIN (SELECTSnoFROMSC WHEREGrade>80)①②示例例62.查询计算机系选了“2”课程的学生,列出姓名和性别。
SELECTSname,SsexFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECno='2')ANDSdept='计算机系'用多表连接实现:SELECTSname,SsexFROMStudentS,ScWHERES.Sno=SC.SnoandSdept='计算机系'ANDCno='2'示例例63.查询选修了“数据库”课程的学生的学号和姓名。(1)在Course表中,找出“数据库”课程名对应的课程号;(2)根据得到的“数据库”课程号,在SC表中找出选了该课程号的学生的学号;(3)根据得到的学号,在Student表中找出对应的学生的学号和姓名。SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECnoIN(SELECTCnoFROMCourseWHERECname='数据库'))例64.在选修了数据库的这些学生中,统计他们的选课门数和平均成绩。SELECTSno学号,COUNT(*)选课门数,AVG(Grade)平均成绩FROMSCWHERESnoIN(--选数据库的学生SELECTSnoFROMSCJOINCourseCONC.Cno=SC.CnoWHERECname=‘数据库')GROUPBYSno2.进行比较测试带比较运算符的子查询指父查询与子查询之间用比较运算符连接,当用户能确切知道内层查询返回的是单值时,可用>、<、=、>=、<=、<>运算符。示例例65.查询选了“3”号课程且成绩高于此课程的平均成绩的学生的学号和成绩。首先计算“3”号课程的平均成绩:
SELECTAVG(Grade)fromSCWHERECno='3'--79然后,查找“3”号课程所有的考试成绩中,高于79的学生:SELECTSno,GradeFROMSCWHERECno='3'ANDGrade>79将两个查询语句合起来即为满足我们要求的查询语句:SELECTSno,GradeFROMSCWHERECno='3'ANDGrade>(SELECTAVG(Grade)FROMSCWHERECno='3')若无结果,请检查3前面是否有空格不相关子查询用子查询进行基于集合查询和比较查询时,都是先执行子查询,然后再在子查询的结果基础之上执行外层查询。子查询都只执行一次,子查询的查询条件不依赖于外层查询,我们将这样的子查询称为不相关子查询或嵌套子查询。示例例66.查询计算机系年龄最大的学生的姓名和年龄。SELECTSname,SageFROMStudentWHERESdept='计算机系'ANDSage=(SELECTMAX(Sage)FROMStudentWHERESdept='计算机系')示例例67.查询数据库考试成绩高于数据库平均成绩的学生的姓名、所在系和数据库成绩。SELECTSname,Sdept,GradeFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERECname='数据库'ANDGrade>(SELECTAVG(Grade)FROMSCJOINCourseCONC.Cno=SC.CnoWHERECname='数据库')3.存在性查询通常使用EXISTS谓词,其形式为: WHERE[NOT]EXISTS(子查询)带EXISTS谓词的子查询不返回查询的数据,只产生逻辑真值(有数据)和假值(没有数据)。例68.查询选修了1课程的学生姓名。SELECTSnameFROMStudent WHEREEXISTS (SELECT*FROMSC WHERESno=Student.Sno
ANDCno='1')
注意处理过程为:先外后内;由外层的值决定内层的执行;内层执行次数由外层结果数决定。由于EXISTS的子查询只能返回真或假值,因此在这里给出列名无意义。所以在有EXISTS的子查询中,其目标列表达式通常都用*。上句的处理过程
找外层表Student表的第一行,根据其Sno值处理内层查询由外层的值与内层的结果比较,由此决定外层条件的真、假顺序处理外层表Student表中的第2、3…行。示例例69.查询没有选修1号课程的学生姓名和所在系。SELECTSname,SdeptFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno='1')或:SELECTSname,SdeptFROMStudentWHERESnoNOTIN(SELECTSnoFROMSCWHERECno='1')注意:不能用连接查询和在子查询中否定的形式实现。4.with子句WITH子句用于定义公共表表达式(CommonTableExpression,CTE),可临时存储查询结果,简化复杂查询逻辑。CTE在单个查询中可被多次引用,提升代码可读性。其语法格式如下。WITHCTE名称AS(SELECT查询定义)主查询语句示例:查询选课门数大于平均选课门数的学生学号及选课门数。with选课统计as(selectsno,count(*)as选课门数fromscgroupbysno)selectsno,选课门数from选课统计where选课门数>(selectavg(选课门数)from选课统计)4.6在数据更新中使用查询语句4.6.1插入数据4.6.2更新数据4.6.3删除数据4.6.1插入数据在INSERT语句中使用SELECT子句的语法格式如下。INSERT[INTO]table_name[(column_list)]SELECTselect_listFROMtable_name[WHEREsearch_condition]一次插入多行数据例1:设stu_cs为计算机系的学生表,结构和student一致,但无数据,请将计算机系的学生信息添加进去。Insertintostu_csSelect*fromstudentWheresdept=‘计算机系’注意被插入的表的值列表必须和查询结果中的值列表的列按位置顺序对应,且数据类型一致。如果被插入的表后边没有指明列名,则查询结果的列的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)。4.6.2更新数据用UPDATE语句实现。格式:
UPDATE<表名>
SET<列名=表达式>[,…n][WHERE<更新条件>]基于其他表条件的数据更新例2:将计算机系全体学生的成绩加5分。(1)用子查询实现
UPDATESCSETGrade=Grade+5 WHERESnoIN (SELECTSnoFROMStudent WHERESdept='计算机系')(2)用多表连接实现UPDATESCSETGrade=Grade+5FROMSC,StudentWHERESC.Sno=Student.SnoAndSdept='计算机系'基于本表条件的数据更新例3.将学分最低的课程的学分加2分。UPDATECourseSETCredit=Credit+2WHERECredit=(SELECTMIN(Credit)FROMCourse)较复杂的数据更新例4.数学系学生的“信息系统”考试成绩增加10分。用子查询实现:UPDATESCSETGrade=Grade+10WHERECnoIN(SELECTCnoFROMCourseWHERECname='信息系统')ANDSnoIN(SELECTSnoFROMStudentWHERESdept='数学系')用多表连接实现:UPDATESCSETGrade=Grade+10FROMSCJOINCourseCONC.Cno=SC.CnoJOINStudentSONS.Sno=SC.SnoWHERECname='信息系统'ANDSdept='数学系'4.6.3删除数据用DELETE语句实现格式:DELETE[FROM]<表名>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年新教材译林版九年级上册英语Unit 2 Teenage problems单元知识清单
- 广东汕头市潮阳区文光镇二小学2024-2025学年五年级下学期期末语文试卷(文字版含答案)
- 2026年综合实践专职小学教师招聘考试笔试试题(含答案)
- 2026 年有机磷农药中毒急救护理个案分享
- 2026年秋季开学第一课:创新与创业启蒙
- 现代小区合租物业费分担标准合同二篇
- 停车场运营合作协议范本
- 2026年秋季初中地理开学第一课 学科知识体系构建课件
- “麻醉药品、精神药品”管理和使用培训考核试题(附答案)
- (完整版)土地复垦施工方案
- 2026-2030直升机市场发展现状调查及供需格局分析预测报告
- 剖宫产患者术前皮肤准备与护理
- (2026)高血压性脑出血重症管理专家共识课件
- 施工现场临边洞口防护标准化规范
- 建筑工程材料见证取样手册
- 反恐怖防范安全风险评估工作指南(试行)
- 污染治理和节能减碳专项2024年中央预算内投资备选项目资金申请报告
- 李叔同简介课件
- CMBS业务培训课件
- 球房承包合同协议书
- 河北省科技厅课题申报书
评论
0/150
提交评论