【文档说明】数据库系统概论第四版第3章的关系数据库标准语言SQL1-课件.ppt,共(82)页,431.523 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92475.html
以下为本文档部分文字说明:
2022/12/5AnIntroductiontoDatabaseSystem洛阳理工学院计算机与信息工程系数据库系统概论AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL2022/1
2/5AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL3.1SQL概述3.2学生-课程数据库3.3数据定义3.4数据查询3.5数据更新3.6视图3.6小结2022/12/5AnIntroducti
ontoDatabaseSystem3.1SQL概述SQL的特点1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供两种使用方法5.语言简洁,易学易用2022/12/5AnI
ntroductiontoDatabaseSystem5.语言简捷,易学易用表3.1SQL语言的动词SQL功能动词数据定义CREATE,DROP,ALTER数据查询SELECT数据操纵INSERT,UPDATEDELETE数
据控制GRANT,REVOKE2022/12/53.2学生-课程数据库由三个表构成:1学生表Student(Sno,Sname,Ssex,Sage,Sdept)2课程表Course(Cno,Cname,Cpno,Ccredit)3学生选课表SC(Sno,Cno,Grade)2022
/12/5AnIntroductiontoDatabaseSystem第三章关系数据库标准语言SQL3.1SQL概述3.2学生-课程数据库3.3数据定义3.4数据查询3.5数据更新3.6视图3.6小结2022/12/5AnIntroductiontoDa
tabaseSystem3.3数据定义表3.2SQL的数据定义语句操作方式操作对象创建删除修改表CREATETABLEDROPTABLEALTERTABLE视图CREATEVIEWDROPVIEW索引CREATEINDEXDROPINDEX202
2/12/5Createdatabasedata_nameOn(filename=“”size=)Logon(Filename=“”size=)AnIntroductiontoDatabaseSystem2022/12/5AnIntrodu
ctiontoDatabaseSystem3.3.1定义语句格式CREATETABLE<表名>(<列名><数据类型>[<列级完整性约束条件>][,<列名><数据类型>[<列级完整性约束条件>]]…[,<表级完整性约束条件>]);<表名>:所要定义的基
本表的名字<列名>:组成该表的各个属性(列)<列级完整性约束条件>:涉及相应属性列的完整性约束条件<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件2022/12/5AnIntroductiontoDatabaseSystem例题[
例1]建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,SnameCHAR(
20)UNIQUE,SsexCHAR(1),SageINT,SdeptCHAR(15));2022/12/5AnIntroductiontoDatabaseSystem定义基本表(续)常用完整性约束主码约束:PRIMARYKEY唯一性约束:UNIQUE非空值约束:NOTNULL参
照完整性约束PRIMARYKEY与UNIQUE的区别?2022/12/5AnIntroductiontoDatabaseSystem例题(续)[例2]建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno,Cno)为主码。CREAT
ETABLESC(SnoCHAR(5),CnoCHAR(3),Gradeint,Primarykey(Sno,Cno));2022/12/5AnIntroductiontoDatabaseSystem例题(续)SnoSnameSsexSageSdept↑↑↑↑↑字符型字符型字
符型整数字符型长度为5长度为20长度为1长度为15不能为空值2022/12/5AnIntroductiontoDatabaseSystem三、删除基本表DROPTABLE<表名>;基本表删除数据、表上的
索引都删除表上的视图往往仍然保留,但无法引用删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述(标准中没有,认为表建立后就永久存在)2022/12/5AnIntroductiontoDatabaseSystem例题[例5]删除Student表DROPTABL
EStudent;2022/12/5AnIntroductiontoDatabaseSystem二、修改基本表ALTERTABLE<表名>[ADD<新列名><数据类型>[完整性约束]][DROP<完整性约束名>][MODIFY<列名><数据类型>];<表名
>:要修改的基本表ADD子句:增加新列和新的完整性约束条件DROP子句:删除指定的完整性约束条件MODIFY子句:用于修改列名和数据类型2022/12/5AnIntroductiontoDatabaseSystem例题[例2]向Student表增加“入学时间”列,其数据类型为日期型
。ALTERTABLEStudentADDScomeDATE;不论基本表中原来是否已有数据,新增加的列一律为空值。2022/12/5AnIntroductiontoDatabaseSystem语句格式(续)删除属性列直
接/间接删除把表中要保留的列及其内容复制到一个新表中删除原表再将新表重命名为原表名直接删除属性列:(新)例:ALTERTABLEStudentDropScome;2022/12/5AnIntroductiontoDatabaseSystem[例3]将年龄的数据类型改为半字长整数。
ALTERTABLEStudentMODIFYSageSMALLINT;注:修改原有的列定义有可能会破坏已有数据2022/12/5AnIntroductiontoDatabaseSystem例题[例4]删除学生姓名必须取唯一值的约束。ALTERTABLEStudentDROPUNIQUE(Sna
me);2022/12/5AnIntroductiontoDatabaseSystem3.3.2建立与删除索引建立索引是加快查询速度的有效手段建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引PRIMARYKEYU
NIQUE维护索引DBMS自动完成使用索引DBMS自动选择是否使用索引以及使用哪些索引2022/12/5AnIntroductiontoDatabaseSystem一、建立索引语句格式CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON
<表名>(<列名>[<次序>][,<列名>[<次序>]]…);用<表名>指定要建索引的基本表名字索引可以建立在该表的一列或多列上,各列名之间用逗号分隔用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUN
IQUE表明此索引的每一个索引值只对应唯一的数据记录CLUSTER表示要建立的索引是聚簇索引2022/12/5AnIntroductiontoDatabaseSystem例题[例6]为学生-课程数据库中的Student,Cour
se,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);CREATE
UNIQUEINDEXCoucnoONCourse(Cno);CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);2022/12/5AnIntroductiontoDatabaseSyste
m建立索引(续)唯一值索引对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束2022/12/5AnIntroduction
toDatabaseSystem建立索引(续)聚簇索引建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致例:CREATECLUSTERINDEXStusnameONStuden
t(Sname);在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放2022/12/5AnIntroductiontoDatabaseSystem建立索引(续)在一个基本表上最多只能
建立一个聚簇索引聚簇索引的用途:对于某些类型的查询,可以提高查询效率聚簇索引的适用范围很少对基表进行增删操作很少对其中的变长列进行修改操作2022/12/5AnIntroductiontoDatabaseSystem二、删除索引DROPINDEX<索引名>;删除索引时,系统会从
数据字典中删去有关该索引的描述。[例7]删除Student表的Stusname索引。DROPINDEXStusname;2022/12/5AnIntroductiontoDatabaseSystem3.4查询3.4.1概述3.4.2单表查询3.4.3连接查询3.4.4嵌套查询3.4.5集合查
询3.4.6小结2022/12/5AnIntroductiontoDatabaseSystem3.4.1概述语句格式SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>]…[WHERE<
条件表达式>][GROUPBY<列名1>[HAVING<条件表达式>]][ORDERBY<列名2>[ASC|DESC]];2022/12/5AnIntroductiontoDatabaseSystem语句格式SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHE
RE子句:指定查询条件GROUPBY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。HAVING短语:筛选出只有满足指定条件的组ORDERBY子句:对查询结果表按指定列值的升序或降序排序2022/12/5AnIntroductionto
DatabaseSystem示例数据库学生-课程数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade)2022/12/5AnIntrod
uctiontoDatabaseSystem3.4查询3.4.1概述3.4.2单表查询3.4.3连接查询3.4.4嵌套查询3.4.5集合查询3.4.6小结2022/12/5AnIntroductiontoDatabaseSystem3.4.2单表查询查询仅涉及一个表,是一种最
简单的查询操作一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用集函数五、对查询结果分组2022/12/5AnIntroductiontoDatabaseSystem查询指定列[例1]查询全体学生的学号与姓名。SELECTSno,SnameFROMStudent;[例2
]查询全体学生的姓名、学号、所在系。SELECTSname,Sno,SdeptFROMStudent;2022/12/5AnIntroductiontoDatabaseSystem查询全部列[例3]查询全体学生的详细记录
。SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent;或SELECT*FROMStudent;2022/12/5AnIntroductiontoDatabaseSystem
3.查询经过计算的值SELECT子句的<目标列表达式>为表达式算术表达式字符串常量函数列别名等2022/12/5AnIntroductiontoDatabaseSystem3.查询经过计算的值[例4]查全体学生的姓名及其出生年份。SELE
CTSname,2000-SageFROMStudent;输出结果:Sname2000-Sage----------------------李勇1976刘晨1977王名1978张立19782022/12/5AnIntroduction
toDatabaseSystem3.查询经过计算的值[例5]查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECTSname,'YearofBirth:',2000-Sage,ISLOWER(Sdept
)FROMStudent;2022/12/5AnIntroductiontoDatabaseSystem例题(续)输出结果:Sname'YearofBirth:'2000-SageISLOWER(Sdept)--------------------------
--------------------李勇YearofBirth:1976cs刘晨YearofBirth:1977is王名YearofBirth:1978ma张立YearofBirth:1977is2022/12/5AnIntroductiontoData
baseSystem[例]使用列别名改变查询结果的列标题SELECTSnameNAME,'YearofBirth:’BIRTH,2000-SageBIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROMStudent;输出结果:NAMEBIRTHBIRTHDAYDEP
ARTMENT------------------------------------------------------李勇YearofBirth:1976cs刘晨YearofBirth:1977is王名YearofBirth:1978ma张立YearofBirth
:1977is2022/12/5AnIntroductiontoDatabaseSystem二、选择表中的若干元组消除取值重复的行查询满足条件的元组2022/12/5AnIntroductiontoData
baseSystem1.消除取值重复的行在SELECT子句中使用DISTINCT短语假设SC表中有下列数据SnoCnoGrade---------------------95001192950012859500138895002290950023802022/12/5AnIn
troductiontoDatabaseSystemALL与DISTINCT[例6]查询选修了课程的学生学号。(1)SELECTSnoFROMSC;或(默认ALL)SELECTALLSnoFROMSC;结果:Sno-------9500195001950019
5002950022022/12/5AnIntroductiontoDatabaseSystem例题(续)(2)SELECTDISTINCTSnoFROMSC;结果:Sno-------95001950
022022/12/5AnIntroductiontoDatabaseSystem例题(续)注意DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECTDISTIN
CTCno,DISTINCTGradeFROMSC;正确的写法SELECTDISTINCTCno,GradeFROMSC;2022/12/5AnIntroductiontoDatabaseSystem2.查询满足条件的元组表3.3常用的查询条件查询条件谓词比较=,>,<,>=,<=,!=,<
>,!>,!<;NOT+上述比较运算符确定范围BETWEENAND,NOTBETWEENAND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重条件AND,ORWHER
E子句常用的查询条件2022/12/5AnIntroductiontoDatabaseSystem(1)比较大小在WHERE子句的<比较条件>中使用比较运算符=,>,<,>=,<=,!=或<>,!>,!<,逻辑运算符NOT+比较运算符[例8]查询所有年龄在20岁以下的学生姓名及其年龄。S
ELECTSname,SageFROMStudentWHERESage<20;或SELECTSname,SageFROMStudentWHERENOTSage>=20;2022/12/5AnIntroductiontoDatabaseSystem(2)确定范围使
用谓词BETWEEN…AND…NOTBETWEEN…AND…[例10]查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECTSname,Sdept,SageFROMStudentW
HERESageBETWEEN20AND23;2022/12/5AnIntroductiontoDatabaseSystem例题(续)[例11]查询年龄不在20~23岁之间的学生姓名、系别和年龄。SELECTSname,Sdep
t,SageFROMStudentWHERESageNOTBETWEEN20AND23;2022/12/5AnIntroductiontoDatabaseSystem(3)确定集合使用谓词IN<值表>,NOTIN<值表>
<值表>:用逗号分隔的一组取值[例12]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptIN('IS','MA','CS')
;2022/12/5AnIntroductiontoDatabaseSystem(3)确定集合[例13]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptNOTIN('IS','MA','CS');2022/1
2/5AnIntroductiontoDatabaseSystem(4)字符串匹配[NOT]LIKE„<匹配串>‟[ESCAPE„<换码字符>‟]<匹配串>:指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,可以用=运算符取代LI
KE谓词用!=或<>运算符取代NOTLIKE谓词2022/12/5AnIntroductiontoDatabaseSystem通配符%(百分号)代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab等都满足该匹配串_
(下横线)代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串2022/12/5AnIntroductiontoDatabaseSystemESCAPE短语:当用户要查询的字符串本身就含有%或_时,要使用ESCAPE'<换码字符
>'短语对通配符进行转义。2022/12/5AnIntroductiontoDatabaseSystem例题1)匹配模板为固定字符串[例14]查询学号为95001的学生的详细情况。SELECT*FROMStudentWHERESnoLIKE'95001';等价于:S
ELECT*FROMStudentWHERESno='95001';2022/12/5AnIntroductiontoDatabaseSystem例题(续)2)匹配模板为含通配符的字符串[例15]查询所有姓刘学生的姓名、学号和性别。SELECTSname
,Sno,SsexFROMStudentWHERESnameLIKE„刘%‟;2022/12/5AnIntroductiontoDatabaseSystem例题(续)匹配模板为含通配符的字符串(续)[例16]查询姓"欧阳"且
全名为三个汉字的学生的姓名。SELECTSnameFROMStudentWHERESnameLIKE'欧阳__';2022/12/5AnIntroductiontoDatabaseSystem例题(续)匹配模板为含通配
符的字符串(续)[例17]查询名字中第2个字为"阳"字的学生的姓名和学号。SELECTSname,SnoFROMStudentWHERESnameLIKE'__阳%';2022/12/5AnIntroductiontoDatabaseSystem例题(续)匹配模板为含通配符的字符
串(续)[例18]查询所有不姓刘的学生姓名。SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE'刘%';2022/12/5AnIntroductiontoDatabaseSystem例题(续)3)使用换码字符将通配符转义为
普通字符[例19]查询DB_Design课程的课程号和学分。SELECTCno,CcreditFROMCourseWHERECnameLIKE'DB\_Design'ESCAPE'\'2022/12/5AnInt
roductiontoDatabaseSystem例题(续)使用换码字符将通配符转义为普通字符(续)[例20]查询以"DB_"开头,且倒数第3个字符为i的课程的详细情况。SELECT*FROMCourseWHERECnameLIKE'DB\_%i__'E
SCAPE'\';2022/12/5AnIntroductiontoDatabaseSystem(5)涉及空值的查询使用谓词ISNULL或ISNOTNULL“ISNULL”不能用“=NULL”代替[例
21]某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECTSno,CnoFROMSCWHEREGradeISNULL;2022/12/5AnIntroductiontoDatabaseSystem例题(续)[例22]
查所有有成绩的学生学号和课程号。SELECTSno,CnoFROMSCWHEREGradeISNOTNULL;2022/12/5AnIntroductiontoDatabaseSystem(6)多重条件
查询用逻辑运算符AND和OR来联结多个查询条件AND的优先级高于OR可以用括号改变优先级可用来实现多种其他谓词[NOT]IN[NOT]BETWEEN…AND…2022/12/5AnIntroductiontoDatabaseSystem例题[例23]查询计算机系年龄在20岁以下的学生姓名
。SELECTSnameFROMStudentWHERESdept='CS'ANDSage<20;2022/12/5AnIntroductiontoDatabaseSystem改写[例12][例12]
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECTSname,SsexFROMStudentWHERESdeptIN('IS','MA','CS')可改写为:SELECTSname,SsexFROMS
tudentWHERESdept='IS'ORSdept='MA'ORSdept='CS';2022/12/5AnIntroductiontoDatabaseSystem改写[例10][例10]查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECTSn
ame,Sdept,SageFROMStudentWHERESageBETWEEN20AND23;可改写为:SELECTSname,Sdept,SageFROMStudentWHERESage>=20ANDSage<=23;2022/12/5AnIntroductiontoDatabase
System三、对查询结果排序使用ORDERBY子句可以按一个或多个属性列排序升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示2022/12/
5AnIntroductiontoDatabaseSystem对查询结果排序(续)[例24]查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECTSno,GradeFROMSCWHERECno='3'ORDERBYGrade
DESC;2022/12/5AnIntroductiontoDatabaseSystem查询结果SnoGrade--------------95010950249500792950038295010829500975950146
195002552022/12/5AnIntroductiontoDatabaseSystem对查询结果排序(续)[例25]查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT*FROMStudentORDERBYS
dept,SageDESC;2022/12/5AnIntroductiontoDatabaseSystem四、使用集函数5类主要集函数计数COUNT([DISTINCT|ALL]*)COUNT([DISTINCT|ALL]
<列名>)计算总和SUM([DISTINCT|ALL]<列名>)计算平均值AVG([DISTINCT|ALL]<列名>)2022/12/5AnIntroductiontoDatabaseSystem使用集函数(续
)求最大值MAX([DISTINCT|ALL]<列名>)求最小值MIN([DISTINCT|ALL]<列名>)–DISTINCT短语:在计算时要取消指定列中的重复值–ALL短语:不取消重复值–ALL为缺省值2022/12/5AnIntroductiontoDatabaseSystem使
用集函数(续)[例26]查询学生总人数。SELECTCOUNT(*)FROMStudent;[例27]查询选修了课程的学生人数。SELECTCOUNT(DISTINCTSno)FROMSC;注:用DISTINCT以避免重复计算学生
人数2022/12/5AnIntroductiontoDatabaseSystem使用集函数(续)[例28]计算1号课程的学生平均成绩。SELECTAVG(Grade)FROMSCWHERECno='1';[例29]查询选修1号课程的学生最高分数。SELECTMAX(Grade)FR
OMSCWHERCno='1';2022/12/5AnIntroductiontoDatabaseSystem五、对查询结果分组使用GROUPBY子句分组细化集函数的作用对象未对查询结果分组,集函数将作用于整个查询结果对查询结果分组后,集函数将分别作用于每个组2
022/12/5AnIntroductiontoDatabaseSystem使用GROUPBY子句分组[例30]求各个课程号及相应的选课人数。SELECTCno,COUNT(Sno)FROMSCGROUPBYCno
;结果CnoCOUNT(Sno)1222343444335482022/12/5AnIntroductiontoDatabaseSystem对查询结果分组(续)GROUPBY子句的作用对象是查询的中间结果表分组方法:按
指定的一列或多列值分组,值相等的为一组使用GROUPBY子句后,SELECT子句的列名列表中只能出现分组属性和集函数2022/12/5AnIntroductiontoDatabaseSystem使用HAVING短语筛选最终输出结果[例31]查询选修了3门以上课
程的学生学号。SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)>3;2022/12/5AnIntroductiontoDatabaseSystem例题[例32]查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数SELECTSno,C
OUNT(*)FROMSCWHEREGrade>=90GROUPBYSnoHAVINGCOUNT(*)>=3;2022/12/5AnIntroductiontoDatabaseSystem使用HAVING短语筛选最终输出结果只有满足HAVING短语指定条件的组才输出HAVING短语与
WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。2022/12/5AnIntroductiontoDatabas
eSystem下课了。。。休息一会儿。。。