数据库原理与应用第三章PPT课件.ppt

上传人:本田雅阁 文档编号:2803742 上传时间:2019-05-19 格式:PPT 页数:75 大小:924.52KB
返回 下载 相关 举报
数据库原理与应用第三章PPT课件.ppt_第1页
第1页 / 共75页
数据库原理与应用第三章PPT课件.ppt_第2页
第2页 / 共75页
数据库原理与应用第三章PPT课件.ppt_第3页
第3页 / 共75页
数据库原理与应用第三章PPT课件.ppt_第4页
第4页 / 共75页
数据库原理与应用第三章PPT课件.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《数据库原理与应用第三章PPT课件.ppt》由会员分享,可在线阅读,更多相关《数据库原理与应用第三章PPT课件.ppt(75页珍藏版)》请在三一文库上搜索。

1、第三章 关系数据库标准语言 SQL,3.1 SQL概述,SQL的特点 1. 综合统一 2. 高度非过程化 3. 面向集合的操作方式 4. 以同一种语法结构提供两种使用方法 5. 语言简洁,易学易用,5. 语言简捷,易学易用,3.2 数 据 定 义,3.2.1 定义语句格式,CREATE TABLE ( , , , ) , 给出要创建的基本表的名称; 给出列名或字段名; ,为列指定数据类型及其数据宽度; 关系数据库支持非常丰富的数据类型,不同的数据库管理系统支持的数据类型基本是一样的,右表列出了常用的数据类型。,数据类型,用于定义列或字段一级的完整性约束,一般包括: NOT NULL和NULL约

2、束 PRIMARY KEY约束 UNIQUE约束 FOREIGN KEY约束 DEFAULT定义 CHECK约束,列级完整性约束,用于定义表一级的完整性约束,一般包括: PRIMARY KEY约束(复合属性构成的主关键字说明) FOREIGN KEY约束(外部关键字及参照关系说明) CHECK约束(同时涉及到多个属性的域完整性约束),表级完整性约束,不是SQL的标准选项,一般用于与物理存储有关的说明,不同的数据库管理系统定义的方式肯定不同,另外该项参数一般也不是必需的。,其他参数,例题,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系S

3、dept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。 CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20) UNIQUE, Ssex CHAR(1) , Sage INT, Sdept CHAR(15);,二、修改基本表,ALTER TABLE ADD | DROP MODIFY DROP COLUMN ALTER COLUMN ,例题,例2 向Student表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE Student ADD Scome DATE; 不论基本表中原来是否已有

4、数据,新增加的列一律为空值。,例题,例3 将年龄的数据类型改为半字长整数。 ALTER TABLE Student MODIFY Sage SMALLINT; 修改原有的列定义可能会破坏已有数据。,例题,例4 删除关于学号必须取唯一值的约束。 ALTER TABLE Student DROP UNIQUE(Sno) ; SQL没有提供删除属性列的语句,只能间接实现,先将原表中要保留的列及其内容复制到一个新表中,然后删除原表,并将新表命名为原表名。,三、删除基本表,DROP TABLE ; 基本表删除 数据、表上的索引都删除 表上的视图往往仍然保留,但 无法引用 删除基本表时,系统会自动从数据字

5、典中删去有关该基本表及其索引的描述 ,因此建立在此表上的视图虽然已保留,但已无法引用,例题,例5 删除Student表 DROP TABLE Student ;,3.2.2 建立与删除索引,建立索引是加快查询速度的有效手段 建立索引 DBA或表的属主(即建立表的人)根据需要建立和删除 有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE 维护索引 DBMS自动完成 使用索引 DBMS自动选择是否使用索引以及使用哪些索引,一、建立索引,语句格式 CREATE UNIQUE CLUSTER INDEX ON (, ); 用指定要建索引的基本表名字 索引可以建立在该表的一列或多列

6、上,各列名之间用逗号分隔 用指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC UNIQUE表明此索引的每一个索引值只对应唯一的数据记录 CLUSTER表示要建立的索引是聚簇索引,建立索引 (续),唯一值索引 对于已含重复值的属性列不能建UNIQUE索引 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束,建立索引 (续),聚簇索引 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致 例: CREATE CLUSTER INDEX Stu

7、sname ON Student(Sname); 在Student表的Sname(姓名)列上建立一个聚簇索引,而 且Student表中的记录将按照Sname值的升序存放,建立索引 (续),在一个基本表上最多只能建立一个聚簇索引 聚簇索引的用途:对于某些类型的查询,可以提高查询效率 聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作,聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织。 例CREATE CLUSTER INDEX Stusname ON Student (Sname); 将会在Student 表的Sname列上建一个聚簇索引,而且记录会按照Snam

8、e值的升序存放。 用户可以在最常查询的列上建立聚簇索引以提高查询效率。但在一个基本表上只能建一个,而且更新索引列数据会导致表中记录的物理顺序的变更,因此经常更新的数据列不宜建立。,例题,例6 为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno) CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX S

9、Cno ON SC(Sno ASC,Cno DESC);,二、删除索引,DROP INDEX ; 删除索引时,系统会从数据字典中删去有关该索引的描述。 例7 删除Student表的Stusname索引。 DROP INDEX Stusname;,3.3.1 概述,语句格式 SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC;,示例数据库,学生-课程数据库 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit) 学生选课

10、表:SC(Sno,Cno,Grade),3.3 查 询,3.3.1 概述 3.3.2 单表查询 3.3.3 连接查询 3.3.4 嵌套查询 3.3.5 集合查询 3.3.6 小结,3.3.2 单表查询,查询仅涉及一个表,是一种最简单的查询操作 一、选择表中的若干列 二、选择表中的若干元组 三、对查询结果排序 四、使用集函数 五、对查询结果分组,从职工关系中检索所有工资值,SELECT 工资 FROM 职工,结果是: 1220 1210 1250 1230 1250,SELECT DISTINCT工资 FROM 职工,结果是: 1220 1210 1250 1230,单表查询,用户在查询时可根据

11、应用的需要改变列的显示顺序 例2查询全体学生的姓名、学号、所在系。 查询全部列-将所有的列名在SELECT后面列出或者用*表示列名 例3 SELECT * FROM Student; 查询经过计算的值 例4查询全体学生姓名及其出生年份 SELECT Sname,1996-Sage FROM Student;,单表查询,不仅可以是算术表达式,还可以是字符串常量、函数等。 例5查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名 SELECT Sname,Year of Birth:,1996-Sage,ISLOWER(Sdept) FROM Student; 输出结果: Sname

12、Year of Birth: 1996-Sage ISLOWER(Sdept) - - - - 李勇 Year of Birth: 1976 cs 刘晨 Year of Birth: 1977 is 王名 Year of Birth: 1978 ma 张立 Year of Birth: 1977 is,例5.* 使用列别名改变查询结果的列标题,SELECT Sname NAME,Year of Birth: BIRTH, 2000-Sage BIRTHDAY,ISLOWER(Sdept) DEPARTMENT FROM Student; 输出结果: NAME BIRTH BIRTHDAY DE

13、PARTMENT - - - - 李勇 Year of Birth: 1976 cs 刘晨 Year of Birth: 1977 is 王名 Year of Birth: 1978 ma 张立 Year of Birth: 1977 is,二、选择表中的若干元组,消除取值重复的行 查询满足条件的元组,1. 消除取值重复的行,在SELECT子句中使用DISTINCT短语 假设SC表中有下列数据 Sno Cno Grade - - - 95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,ALL 与 DISTINCT,例6 查询选修了课程的

14、学生学号。 (1) SELECT Sno FROM SC; (因为默认的是ALL) SELECT ALL Sno FROM SC; 所以结果为: Sno - 95001 95001 95001 95002 95002,例题(续),(2) SELECT DISTINCT Sno FROM SC; 结果: Sno - 95001 95002 总结:两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成完全相同的行,于是必须用DISTINCT短语或象下面那样用WHERE语句。,2.查询满足条件的元组,WHERE子句常用的查询条件,(1) 比较大小,在WHERE子句的中使用比较运算符 =,=,!

15、,!= 20;,例9 查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade 60;,(2) 确定范围,使用谓词 BETWEEN (下限) AND (上限) NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;,例题(续),例11 查询年龄不在2023岁之间的学生姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Stu

16、dent WHERE Sage NOT BETWEEN 20 AND 23;,(3) 确定集合,使用谓词 IN , NOT IN :用逗号分隔的一组取值 例12查询信息系(IS)、数学系(MA)和计 算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS );,(3) 确定集合,例13查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ( IS,MA,CS );,(4) 字符串匹配,N

17、OT LIKE ESCAPE :指定匹配模板 匹配模板:固定字符串或含通配符的字符串 当匹配模板为固定字符串时,即不含通配符时 可以用 = 运算符取代 LIKE 谓词 用 != 或 运算符取代 NOT LIKE 谓词,通配符,% (百分号) 代表任意长度(长度可以为0)的字符串 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串 _ (下横线) 代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串,ESCAPE 短语:,当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE 短语对通

18、配符进行转义。,例题,1) 匹配模板为固定字符串 例14 查询学号为95001的学生的详细情况。 SELECT * FROM Student WHERE Sno LIKE 95001; 等价于: SELECT * FROM Student WHERE Sno = 95001;,例题(续),2) 匹配模板为含通配符的字符串 例15 查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;,例题(续),匹配模板为含通配符的字符串(续) 例16 查询姓“欧阳“且全名为三个汉字的学生的姓名。 SELECT Sn

19、ame FROM Student WHERE Sname LIKE 欧阳_ _;,例题(续),匹配模板为含通配符的字符串(续) 例17 查询名字中第2个字为“阳“字的学生的姓名和学号。 SELECT Sname,Sno FROM Student WHERE Sname LIKE _ _阳%;,例题(续),匹配模板为含通配符的字符串(续) 例18 查询所有不姓刘的学生姓名。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 刘%;,例题(续),3) 使用换码字符将通配符转义为普通字符 例19 查询DB_Design课程的课程号和学分。

20、 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE ,例题(续),使用换码字符将通配符转义为普通字符(续) 例20 查询以“DB_“开头,且倒数第3个字符为 i的课程的详细情况。 SELECT * FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE ;,(5) 涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL “IS NULL” 不能用 “= NULL” 代替 例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和

21、相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,例题(续),例22 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,(6) 多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级 可用来实现多种其他谓词 NOT IN NOT BETWEEN AND ,例题,例23 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept= CS AND Sage20

22、;,改写例12,例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS ) 可改写为: SELECT Sname,Ssex FROM Student WHERE Sdept= IS OR Sdept= MA OR Sdept= CS ;,改写例10,例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND

23、23; 可改写为: SELECT Sname,Sdept,Sage FROM Student WHERE Sage=20 AND Sage=23;,三、对查询结果排序,若没有指定查询结果的显示顺序,DBMS按最方便的(元组在表中的先后)方式输出查询结果 使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序 当排序列含空值时 ASC:排序列为空值的元组最后显示 DESC:排序列为空值的元组最先显示,对查询结果排序(续),例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC WHERE

24、 Cno= 3 ORDER BY Grade DESC;,查询结果,Sno Grade - - 95010 95024 95007 92 95003 82 95010 82 95009 75 95014 61 95002 55,对查询结果排序(续),例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。 SELECT * FROM Student ORDER BY Sdept,Sage DESC;,四、使用集函数,5类主要集函数 计数 COUNT(DISTINCT|ALL *) COUNT(DISTINCT|ALL ) 计算总和,(此列必须是数值型的) SUM

25、(DISTINCT|ALL ) 计算平均值,(此列必须是数值型的) AVG(DISTINCT|ALL ),使用集函数(续),求最大值 MAX(DISTINCT|ALL ) 求最小值 MIN(DISTINCT|ALL ) DISTINCT短语:在计算时要取消指定列中的重复值 ALL短语:不取消重复值 ALL为缺省值,使用集函数 (续),例26 查询学生总人数。 SELECT COUNT(*) FROM Student; 例27 查询选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC; 注:用DISTINCT以避免重复计算学生人数,使用集函数 (续),例2

26、8 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno= 1 ; 例29 查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHER Cno= 1 ;,五、对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组,使用GROUP BY子句分组,例30 求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 结果 Cno COUNT(Sno) 1 2

27、2 2 34 3 44 4 33 5 48,对查询结果分组 (续),GROUP BY子句的作用对象是查询的中间结果表 分组方法:按指定的一列或多列值分组,值相等的为一组 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,使用HAVING短语筛选最终输出结果,例31 查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3;,例题,例32 查询有3门以上课程是90分以上的 学生的学号及(90分以上的)课程数 SELECT Sno, COUNT(*) FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出 HAVING短语与WHERE子句的区别:作用对象不同 WHERE子句作用于基表或视图,从中选择满足条件的元组。 HAVING短语作用于组,从中选择满足条件的组。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1