第3章关系数据库标准语言SQL.ppt

上传人:本田雅阁 文档编号:2254402 上传时间:2019-03-11 格式:PPT 页数:35 大小:332.51KB
返回 下载 相关 举报
第3章关系数据库标准语言SQL.ppt_第1页
第1页 / 共35页
第3章关系数据库标准语言SQL.ppt_第2页
第2页 / 共35页
第3章关系数据库标准语言SQL.ppt_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第3章关系数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《第3章关系数据库标准语言SQL.ppt(35页珍藏版)》请在三一文库上搜索。

1、数据库原理及应用 Principle and Application of Database 第四章 关系数据库标准语言SQL,学习目标,了解SQL语言的特点 掌握SQL的数据定义 掌握SQL的单表查询,4.1 SQL概述,SQL的特点 综合统一:SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体。 高度非过程化:非关系数据模型的数据操纵语言是面向过程的语言,操作必须指明存取路径;而用SQL语言进行数据操作,只要提出“做什么”,无须指明“怎么做”,因此无需了解存取路径。 面向集合的操作方式:非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录;而SQL语

2、言采用的集合操作方式,不仅操作对象、查询结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。 以同一种语法结构提供两种使用方法:SQL语言既是自含式语言,能独立地用于联机交互;又是嵌入式语言,能嵌入到高级语言中进行混合编程。,语言简洁,易学易用:完成核心功能只用9个动词:,4.2 数 据 定 义,定义、修改与删除基本表 定义基本表 CREATE TABLE ( , , ); 其中:表名为所要定义的基本表的名字,列名为组成该表的各个属性(列),列级完整性约束条件为涉及相应属性列的完整性约束条件,表级完整性约束条件为涉及一个或多个属性列的完整性约束条件。常用的完整性约束有:

3、主码约束PRIMARY KEY、唯一性约束UNIQUE、非空值约束NOT NULL、参照完整性约束FOREIGN KEY REFERENCES。,例1建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、系别Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。 CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20) UNIQUE, Ssex CHAR(1) , Sage INT,Sdept CHAR(15);,修改基本表 ALTER TABLE ADD 完整

4、性约束 DROP DROP column MODIFY ; 其中:表名为要修改的基本表,ADD子句为增加新列和新的完整性约束条件,DROP子句为删除指定的完整性约束条件,MODIFY子句为用于修改列名和数据类型。 例2向Student表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE Student ADD Scome DATE; 不论基本表中原来是否已有数据,新增加的列一律为空值。,例3将年龄的数据类型改为半字长整数。 ALTER TABLE Student MODIFY Sage SMALLINT; 修改原有的列定义有可能会破坏已有数据。 例4删除学生姓名必须取唯一值的约束

5、。 ALTER TABLE Student DROP UNIQUE(Sname); SQL没有提供删除属性列的语句,用户只能间接实现这一功能:先把表中要保留的列及其内容复制到一个新表中,然后删除原表,再将新表重命名为原表名。但有的DBMS提供直接删除属性列的语句,如:ALTER TABLE Student Drop Scome;,删除基本表 DROP TABLE ; 基本表定义一旦删除,表中的数据、表上建立的索引和视图都将自动删除。但Oracle中删除基本表后建立在此表上的视图仍保留在数据字典中,但用户引用时就出错。 例5删除Student表。 DROP TABLE Student ; 建立与

6、删除索引 建立索引是加快查询速度的有效手段,建立与删除索引由DBA或表的属主负责完成,但有些DBMS自动建立PRIMARY或KEY UNIQUE列上的索引。,建立索引 CREATE UNIQUE CLUSTER INDEX ON (, ); 用指定要建索引的基本表。 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔 用指定索引值的排列次序,升序ASC,降序DESC。缺省ASC。 UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。 CLUSTER表示要建立的索引是聚簇索引。 例6为学生-课程数据库中Student,Course,SC三个表建立索引。其中Student表按学号升序建唯

7、一索引,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);,唯一索引:对于已含重复值的属性列不能建UNIQUE索引,对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值,这相当于增加了一个UNIQUE约束。 聚簇索引:建立聚簇索引后,基表中数据也需要按指定的聚

8、簇属性值的升序或降序存放,即聚簇索引的索引项顺序与表中记录的物理顺序一致。 例:CREATE CLUSTER INDEX Stusname ON Student(Sname); 在Student表的Sname列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。在一个基本表上最多只能建立一个聚簇索引,聚簇索引对于某些类型的查询,可以提高查询效率,聚簇索引在很少对基表进行增删操作或很少对其中的变长列进行修改操作的场合下非常适用。,删除索引 DROP INDEX ; 删除索引时,系统会从数据字典中删去有关该索引的描述。 例7删除Student表的Stusname索引。 D

9、ROP INDEX Stusname;,4.3 查询,概述 查询语句格式: SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC ; 其中:SELECT子句指定要显示的属性列;FROM子句指定查询对象(基本表或视图);WHERE子句指定查询条件;GROUP BY子句对查询结果按指定列的值分组,该属性列值相等的元组为一个组,通常会在每组中作用集函数;HAVING短语筛选出只有满足指定条件的组;ORDER BY子句对查询结果表按指定列值的升序或降序排序。,Student,Course,Sc,示例数据库:学生-课程数

10、据库,单表查询:查询仅涉及一个表,是一种最简单的查询操作。 选择表中的若干列 查询指定列或全部列 例1查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student; 例2查询全体学生的姓名、学号、所在系。 SELECT Sname,Sno,Sdept FROM Student; 例3查询全体学生的详细记录。 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT * FROM Student;,查询经过计算的值:SELECT子句的为算术表达式、字符串常量、函数、列别名等 。 例4 查全体学生的姓名及其出生年份。

11、SELECT Sname,Sage FROM Student; 输出结果: Sname Sage - - 李勇 1976 刘晨 1977 王名 1978 张立 1978,例5查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。 SELECT Sname,Year of Birth:,Sage, LOWER(Sdept) FROM Student; 输出结果: Sname Year of Birth: Sage LOWER(Sdept) - - - - 李勇 Year of Birth: 1976 cs 刘晨 Year of Birth: 1977 is 王名 Year of Bi

12、rth: 1978 ma 张立 Year of Birth: 1977 is,可以使用列别名改变查询结果的列标题 SELECT Sname NAME,Year of Birth: BIRTH, Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM 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,选择

13、表中的若干元组:在WHERE子句中设置查询条件。 消除取值重复的行:在SELECT子句中使用DISTINCT短语。 例6查询选修了课程的学生学号。 SELECT Sno FROM SC; 或 SELECT ALL Sno FROM SC; SELECT DISTINCT Sno FROM SC; ALL的结果: Sno DISTINCT的结果: Sno - - 95001 95001 95001 95002 95001 95002 95002,注意:DISTINCT短语的作用范围是所有目标列。 例:查询选修课程的各种成绩。 错误的写法 SELECT DISTINCT Cno,DISTINCT

14、Grade FROM SC; 正确的写法 SELECT DISTINCT Cno,Grade FROM SC;,表4-3 常用的查询条件 确定大小:在WHERE子句的中使用比较运算符。 例8查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage = 20;,确定范围:在WHERE子句的中使用谓词BETWEEN AND或NOT BETWEEN AND 例10查询年龄在2023岁(包括20岁和23岁)间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage

15、BETWEEN 20 AND 23; 例11查询年龄不在2023岁之间的学生姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;,确定集合:在WHERE子句的中使用谓词IN(值表)或NOT IN (值表),(值表)是用逗号分隔的一组取值。 例12查询信息系、数学系和计算机系学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN ( IS,MA,CS ); 例13查询既不是信息系、数学系,也不是计算机系的学生的姓名和性别。 SELEC

16、T Sname,Ssex FROM Student WHERE Sdept NOT IN ( IS,MA,CS );,字符串匹配:在WHERE子句的中使用谓词NOT LIKE 匹配串 ESCAPE 换码字符。其中匹配串指定了匹配模板,匹配模板就是固定字符串或含通配符的字符串,当匹配模板为固定字符串时,可以用 =取代 LIKE ,用 != 或 取代 NOT LIKE 。 通配符% (百分号):代表任意长度(可以为0)的字符串。 例:a%b表示以a开头、以b结尾的任意长度的字符串,如acb、addgb、ab 等。 通配符_ (下横线):代表任意单个字符。 例:a_b表示以a开头、以b结尾的长度为3

17、的任意字符串,如acb、afb等。 ESCAPE 短语:当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE 换码字符 短语对通配符进行转义。,例14查询学号为95001的学生的详细情况。 SELECT * FROM Student WHERE Sno LIKE 95001; 等价于:SELECT * FROM Student WHERE Sno = 95001; 例15查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%; 例16查询姓“欧阳”且全名为三个汉字的学生的姓名。 SELEC

18、T Sname 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 刘%;,涉及空值的查询:在WHERE子句的中使用谓词IS NULL 或 IS NOT NULL,注意IS NULL 不能用= NULL 代替。 例21某些学生选修课程后没有参加考试,所以有选课记录但没有考试

19、成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL; 例22查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,多重条件查询:在WHERE子句的中使用逻辑运算符AND和 OR来联结多个查询条件, AND的优先级高于OR, 可用括号改变优先级。 例23查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept= CS AND Sage20; 例12查询信息系、数学系和计算机系学生的

20、姓名和性别 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查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄 SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 可改写为: SELECT Sname,Sdept,Sage FROM Student WHERE

21、Sage=20 AND Sage=23; 对查询结果排序:使用ORDER BY子句, 可以按一个或多个属性列排序, 升序ASC,降序DESC,缺省值为升序。当排序列含空值时,ASC排序列为空值的元组最后显示,DESC排序列为空值的元组最先显示。,例24查询选修了3号课程的学生的学号及成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC WHERE Cno= 3 ORDER BY Grade DESC; 查询结果 Sno Grade - - 95010 95001 88 95002 80 例25查询全体学生情况,结果按所在系的系号升序排列,同一系中的学生按年龄降序排列

22、。 SELECT * FROM Student ORDER BY Sdept,Sage DESC;,使用集函数: 5类主要集函数 计数:COUNT(DISTINCT|ALL *) COUNT(DISTINCT|ALL ) 计算总和:SUM(DISTINCT|ALL ) 计算平均值:AVG(DISTINCT|ALL ) 求最大值:MAX(DISTINCT|ALL ) 求最小值:MIN(DISTINCT|ALL ) 其中:DISTINCT短语在计算时要取消指定列中的重复值,ALL短语不取消重复值,ALL为缺省值。,例26查询学生总人数。 SELECT COUNT(*) FROM Student;

23、例27查询选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC; 注:用DISTINCT以避免重复计算学生人数。 例28计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno= 1 ; 例29查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHER Cno= 1 ;,对查询结果分组: GROUP BY子句的作用对象是查询的中间结果表,分组方法是按指定一列或多列值分组,值相等的为一组。使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数。使用GR

24、OUP BY子句分组细化集函数的作用对象,未对查询结果分组,集函数将作用于整个查询结果;对查询结果分组后,集函数将分别作用于每个组。 例30求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 结果 Cno COUNT(Sno) 1 22 2 34 3 44 4 33 5 48,使用HAVING短语筛选最终输出结果:只有满足HAVING短语指定条件的组才输出,HAVING短语与WHERE子句的区别是WHERE子句作用于基表或视图,从中选择满足条件的元组;HAVING短语作用于组,从中选择满足条件的组。 例31查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3; 查询有3门以上课程是90分以上的学生的学号及课程数。SELECT Sno, COUNT(*) FROM SC WHERE Grade=90 GROUP BY Sno HAVING COUNT(*)=3;,小结,SQL语言的特点 SQL的数据定义 SQL的单表查询,下课了。,休息。,追 求,

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

当前位置:首页 > 其他


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