




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 内容可修改电子课件数据库基础与应用(微课版 第3版)第3章第3章 关系数据库标准语言SQL 3.1 SQL概述SQL(Structured Query Language):关系数据库的标准语言包含了关系代数的运算 ,并进行了扩充ISO/IEC 负责SQL标准的制定各数据库厂商实现的SQL有差异3.1.1 SQL的产生与发展IBM开发了SQL的最初版本SQL的前身是1972年提出的SQUARE(Specifying Queries As Relational Expression) 1974年修改为SEQUEL(Structured English Query Language)SQL标准:S
2、QL-86、SQL-89、SQL-92、SQL:1999、SQL:2003、SQL:2008、 SQL:2011、SQL:2016、SQL:2019 标准不断演变的主要原因是因为引入了新的数据模型:面向对象、XML、.SQL标准分为强制和可选两个部分,数据库厂家必须实现强制部分 从SQL:1999标准后,强制部分的内容变化不大 本书主要介绍SQL:1999标准的部分内容。3.1.2 SQL的组成SQL包括了对数据库的所有操作,从功能上可以分为以下4个部分:数据定义语言(Data Definition Language,DDL)定义数据库的逻辑结构,包括定义表、视图和索引数据定义语言只是定义结构
3、,不涉及具体的数据数据定义语句的执行结果会保存在数据字典数据操纵语言(Data Manipulation Language,DML) 包括查询和更新两大类操作 查询包括选择、投影、连接等运算 更新包括插入、删除和修改操作3.1.2 SQL的组成数据控制语言(Data Control Language,DCL) 包括对关系和视图的访问权限的描述,以及对事务的控制语句。嵌入式SQL和动态SQL(Embeded SQL and Dynamic SQL ) 规定了在诸如C、Fortran、Cobol等宿主语言使用SQL的规则。3.1.3 SQL的特点综合统一 SQL集数据定义语言、数据操纵语言、数据控
4、制语言的功能于一身,语言风格统一, 操作符统一,查询、插入、删除、更新等操作都只需一种操作符 高度非过程化 只要提出“做什么”,而无须指明“怎么做”。“怎么做”由系统自动完成。 用户是在数据库的逻辑结构(关系模型)层次上使用数据库,无须了解数据库的物理结构面向集合的操作方式 操作对象、操作结果都是关系语言简洁、易学易用 核心概念9个动词 3.1.3 SQL的特点SQL功能动 词数据查询SELECT数据定义CREATE、DROP、ALTER数据操纵INSERT、UPDATE、DELETE数据控制GRANT、REVOKE3.2 数据类型和表的定义SQL定义了若干数据类型,数据类型即关系模型的域SQ
5、L使用表(table)指代关系模型的关系3.2.1 数据类型SQL标准的数据类型分为以下4类:串(String)字符串(character string)定长(CHARACTER) 、变长(CHARACTER VARYING和CHARACTER LARGE OBJECT)一个字符串中的字符必须来自同一个字符集,字符集是文字和符号的集合 常见的字符集有GB2312、GB18030、UNICODE等。字符集规定了排序规则(Collation) 用于比较字符集中字符的大小, 一个字符集有一个或多个排序规则。同一个字符集还可能有不同的编码方案,如UNICODE有UTF8、UTF16和UTF32编码方案
6、。 字节串(binary string) 定长(BINARY)、变长(BINARY VARYING和BINARY LARGE OBJECT) 字节串不涉及字符集和排序规则 3.2.1 数据类型位串(bit string) 位串是一个bit序列。定长(BIT)、变长(BIT VARYING) 数字精确数值INTEGERSMALLINT NUMERICDECIMAL近似数值FLOAT : 24个二进制位尾数 REALDOUBLE PRECISION : 53个二进制位的尾数 3.2.1 数据类型布尔类型truefalse日期、时间和区间DATE : 年、月、日TIME :时、分、秒TIMESTAM
7、P : 年、月、日、时、分、秒INTERVAL : 2个日期量之间的间隔3.2.1 数据类型数据类型描述符含 义CHAR(n)长度为n的定长字符串VARCHAR(n)最大长度为n的变长字符串INT长整数(也可以写作INTEGER)SMALLINT短整数NUMERIC(p, d)定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位数字REAL取决于机器精度的浮点数DOUBLE PRECISION取决于机器精度的双精度浮点数FLOAT(n)浮点数,精度至少为n位数字DATE日期,包含年、月、日,格式为YYYY-MM-DDTIME时间,包含时、分、秒,格式为HH:MM:SS注意:不同的数据
8、库管理系统提供的数据类型与SQL标准存在差异SQL Server的数据类型:3.2.2 表的定义表的定义就是定义一个关系模式表的名字、列(属性)的名字和类型完整性CREATETABLE(列级完整性,列级完整性),;3.2.2 表的定义例3.1 建立表Student,Sno作为主码。CREATETABLEStudent (SnoCHAR(7)PRIMARYKEY,SnameCHAR(8),SsexCHAR(2),SageSMALLINT,SdeptCHAR(20);实体完整性(列级) :如果单列构成主码,则在该列后紧跟PRIMARY KEY子句3.2.2 表的定义例3.2 建立SC表,Sno和C
9、no是主码。CREATETABLESC (SnoCHAR(7),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno);实体完整性(表级) :如果多列构成主码,仍然使用PRIMARY KEY子句定义主码, 但该子句要作为单独的一行。3.2.2 表的定义例3.3 建立Course表,Cno是主码,Cpno是外码,引用Course表的主码Cno列。 CREATETABLECourse(CnoCHAR(4)PRIMARYKEY,CnameCHAR(40),CpnoCHAR(4),CcreditSMALLINT,FOREIGNKEY(Cpno)REFERENCESCo
10、urse(Cno);引用完整性:FOREIGN子句3.2.2 表的定义例3.4 建立SC表,Sno和Cno构成主码,Sno、Cno也是外码,分别引用Student表的主码Sno列和Course表的主码Cno列。CREATETABLESC (SnoCHAR(7),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno),FOREIGNKEY(Cno)REFERENCESCourse(Cno);3.2.2 表的定义例3.5 当学生的性别是男时,其名字不能以Ms.打头。 CREATETABLE
11、Student (SnoCHAR(7)PRIMARYKEY,SnameCHAR(8)NOTNULL,SsexCHAR(2),SageSMALLINT,SdeptCHAR(20),CHECK(Ssex=女ORSnameNOTLIKEMs.%);其他完整性3.2.2 修改表的定义ALTERTABLEADD完整性DROPMODIFY;表建立好以后,一般不会再修改。但随着应用环境和应用需求的变化,偶尔要修改已建立好的表。SQL用ALTER TABLE语句修改表,许多DBMS有独自的格式,其一般格式为:3.2.2 修改表的定义例3.6 向Student表增加“入学时间”列,其数据类型为日期型。ALTER
12、TABLEStudentADDScomeDATE;不论表中原来是否已有数据,新增加的列一律为空值。例3.7 删除学生姓名不能取空值的约束。ALTERTABLEStudentDROPNOTNULL(Sname);3.2.2 删除表的定义当不再需要某个表时,可以使用DROP TABLE语句删除它,其一般格式为:DROPTABLE例3.8 删除Student表。DROPTABLEStudent;表一旦被删除,表的定义、表中的数据及在表上建立的索引和视图都将自动删除。3.3 数据查询查询是指从数据库中找到感兴趣的数据。SQL的SELECT语句用于查询,它集成了关系代数的选择、投影、连接以及集合运算并增
13、加了分组、排序等功能SELECTALL|DISTINCT别名,别名FROM别名,别名WHEREGROUPBYHAVINGORDERBYASC|DESC,ASC|DESC;Student(Sno, Sname, Ssex, Sage, Sdept)SELECTSno,SnameFROMStudent例3.9 查询全体学生的学号和姓名SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波3.3.1 单表查询: SELECT-FROM数据来在哪里?保留(选择)哪些列?SnoSnameSsexSageSdept2000012王林男19计算机2000
14、113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机3.3.1 单表查询SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波Sno, Sname(Student)SELECTSno,SnameFROMStudent;SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机SQL语句基于关系代数例3.10 查询所有课程的详细记录(全部列)3.3.1 单表查询:全部列 *CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024
15、数据库原理113641136离散数学112841030物理4SELECTCno,Cname,Cpno,CcreditSELECT*FROMCourse;FROMCourse;列出全部的列(次序根据需要)语句的操作对象是Course语句的结果是什么?*代表全部的列(次序同CREATE)SELECTCno,Cname,Ccredit, CpnoFROMCourse;3.3.1 单表查询: 表达式和重命名SELECTSname,YEAR(SYSDATETIME()-Sage ASBirthday FROMStudent;例3.11 查询全体学生的姓名及其出生年份 SnoSname2000012王林2
16、000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机SELECT子句可以将表达式的计算结果作为新的列SnameBirthday王林1999葛波2000张大民2000顾芳1999姜凡1999表达式:常数列函数操作符列重命名: AS 新名3.3.1 单表查询SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机SELECTHello AS Greeting, Snam
17、eFROMStudent;GreetingSnameHello王林Hello葛波Hello张大民Hello顾芳Hello姜凡3.3.1 单表查询:去重DISTINCTSELECTSdeptFROMStudent;例3.11 列出Student表的所有系 SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机Sdept计算机计算机管 理管 理管 理集合不允许有重复的元素允许有重复的元素的集合叫做包SELECT的默认结果是包3.3.1 单表查询SELECT DIST
18、INCT SdeptFROMStudent;DISTINCT 去除重复的行,将包变换成集合DISTICT 必须在SELECT之后,第1个列之前只能有1个DISTICT Sdept计算机管 理3.3.1 单表查询:WHERESELECT *FROMStudent例3.13 查询计算机系学生的详细信息SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机WHERESdept = 计算机 ;WHERE : 哪里?即表中哪些行? 给出这些行的特征(列值满足的条件)* (
19、Sdept =计算机 (Student) SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机3.3.1 单表查询: SELECT-FROM-WHERE的执行过程SELECTSno,SnameFROMStudentWHERE Sdept = 计算机;2000012王林2000256顾芳2000278姜凡2000014葛波男19计算机男18管理女19管理男19管理女18计算机2000113张大民2000012王林2000256顾芳2000278姜凡2000014
20、葛波男19计算机男18管理女19管理男19管理女18计算机2000113张大民2000012王林2000014葛波SnoSname重复以下的操作:取出一行数据测试是否满足条件如果满足条件,则进行投影后,存放到结果3.3.1 单表查询:WHERESELECT Sname, SageFROMStudent例3.14查询所有年龄在19岁以下的学生的姓名和年龄 SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机WHERESage = 18AND Sage = 18A
21、ND Sage = 19);3.3.1 单表查询:WHERE例3.15 查询年龄在1819岁(包括18岁和19岁)的女同学的的姓名、系别和年龄。 SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机SELECTSname,Sdept,SageFROMStudentWHERE(SageBETWEEN18AND19) AND Ssex = 女;3.3.1 单表查询:WHERE例3.16 查询计算机系和管理系的学生的姓名和年龄。SQL使用(.)表示集合: ( 计算机
22、, 管理 ) SELECTSname,SageFROMStudentWHERESdeptIN (计算机,管理);SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机取出一行数据,判断列Sdpet的值是否是集合的成员3.3.1 单表查询:WHERE例3.16 查询计算机系和管理系的学生的姓名和年龄。SELECT Sname,Sage FROM Student WHERE Sdept = 计算机 OR Sdept = 管理;SnoSname2000012王林200
23、0113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机3.3.1 单表查询:WHERE例3.16 查询不是计算机系和管理系的学生的姓名和年龄。SQL使用(.)表示集合: ( 计算机, 管理 ) SELECTSname,SageFROMStudentWHERESdeptNOT IN (计算机,管理);SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机3.3.1 单表查
24、询:WHERE例3.17 查询所有姓王的学生的姓名、学号和性别。SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE王%;SnoSname2000012王林2000113张大民2000256顾芳2000278姜凡2000014葛波SsexSageSdept男19计算机男18管理女19管理男19管理女18计算机通配符%匹配任意的字符串3.3.1 单表查询:WHERE例3.18 查询以113开头的课程号及对应的课程名称。 SELECTCno,CnameFROMCourseWHERECnoLIKE113_;通配符_匹配任意的字符CnoCnameCpnoCcred
25、it1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理43.3.1 单表查询:WHERE例3.19 查询DB_Design课程的课程号和学分。SELECT*FROMCourseWHERECnameLIKEDB_DesignESCAPE“ESCAPE ”短语表示“”为换码字符,这样匹配串中紧跟在“”后面的字符“_”不再具有通配符的含义,而是普通的“_”字符。 CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理41033DB_Desi
26、gn43.3.1 单表查询:WHERE例3.20 查询没有先修课的课程号及对应的课程名称。 SELECTCno,CnameFROMCourseWHERECpnoIS NULL;CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SELECTCno,CnameFROMCourseWHERECpnoIS NOT NULL;CnoCname1128高等数学1156英语1137管理学1030物理CnoCname1024数据库原理1136离散数学3.3.1 单表查询:ORDER BY例3.25 查询选修
27、了1156号课程的学生的学号及其成绩,将查询结果按成绩降序排列。 SELECTSno,GradeFROMSCWHERECno=1156ORDERBYGradeDESC;SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SnoGrade2000256932000113892000014882
28、00001280SnoGrade200001280200011389200025693200001488初始结果排序后的最终结果3.3.1 单表查询:ORDER BY例3.26 查询全体学生的详细信息,查询结果先按照系名升序排列,同系的学生 再按年龄降序排列。 。 SELECT*FROMStudentORDERBYSdept,SageDESC;SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机SnoSnameSsexSageSdept2000256顾芳女19
29、管理2000278姜凡男19管理2000113张大民男18管理2000012王林男19计算机2000014葛波女18计算机3.3.1 单表查询:聚集函数聚集函数接受一个集合(包),返回一个值COUNT(DISTINCT|ALL*) 统计元组数COUNT(DISTINCT|ALL) 统计某列的值的数量SUM(DISTINCT|ALL)计算某列的值的总和AVG(DISTINCT|ALL)计算某列的平均值MAX(DISTINCT|ALL)求某列的最大值MIN(DISTINCT|ALL)求某列的最小值3.3.1 单表查询:聚集函数COUNT( )SELECTCOUNT(*) AS CountFROMS
30、tudent例3.27 查询学生总人数。SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机Count53.3.1 单表查询:聚集函数SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128
31、902000014112885Sno200001220001132000256200001420000142000012CnoGrade115680115689115693115688113690113678Sno200001220001132000256200001420000142000012Sno2000012200011320002562000014COUNT( )SELECTCOUNT(DISTINCT Sno)FROMSCWHERE Cno = 1156 OR Cno = 1136;例3.28 查询选修了1156或者1136号课程的学生总人数 SnoCnoGrade20000121
32、15680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SELECTCOUNT(Sno), AVG(Grade)FROMSCWHERE Cno = 1156 ;3.3.1 单表查询:聚集函数SnoCnoGrade2000012115680200011311568920002561156932000014115688查询选修了1156
33、号课程的人数和平均成绩SELECTCOUNT(*), AVG(Grade)FROMSCWHERE Cno = 1156 ;3.3.1 单表查询:聚集函数例3.31 Course表有几门课程? CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SELECT COUNT(*)FROM Course;COUNT(*)6COUNT(*) : 向聚集函数COUNT传入的集合是什么?3.3.1 单表查询:聚集函数例3.31 Course表有几门课程? CnoCnameCpnoCcredit1128高等数
34、学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SELECT COUNT(Cno)FROM Course;COUNT(Cno)6COUNT(Cno) : 向聚集函数COUNT传入的集合是什么?Cno=1128, 1156, 1137, 1024, 1136, 1030COUNT(Cno)=COUNT(1128, 1156, 1137, 1024, 1136, 1030) 3.3.1 单表查询:聚集函数例3.31 Course表有几门课程? CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原
35、理113641136离散数学112841030物理4SELECT COUNT(Cpno)FROM Course;COUNT(Cpno)2COUNT(Cpno) : 向聚集函数COUNT传入的集合是什么?Cpno=NULL, NULL, NULL, 1136, 1128, NULL COUNT(Cpno)=COUNT(NULL, NULL, NULL, 1136, 1128, NULL )= COUNT(1136, 1128) 聚集函数自动去除NULL 3.3.1 单表查询:GROUP BY用于分组分组列在分组列上有相同值的元组组成了一个分组GROUP BY 列名, ., 列名3.3.1 单表查
36、询:GROUP BYSnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SELECTCno, COUNT(*)FROMSCGROUP BY Cno;SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611
37、377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SELECTCno, COUNT(*), GradeFROMSCGROUP BY Cno;CnoCOUNT(*)1156411373102421136211282例3.32 统计每门课程的选课人数 SELECT只能出现分组列和聚集函数3.3.1 单表查询:GROUP BYSELECTSdept,Ssex,COUNT(*)FROMStudentGROUPBYSdept,Ssex;例3
38、.33 统计各学院男生和女生的人数。 SdeptSsexCOUNT(*)管理男2计算机男1管理女1计算机女13.3.1 单表查询:GROUP BYSELECTSdept,Ssex,COUNT(*)FROMStudentGROUPBYSdept,SsexORDER BY Sdept, Ssex;例3.33 统计各学院男生和女生的人数。 SdeptSsexCOUNT(*)管理女1管理男2计算机女1计算机男13.3.1 单表查询:HAVINGSELECTCno,COUNT(*)FROMSCGROUPBYCnoHAVINGCOUNT(*)2;例3.34 求选课人数超过2的课程号和具体的选课人数。 选择
39、符合条件的分组: HAVING SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885CnoCOUNT(*)11373115643.3.1 单表查询:HAVINGSELECTCno,COUNT(*)FROMSCGROUPBYCnoHAVINGCnoLIKE%7%ANDCOUNT(*)2;例3.
40、35 求选课人数超过2并且课程号包含字符7的课程号和具体的选课人数。 SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885CnoCOUNT(*)11373条件中可以出现分组列以及聚集函数3.3.1 单表查询:注释-查询计算机系学生的详细信息SELECT*FROMStudentWHERESde
41、pt=计算机-选择条件从-开始到行尾的字符串注意:有的DBMS,如MySQL需要在-和注释内容之间加空白, - 选择条件3.3.2 多表查询单表查询的FROM子句只出现一个表多表查询涉及多个表,FROM子句出现多个表。从概念上讲,FROM子句先对这些表做笛卡儿积运算,得到一个临时表, 之后的选择、投影等运算都是针对这个临时表进行,从而将多表查询转换为单表查询。3.3.2 多表查询 : CROSS JOIN例3.36 求Student表和SC表的笛卡儿积。 SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理20002
42、78姜凡男19管理2000014葛波女18计算机SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SELECT*FROMStudent,SC;SELECT*FROMStudent CROSS JOINSC;3.3.2 多表查询 : CROSS JOIN例3.36 求Student表和SC表
43、的笛卡儿积。 SnoSnameSsexSageSdeptSnoCnoGrade2000012王林男19计算机20000121024802000012王林男19计算机20000121128902000012王林男19计算机20000121136782000012王林男19计算机20000121137702000012王林男19计算机20000121156802000012王林男19计算机20000141128852000012王林男19计算机20000141024882000012王林男19计算机20000141136902000012王林男19计算机20000141156882000012王林
44、男19计算机20001131156892000012王林男19计算机20002561137772000012王林男19计算机20002561156932000012王林男19计算机200027811378965个元组的部分结果3.3.2 多表查询: CROSS JOINStudent.SnoSnameSsexSageSdeptSC.SnoCnoGrade2000012王林男19计算机20000121024802000012王林男19计算机20000121128902000012王林男19计算机20000121136782000012王林男19计算机20000121137702000012王林男
45、19计算机20000121156802000012王林男19计算机20000141128852000012王林男19计算机20000141024882000012王林男19计算机20000141136902000012王林男19计算机20000141156882000012王林男19计算机20001131156892000012王林男19计算机20002561137772000012王林男19计算机20002561156932000012王林男19计算机2000278113789SELECTCno, GradeFROMStudent, SCWHERE Sname = 王林 and Studen
46、t.Sno = SC.Sno;Cno,Grade (Student.Sno=SC.Sno (StudentSC)例3.37 查询学生王林选修课程的课程号和成绩 3.3.2 多表查询: THETA-JOINSELECTCno, GradeFROMStudent JOIN SC ON Student.Sno = SC.SnoWHERE Sname = 王林 ;Cno,Grade (Sname = 王林(Student SC)Student.Sno = SC.SnoSnoCnoGrade200001211568020001131156892000256115693200001411568820002
47、5611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机笛卡尔积的结果有:513 = 65个元组THETA-JOIN的结果 13个元组3.3.2 多表查询: DBMS进行优化SnoCnoGrade200001211568020001131156
48、8920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机Cno,Grade (Sname = 王林(Student) SC)先选择,再连接的结果:5个元组Cno,Grade (S
49、name = 王林(Student SC)Student.Sno = SC.SnoCno,Grade (Sname = 王林 Student.Sno=SC.Sno (StudentSC)3.3.2 多表查询例3.38 查询学生王林选修课程的课程号和成绩,并按成绩排序。SELECTCno,GradeFROMStudent,SC - Student CROSS JOIN SCWHERESname=王林andStudent.Sno=SC.SnoORDERBYGrade;SELECTCno,GradeFROMStudent JOIN SC ON Student.Sno=SC.Sno WHERESnam
50、e=王林ORDERBYGrade;先执行FROM子句,进行 CROSS JOIN或JOIN,将多表 查询转换为单表查询WHERE 是对 CROSS JOIN 和JOIN 后的结果进行选择ORDER对最终结果排序3.3.2 多表查询例3.39 查询某门课程考试成绩为优良的学生的学号、姓名及所在院系。SELECTStudent.Sno,Sname,SdeptFROMStudent,SCWHEREStudent.Sno=SC.SnoANDGrade=80;SELECTStudent.Sno,Sname,SdeptFROMStudent JOIN SC ON Student.Sno=SC.SnoWHE
51、REGrade=80;3.3.2 多表查询例3.39 查询某门课程考试成绩为优良的学生的学号、姓名及所在院系。| Sno | Sname | Sdept |+-+-+-+| 2000012 | 王林 | 计算机 | 2000012 | 王林 | 计算机 | 2000012 | 王林 | 计算机 | 2000014 | 葛波 | 计算机 | 2000014 | 葛波 | 计算机 | 2000014 | 葛波 | 计算机 | 2000014 | 葛波 | 计算机 | 2000113 | 张大民 | 管理 | 2000256 | 顾芳 | 管理 | 2000278 | 姜凡 | 管理 |SELECT
52、DISTINCT Student.Sno,Sname,SdeptFROMStudent JOIN SC ON Student.Sno=SC.SnoWHEREGrade=80;SELECTDISTINCT Student.Sno, DISTINCT Sname,SdeptFROMStudent JOIN SC ON Student.Sno=SC.SnoWHEREGrade=80;如何处理? 以下哪个对?3.3.2 多表查询例3.40 查询英语课程的最高成绩和最低成绩。SnoCnoGrade200001211568020001131156892000256115693200001411568820
53、0025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SELECTMAX(Grade), MIN(Grade)FROMCourse,SCWHERECname=英语andCourse.Cno=SC.Cno;3.3.2 多表查询例3.40 查询英语课程的最高成绩和最低成绩。
54、SELECTMAX(Grade),MIN(Grade)FROMCourse,SCWHERECname=英语andCourse.Cno=SC.Cno;用CROSS JOIN和JOIN 改写下面的语句SELECTMAX(Grade),MIN(Grade)FROMCourse CROSS JOIN SCWHERECname=英语andCourse.Cno=SC.Cno;SELECTMAX(Grade),MIN(Grade)FROMCourse JOIN SC ON Course.Cno=SC.CnoWHERECname=英语;3.3.2 多表查询例3.41 查询每个学生的学号、姓名、选修的课程名及成
55、绩。 SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SnoSnameSsexSageSdept2000012王林男19计算机2000
56、113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机3.3.2 多表查询例3.41 查询每个学生的学号、姓名、选修的课程名及成绩。 SnoCnoGrade2000012115680200011311568920002561156932000014115688200025611377720002781137892000012113770200001210248020000141024882000014113690200001211367820000121128902000014112885CnoCnameCpnoCcredit1128高等数
57、学61156英语61137管理学41024数据库原理113641136离散数学112841030物理4SnoSnameSsexSageSdept2000012王林男19计算机2000113张大民男18管理2000256顾芳女19管理2000278姜凡男19管理2000014葛波女18计算机3.3.2 多表查询例3.41 查询每个学生的学号、姓名、选修的课程名及成绩。 SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.Cno;SELECTStudent.S
58、no,Sname,Cname,GradeFROM(Student JOIN SC ON Student.Sno=SC.Sno) JOIN Course ON SC.Cno=Course.Cno;加上括号更清晰,不加也可以,因为JOIN满足交换律和结合律使用JOIN比CROSS JOIN 更容易理解3.3.2 多表查询例3.42 查询每一门课的间接先修课(即先修课的先修课) CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理41024号课程的先修课是1136号课程,而1136号课程的先修课是11
59、28号课程, 所以,1024号课程的间接先修课是1128号课程。1136号课程的先修课是1128号课程,而1128号课程无先修课, 所以1136号课程的间接先修课为空,或者说没有间接先修课。CnoCnameCpnoCcredit1128高等数学61156英语61137管理学41024数据库原理113641136离散数学112841030物理43.3.2 多表查询例3.42 查询每一门课的间接先修课(即先修课的先修课) SELECTCno,CpnoFROMCourse,CourseWHERECpno=CnoandCpnoISNOTNULL;SELECTA.Cno,B.CpnoFROMCourse
60、 AS A,CourseAS B -FROMCourse A,Course BWHEREA.Cpno=B.CnoandB.CpnoISNOTNULL;Cno、Cpno是哪个 Course的列?使用AS为表更名,AS可以省略3.3.3 集合运算SELECT语句的结果是表(关系),它是元组的集合(默认是包)集合运算符,运算的结果是集合并: UNION交: INTERSECT差: EXCEPT包运算符,运算的结果是包并: UNION ALL交: INTERSECT ALL差: EXCEPT ALL注意:有些 DBMS尚不支持EXCEPT和INTERSECT3.3.3 集合运算符的优先级交: INTE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省金兰教育合作组织2024-2025学年高二下学期4月期中考试信息技术试卷(含答案)
- 广西幼师学前专业儿童文学教案06儿童诗
- 2025年二手电商信用评价体系与品牌建设策略报告
- 历史研究与考古发现图书企业制定与实施新质生产力项目商业计划书
- 健康生活习惯行业跨境出海项目商业计划书
- 耳鼻喉科医院机器人企业制定与实施新质生产力项目商业计划书
- DB1301T 406-2022 温室茄子越冬换头技术规程
- 2025年二手电商平台信用评价与用户信用画像研究报告
- 2025年动漫产业链协同效应报告:产业链升级路径解析
- 2025年动漫产业创新驱动发展战略报告:产业链协同升级路径
- 农行现金机具管理制度
- 高中化学方程式大全
- 机械制图知识培训课件
- “国资赣将”赣州旅游投资集团2025年第一批社会公开招聘【46人】笔试参考题库附带答案详解析
- 湖北省新华书店集团有限公司招聘考试内容
- 两篇古典英文版成语故事塞翁失马
- (人教版教材)初中地理《巴西》完整版
- 律师事务所业务操作规程
- MW机组扩建工程常熟施工组织设计
- 成败归因理论PPT课件
- 中国医师协会专科会员入会申请表
评论
0/150
提交评论