数据库原理-3关系数据库标准语言SQL.ppt
《数据库原理-3关系数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《数据库原理-3关系数据库标准语言SQL.ppt(163页珍藏版)》请在三一办公上搜索。
1、数据库系统原理(第3章),四川大学计算机学院张天庆2005.9,第三章 关系数据库标准语言SQL,SQL是Structured Query Language的缩写最新的标准是SQL99,或称SQL3包含了很多核心SQL以外的包增加对递归查询、临时视图的支持增加对触发器的支持现在商品化DBMS一般都支持SQL92规范的超集/子集。,3.1 SQL概述,SQL介于关系代数与关系演算之间3.1.1 SQL的特点SQL集数据查询、数据操纵、数据定义和数据控制功能于一体。其综合、强大、简洁使其称为国际标准。,综合统一SQL集DDL、DML、DCL功能于一体。SQL数据操作符的统一。(查询、插入、删除、修
2、改都只有一种操作符。),二.高度非过程化SQL进行数据操作,只要提出“What to do”,无需告诉系统“How to do”充分体现关系系统的特点和优势有利于提高数据的独立性,三.面向集合的操作方式关系运算“一次一集合”方式的体现。,四.一种语法结构、两种使用方式既是自含式语言,又是嵌入式语言。,五.语言简捷,易学易用SQL设计巧妙,核心功能只需9个动词。在语言上接近英语。,3.1.2 SQL语言的基本概念SQL对象与三级模式结构的对应关系 外模式视图、部分基本表模式 基本表内模式存储文件,基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一些DBMS中一个基本表对应一个存储文件,
3、有的DBMS一个数据库中的多个基本表对应一个存储文件一个表可以带若干索引,索引也存放在存储文件中,存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理文件结构是任意的。,视图是从基本表或其他视图中导出的表它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。用户可以用SQL语言对视图和基本表进行查询。在用户眼中,视图和基本表都是关系,而存储文件对用户是透明的。,3.2 数据定义,对基本表、视图、索引的定义、删除和修改(7种组合,不能修改视图和索引),3.2.1 定义、删除和修改基本表,定义基本表一般格式
4、CREATE TABLE(列级完整性约束条件,列级完整性约束条件.,表级完整性约束条件);,例1:书p69给出了IBM DB2定义学生表的方法。下面的例子一般为标准SQL。CREATE TABLE student(sno char(5)PRIMARY KEY,sname varchar(20)UNIQUE,sgender char(1),sage int,sdept varchar(15);,略去course表,下面定义SC表CREATE TABLE SC(sno char(5),cno char(5),grade int,PRIMARY KEY(sno,cno),FOREIGN KEY(sn
5、o)REFERENCES student,FOREIGN KEY(cno)REFERENCES course);,约束更完整的形式:CREATE TABLE SC(sno char(5),cno char(5),grade int,CONSTRAINT PK_sno_cno PRIMARY KEY(sno,cno),CONSTRAINT FK_sno FOREIGN KEY(sno)REFERENCES student,CONSTRAINT FK_cno FOREIGN KEY(cno)REFERENCES course,CONSTRAINT CK_grade CHECK(grade=0 an
6、d grade=100);,上述例子可以看出SQL基本表定义的概貌。应注意完整性约束的定义主码:PRIMARY KEY关键字。外码:FOREIGN KEY关键字。用户定义:CHECK关键字。,二.修改基本表可增加新列,删除列上的完整性约束,修改列名及数据类型但不能删除属性列!ALTER TABLEADD 完整性约束DROP MODIFY;,三.删除基本表DROP TABLE;删除基本表后,引用建立在此表上的视图可能出现问题。,3.2.2 建立和删除索引,作用:提高查询速度。如从O(n)到O(log2n)常需要建立索引的属性常作为连接属性常出现在查询条件中,一.建立索引CREATE UNIQUE
7、CLUSTERED|NONCLUSTERED INDEX ON(,);,UNIQUE(单一索引):唯一索引,不允许存在索引值相同的两行,CLUSTERED(聚集索引):索引项的顺序与表中记录的物理顺序一致。表中如果有多个记录在索引字段上相同,这些记录构成一簇,只有一个索引值。优点:查询速度快。缺点:维护成本高,且一个表只能建一个聚簇索引。,NONCLUSTERED(非聚集索引)作为非聚集索引,行的物理排序独立于索引排序非聚集索引的叶级包含索引行(B树),二.删除索引DROP INDEX;,3.3 SQL查询,要求重点掌握比较困难的是2-3层的嵌套查询。一般格式:SELECT ALL|DISTI
8、NCT,目标列表达式FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;,简单的SQL查询与关系代数的联系:SELECT A1,A2,An FROM T1,T2,.,Tk WHERE F;相当于:A1,A2,An F(T1T2 Tk)其中F中有的可能是连接条件,与后面的广义笛卡儿集构成连接。,含义:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP子句,则将结果按的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。通
9、常会在每组中作用集函数。如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。如果有ORDER子句,则结果表还要按的值的升序或降序排序。,3.3.1 单表查询比较简单一、选择表中的若干列 1.查询指定列例1查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;中各个列的先后顺序可以与表中的顺序不一致。也就是说,用户在查询时可以根据应用的需要改变列的显示顺序。,2.查询全部列例3 查询全体学生的详细记录SELECT*FROM Student;该SELECT语句实际上是无条件地把Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种
10、查询。,不仅可以使用列名,还可以使用算术表达式、字符串常量和函数等。3.查询经过计算的值例5 查全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名SELECT Sname,Year of Birth:,2004-Sage,LOWER(Sdept)FROM Student;,改变列标题(MS SQL SERVRE)用ASSELECT Sname AS Name,Year of Birth:AS Birth,2004-Sage AS BirthYear,LOWER(Sdept)AS DepartmentFROM Student;,二、选择表中的若干元组 1.消除取值重复的行(使用DIST
11、INCT)例6 查所有选修过课的学生的学号SELECT SnoFROM SC;结果中有重复的行。一个学生选多少门课,其学号就出现多少次。,DISTINCT用于消重SELECT DISTINCT SnoFROM SC;即可消重。,2.查询满足条件的元组查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如表3-3所示。,比较大小例7 查询计算机系全体学生的名单。SELECT Sname FROM Student WHERE Sdept=CS;,补充例:查询选修2号课程成绩在90分以上(含)的学生的学号。SELECT Sno FROM SC WHERE Cno=2 AND
12、 Grade=90;,(2)确定范围 BETWEEN AND 与NOT BETWEEN AND更接近自然语言,语义更明确。但都可以表示为用逻辑与连接的两个比较。,例10 查询年龄在2023岁(包括)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;,当然也可表示为:SELECT Sname,Sdept,Sage FROM Student WHERE Sage=20 AND Sage=23;,(3)确定集合IN与NOT IN前面的例子还可表示为:SELECT Sname,Sdept,S
13、age FROM Student WHERE Sage IN(20,21,22,23);,(4)字符匹配 LIKE通配符%和_。用法:相当于Windows、dos等中查文件名的*和?新的问题:如何表示%和_本身?,表示%和_本身的方法ESCAPE转义书上用转义。实际上可以更灵活。如下面的!转义:SELECT c1 FROM tb WHERE c1 LIKE%10-15!%off%ESCAPE!;,(5)涉及空值的查询IS NULL和IS NOT NULL(注意:有的系统允许NULL比较,可以使用和,如MS SQL Server。有的不允许,如Oracle。)例21 查询缺少成绩的学生的学号及相
14、应课程号。,SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,(6)逻辑连接查询WHERE中用AND和OR连接多个条件。例:查询计算机科学系或数学系年龄在18到23岁的学生的姓名。SELECT SnameFROM StudentWHERE(Sdept=CS OR Sdept=MA)andSage BETWEEN 18 AND 23;,三.查询结果排序如果没有指定查询结果的显示顺序,DBMS将按其最方便的顺序(通常是元组在表中的先后顺序)输出查询结果。ORDER BY 子句可明确指定结果序。默认为升序(ASC),NULL值最大。,例:查询计算机系(CS)学生
15、的学号和姓名,按年龄从大到小排,相同年龄的按学号升序排。SELECT Sno,Sname FROM StudentWHERE Sdept=CSORDER BY Sage DESC,Sno;,注:这里说“NULL值最大”,仅仅针对NULL值排序的情况。如果取“NULL值”的字段出现在条件表达式中,将使条件计算为NULL,进而被排除于结果外。例如,查找成绩在90分以上(含)的学生的学号:SELECT Sno FROM SC WHERE Grade=90;成绩为NULL的学生的学号并不出现在结果中。,四、使用集函数 为了进一步方便用户,增强检索功能,SQL提供了许多集函数,主要包括:COUNT(DI
16、STINCT|ALL*)统计元组个数 COUNT(DISTINCT|ALL)统计一列中值的个数 SUM(DISTINCT|ALL)计算一列值的总和(此列必须是数值型)AVG(DISTINCT|ALL)计算一列值的平均值(此列必须是数值型)MAX(DISTINCT|ALL)求一列值中的最大值 MIN(DISTINCT|ALL)求一列值中的最小值,如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。例:查询学生总人数SELECT COUNT(*)FROM student;或SELECT COUNT
17、(Sno)FROM student;,例26 查询选修了课程的学生人数SELECT COUNT(DISTINCT Sno)FROM SC;学生每选修一门课,在SC中都有一条相应的记录,而一个学生一般都要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。,注:NULL值的影响:COUNT(*)总是返回记录的个数COUNT(字段)返回指定字段值非空的记录个数。例如,求2号课程总共有多少个得分:SELECT COUNT(*)FROM SC WHERE Cno2;结果中包含成绩为空的记录,而,SELECT COUNT(Grade)FROM SC WHERE Cno2;
18、结果中则不包含成绩为空的记录。,五、对查询结果分组 GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。,注:SQL规定,所有带有NULL值的记录在分组时被作为一组。例子,对选2号课程的学生进行成绩分组,计算每一成绩的人数。SELECT COUNT(*),Grade FROM SC WHERE Cno=2 GROUP BY Grade;,注:分组后,一些详细信息可能损失,不能出现在SELE
19、CT结果中。例如,下面的查询SELECT Sno,COUNT(*),Grade FROM SC WHERE Cno=2 GROUP BY Grade;将出错,想一想,为什么?,一般来说,分组查询的SELECT目标列中只允许出现聚集函数和GROUP BY子句中出现过的列。,HAVING条件针对的是 GROUP分组,WHERE针对的是元组,两者并不矛盾。,HAVING条件针对的是 GROUP分组,WHERE针对的是元组,两者并不矛盾。例:查询有三科或三科以上成绩在80分以上的学生学号。SELECT SnoFROM SC WHERE Grade=80GROUP BY SnoHAVING(COUNT(
20、Cno)=3);,3.3.2 连接查询,一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询主要包括等值连接、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。,一、等值与非等值连接查询 用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:.在实践中比较运算符为的等值连接使用十分广泛。,连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比
21、的。但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比的类型。,从概念上讲DBMS执行连接操作的过程是,首先在表1中找到第一个元组,然后从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1全部元组都处理完毕为止。(注意:实际上要考虑查询的优化),例32 查询每个学生及其选修课程的情况学生情况存放在
22、Student表中,学生选课情况存放在SC表中,所以本查询要把Student与SC表的数据通过两个表都具有的属性Sno(外码连接)实现的。这是一个等值连接。完成本查询的SQL语句为:SELECT Student.*,SC.*FROM Student,SC WHERE Student.Sno=SC.Sno;,例33自然连接Student和SC表SELECT Student.Sno,Sname,Sgender,Sage,Sdept,Cno,GradeFROM Student,SCWHERE Student.Sno=SC.Sno;,注:实际上,上述作法只是基本连接形式之一,称为“交叉连接”或“叉积连
23、接”。除交叉连接外,还有“内连接”和“外连接”两种基本形式。,例如,例32可改为“内连接”形式(以MS SQL Server为例):SELECT*FROM Student INNER JOIN SC ON Student.Sno=SC.Sno;,二、自身连接连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。例34查询每一门课的间接先修课(即先修课的先修课)我们先来分析一下,题目要求查询每一门课程的先修课的先修课,在“课程”表即Course关系中,只有每门课的直接先修课信息,而没有先修课的先修课,要得到这个信息,必须先对一门课找到其先修课,再按此先修课的
24、课程号,查找它的先修课程。,我们可以为Course表取两个别名,一个是FIRST,另一个是SECOND,也可以在考虑问题时就把Course表想成是两个完全一样表,一个是FIRST表,另一个是SECOND表。这两个表通过FIRST的Pcno与SECOND的Cno等值连接即可达到查询目的。这相当于将Course表与其自身连接后,取第一个副本的课程号与第二个副本的先修课号做为目标列中的属性。,书上的作法是:SELECT FIRST.Cno,SECOND.Pcno FROM Course FIRST,Course SECOND WHERE FIRST.Pcno=SECOND.Cno;,书上的作法是:S
25、ELECT FIRST.Cno,SECOND.Pcno FROM Course FIRST,Course SECOND WHERE FIRST.Pcno=SECOND.Cno;这一作法实际上有问题:没有先行课的先行课的课程(即某门课的先行课的先行课为NULL)也出现在结果中。请思考后,自己修改正确。,三、外连接 在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在例32和例33的结果表中没有关于95003和95004两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组。但是有时我们想以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 原理 关系 标准 语言 SQL
链接地址:https://www.31ppt.com/p-6578423.html