数据库武大版3章关系数据库标准语言SQL1ppt课件.ppt
1,计算机科学与技术学院,数据库系统概论第三章 关系数据库标准语言SQL,2,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL3.8 小结,3,3.1 SQL概述,SQL的特点1.综合统一2.高度非过程化3.面向集合的操作方式4.以同一种语法结构提供两种使用方法5.语言简洁,易学易用,4,5.语言简捷,易学易用,5,3.1.1 SQL:产生与发展,1970年,美国IBM研究中心的E.F.Codd连续发表多篇论文,提出关系模型。1972年,IBM公司开始研制实验型关系数据库管理系统SYSTEM R,配制的查询语言称为SQUARE(Specifying Queries As Relational Expression)语言,在语言中使用了较多的数学符号。1974年,Boyce和Chamberlain把SQUARE修改为SEQUEL(Structured English QUEry Language)语言。后来SEQUEL简称为SQL(Structured Query Language),即“结构式查询语言”,SQL的发音仍为“sequel”。SQL已经成为一个标准,不具有具体缩写含义。,6,3.1.1 SQL:数据库语言的标准,1986.10 ANSI:“DB Language SQL”1987.6 ISO:SQL861989.10 ANSI:SQL891992.8 ISO:SQL92,“SQL2”,600页1999 ISO:SQL99,“SQL3”,1000页,7,3.1.1 SQL:标准的实现,70年代末起,成为事实的标准;早期支持SQL的主要产品:Oracle,DB2,Sybase;SQL成为标准后,数据库世界;SQL向其他领域渗透;SE,AI;具体厂商的SQL实现不同:MS SQL Server:Transact-SQL,T-SQL;Oracle:PL/SQL;,8,3.1.1 SQL:语言的标准,语言组成:,词汇,语言:,自然语言:汉语,英语,法语,鸟语,狗语,,程序设计语言:,语言作用:,交流的载体;有交流对象,交流内容可写,可读,语法,语义,机器语言汇编语言高级语言超高级语言,9,3.1.2 SQL数据库的体系结构,SQL用户,视图,基本表,存储文件,外模式,概念模式,内模式,10,3.1.2 SQL数据库的体系结构,1、关系模型与SQL标准的术语比较:,数据库模式:SQL模式(Schema),数据库(Database);,关系模式:基本表;,外/子模式:视图;,元组:行(Row);,属性:列(Column);,11,3.1.2 SQL数据库的体系结构,2、SQL模式:已命名的数据组;构成:表,用户授权,规则,约束等;,12,3.1.2 SQL数据库的体系结构,3、有三种类型的“二维表”:基本表,视图,导出表;,基本表:实际存储在数据库中的表,实表;,视图:由基本表或其他视图选择、投影得到的虚表,该结构的定义长期在数据库中存放;,导出表:执行查询后产生的临时表;,4、用户可以用SQL语句对基本表和视图进行查询;在用户看来,无区别。,5、一个基本表可以跨越多个存储文件;一个存储文件也可以存放一个或多个基本表;,13,3.1.2 SQL数据库的体系结构,6、SQL语句可以嵌套在宿主语言中使用;也可以在交互环境下使用;即,用户可以是应用程序,也可以是终端用户。,14,3.1.3 SQL的组成,核心SQL主要有四个部分:,(1)数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索引等结构。,(2)数据操纵语言,即SQL DML。数据操纵分成数据查询和数据更新两类。其中数据更新又分成插入、删除和修改三种操作。,(3)嵌入式SQL语言的使用规定。这一部分内容涉及到SQL语句嵌入在宿主语言程序中的规则。,(4)数据控制语言,即SQL DCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。,15,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL3.8 小结,16,3.2 数 据 定 义,关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引。因此SQL的数据定义包括定义表、定义视图和定义索引。,17,3.2 数 据 定 义,18,3.2.1 定义、删除、修改基本表,定义基本表语句一般格式:CREATE TABLE(,);:所要定义的基本表的名字:组成该表的各个属性(列):涉及相应属性列的完整性约束条件:涉及一个或多个属性列的完整性约束条件,19,一、定义基本表,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(2),Sage INT,Sdept CHAR(15);,20,定义基本表(续),常用完整性约束主码约束:PRIMARY KEY唯一性约束:UNIQUE非空值约束:NOT NULL参照完整性约束,21,定义基本表(续),22,定义基本表(续),23,例题(续),例2 建立一个“学生选课”表SC,它由学号Sno、课程号Cno,修课成绩Grade组成,其中(Sno,Cno)为主码。CREATE TABLE SC(Sno CHAR(5),Cno CHAR(3),Grade int,Primary key(Sno,Cno);,24,二、修改基本表,ALTER TABLE ADD 完整性约束 DROP MODIFY;:要修改的基本表ADD子句:增加新列和新的完整性约束条件DROP子句:删除指定的完整性约束条件MODIFY子句:用于修改列名和数据类型,25,例题,例2 向Student表增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。,26,语句格式(续),删除属性列 直接/间接删除把表中要保留的列及其内容复制到一个新表中删除原表再将新表重命名为原表名直接删除属性列:(新)例:ALTER TABLE Student Drop Scome;,27,例3 将年龄的数据类型改为半字长整数。ALTER TABLE Student MODIFY Sage SMALLINT;注:修改原有的列定义有可能会破坏已有数据,28,例题,例4 删除学生姓名必须取唯一值的约束。ALTER TABLE Student DROP UNIQUE(Sname);,29,三、删除基本表,DROP TABLE;基本表定义一旦删除,表中的数据、此表上建立的索引和视图都将自动删除。,30,例题,例5 删除Student表 DROP TABLEStudent;,31,3.2.2 建立与删除索引,建立索引是加快查询速度的有效手段建立索引DBA或表的属主(即建立表的人)根据需要建立有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE维护索引 DBMS自动完成使用索引 DBMS自动选择是否使用索引以及使用哪些索引,32,一、建立索引,语句格式CREATE UNIQUE CLUSTER INDEX ON(,);用指定要建索引的基本表名字索引可以建立在该表的一列或多列上,各列名之间用逗号分隔用指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE表明此索引的每一个索引值只对应唯一的数据记录CLUSTER表示要建立的索引是聚簇索引。,33,例题,例6 为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Stusno ON Student(Sno);CREATE UNIQUE INDEX Coucno ON Course(Cno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);,34,建立索引(续),唯一值索引对于已含重复值的属性列不能建UNIQUE索引对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束,35,建立索引(续),聚簇索引建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致例:CREATE CLUSTER INDEX Stusname ON Student(Sname);在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放,36,建立索引(续),在一个基本表上最多只能建立一个聚簇索引聚簇索引的用途:对于某些类型的查询,可以提高查询效率聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作,37,二、删除索引,DROP INDEX;删除索引时,系统会从数据字典中删去有关该索引的描述。例7 删除Student表的Stusname索引。DROP INDEX Stusname;,38,第三章 关系数据库标准语言SQL,3.1 SQL概述3.2 数据定义3.3 查询3.4 数据更新3.5 视图3.6 数据控制3.7 嵌入式SQL3.8 小结,39,3.3 查 询,3.3.1 概述3.3.2 单表查询3.3.3 连接查询3.3.4 嵌套查询3.3.5 集合查询3.3.6 小结,40,3.3.1 概述,SQL语言中最主要、最核心的部分是它的查询功能。在关系数据库中,查询的含义是用来描述如何从数据库中获取所需要的数据。关于查询的含义要明确以下3点:任何时候使用SQL语句与SQL Server中的数据进行交互时,都是在执行一个查询。查询可以一次性地进行,也可以保存下来,以便以后多次执行。查询是DBA与SQL Server数据库进行交互的重要手段。,41,3.3.1 概述,语句格式SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;,42,语句格式,SELECT子句:指定要显示的属性列FROM子句:指定查询对象(基本表或视图)WHERE子句:指定查询条件 GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。HAVING短语:筛选出只有满足指定条件的组ORDER BY子句:对查询结果表按指定列值的升序或降序排序,43,语句格式,整个SELECT语句的含义是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。如果有ORDER子句,则结果表还要按的值的升序或降序排列。,44,示例数据库,学生-课程数据库学生表:Student(Sno,Sname,Ssex,Sage,Sdept)课程表:Course(Cno,Cname,Cpno,Ccredit)学生选课表:SC(Sno,Cno,Grade),45,3.3 查 询,3.3.1 概述3.3.2 单表查询3.3.3 连接查询3.3.4 嵌套查询3.3.5 集合查询3.3.6 小结,46,3.3.2 单表查询,查询仅涉及一个表,是一种最简单的查询操作一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用集函数五、对查询结果分组,47,查询指定列,例1 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student;,48,查询指定列,例2 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;,49,查询全部列,例3 查询全体学生的详细记录。SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;或SELECT*FROM Student;,50,3.查询经过计算的值,SELECT子句的为表达式算术表达式字符串常量函数列别名等,51,3.查询经过计算的值,例4 查全体学生的姓名及其出生年份。SELECT Sname,2006-SageFROM Student;,52,3.查询经过计算的值,例5 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth:,2000-Sage,ISLOWER(Sdept)FROM Student;,53,例题(续),输出结果:Sname Year of Birth:2000-Sage ISLOWER(Sdept)-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,54,例5.1 使用列别名改变查询结果的列标题,SELECT Sname NAME,Year of Birth:BIRTH,2000-Sage BIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROM Student;输出结果:NAME BIRTH BIRTHDAY DEPARTMENT-李勇 Year of Birth:1976 cs 刘晨 Year of Birth:1977 is 王名 Year of Birth:1978 ma 张立 Year of Birth:1977 is,55,二、选择表中的若干元组,消除取值重复的行查询满足条件的元组,56,1.消除取值重复的行,在SELECT子句中使用DISTINCT短语假设SC表中有下列数据 Sno Cno Grade-95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,57,ALL 与 DISTINCT,例6 查询选修了课程的学生学号。(1)SELECT Sno FROM SC;或(默认 ALL)SELECT ALL Sno FROM SC;结果:Sno-95001 95001 95001 95002 95002,58,例题(续),(2)SELECT DISTINCT Sno FROM SC;结果:Sno-95001 95002,59,例题(续),注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确的写法 SELECT DISTINCT Cno,Grade FROM SC;,60,2.查询满足条件的元组,WHERE子句常用的查询条件,61,(1)比较大小,在WHERE子句的中使用比较运算符=,=,!,!=20;,62,(1)比较大小,63,(2)确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;,64,(2)确定范围,65,例题(续),例11 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage NOT BETWEEN 20 AND 23;,66,(3)确定集合,使用谓词 IN,NOT IN:用逗号分隔的一组取值,67,(3)确定集合,例12查询信息系(IS)、数学系(MA)和计 算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS);,68,(3)确定集合,例13查询既不是信息系、数学系,也不是计算 机科学系的学生的姓名和性别。SELECT Sname,SsexFROM Student WHERE Sdept NOT IN(IS,MA,CS);,69,(4)字符串匹配,谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:NOT LIKE ESCAPE 其含义是查找指定的属性列值与相匹配的元组。:指定匹配模板 匹配模板:固定字符串或含通配符(%,_)的字符串 当匹配模板为固定字符串时,可以用=运算符取代 LIKE 谓词 用!=或 运算符取代 NOT LIKE 谓词,70,通配符,%(百分号)代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串_(下横线)代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串,71,ESCAPE 短语:,当用户要查询的字符串本身就含有%或 _ 时,要使用ESCAPE 短语对通配符进行转义。,72,例题,1)匹配模板为固定字符串 例14 查询学号为95001的学生的详细情况。SELECT*FROM Student WHERE Sno LIKE 95001;等价于:SELECT*FROM Student WHERE Sno=95001;,73,74,例题(续),2)匹配模板为含通配符的字符串,例15 查询所有姓刘学生的姓名、学号和性别。SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;,75,例题(续),匹配模板为含通配符的字符串(续)例16 查询姓欧阳且全名为三个汉字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳_ _;,76,例题(续),匹配模板为含通配符的字符串(续)例17 查询名字中第2个字为阳字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _ _阳%;,77,例题(续),匹配模板为含通配符的字符串(续)例18 查询所有不姓刘的学生姓名。SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 刘%;,78,例题(续),3)使用换码字符将通配符转义为普通字符 例19 查询DB_Design课程的课程号和学分。SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE,79,例题(续),使用换码字符将通配符转义为普通字符(续)例20 查询以DB_开头,且倒数第3个字符为 i的课程的详细情况。SELECT*FROM Course WHERE Cname LIKE DB_%i_ _ ESCAPE;,80,(5)涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL“IS NULL”不能用“=NULL”代替,81,(5)涉及空值的查询,例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,82,例题(续),例22 查所有有成绩的学生学号和课程号。SELECT Sno,Cno FROM SCWHERE Grade IS NOT NULL;,83,(6)多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND,84,例题,例23 查询计算机系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND Sage20;,85,改写例12,例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN(IS,MA,CS)可改写为:SELECT Sname,SsexFROM StudentWHERE Sdept=IS OR Sdept=MA OR Sdept=CS;,86,改写例10,例10 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;可改写为:SELECT Sname,Sdept,SageFROM Student WHERE Sage=20 AND Sage=23;,87,三、对查询结果排序,使用ORDER BY子句 可以按一个或多个属性列排序 升序:ASC;降序:DESC;缺省值为升序当排序列含空值时ASC:排序列为空值的元组最后显示DESC:排序列为空值的元组最先显示,88,对查询结果排序(续),例24 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,89,对查询结果排序(续),例25 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。SELECT*FROM Student ORDER BY Sdept,Sage DESC;,90,四、使用集函数,5类主要集函数计数COUNT(DISTINCT|ALL*)COUNT(DISTINCT|ALL)计算总和SUM(DISTINCT|ALL)计算平均值AVG(DISTINCT|ALL),91,使用集函数(续),求一列中最大值MAX(DISTINCT|ALL)求最小值MIN(DISTINCT|ALL)DISTINCT短语:在计算时要取消指定列中的重复值ALL短语:不取消重复值ALL为缺省值,92,使用集函数(续),例26 查询学生总人数。SELECT COUNT(*)FROM Student;例27 查询选修了课程的学生人数。SELECT COUNT(DISTINCT Sno)FROM SC;注:用DISTINCT以避免重复计算学生人数,93,94,使用集函数(续),例28 计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SC WHERE Cno=1;例29 查询选修1号课程的学生最高分数。SELECT MAX(Grade)FROM SC WHER Cno=1;,95,96,五、对查询结果分组,使用GROUP BY子句分组 细化集函数的作用对象 未对查询结果分组,集函数将作用于整个查询结果 对查询结果分组后,集函数将分别作用于每个组,97,使用GROUP BY子句分组,例30 求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;,98,99,对查询结果分组(续),GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数,100,使用HAVING短语筛选最终输出结果,例31 查询选修了3门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;,101,例题,例32 查询有3门以上课程是90分以上的 学生的学号及(90分以上的)课程数 SELECT Sno,COUNT(*)FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;,102,使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出HAVING短语与WHERE子句的区别:作用对象不同WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。,