文档详情

第三章-关系数据库标准语言SQL

s9****2
实名认证
店铺
PPT
1.14MB
约298页
文档ID:605674510
第三章-关系数据库标准语言SQL_第1页
1/298

单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,*,*,第三章 关系数据库语言,SQL,,,3.1,SQL,概述,,结构化查询语言(,Structured Query Language,SQL,),:一个关系数据库语言,它的操作对象是以表的形式存放在关系数据库系统中的数据当前主流的数据库管理系统,如,Oracle,、,SQL server,等,都是基于,SQL,语言的SQL,具有通用性,功能介于关系代数与关系演算之间2024/9/14,2,,,SQL,的产生与发展,,1970,年,美国,IBM,研究中心的,E.F.Codd,连续发表多篇论文,提出关系模型1972,年,,IBM,公司开始研制实验型关系数据库管理系统,SYSTEM R,,配制的查询语言称为,SQUARE (Specifying Queries As Relational Expression ),语言,在语言中使用了较多的数学符号1974,年,,Boyce,和,Chamberlin,把,SQUARE,修改为,SEQUEL (Structured English,QUEry,Language ),语言。

后来,SEQUEL,简称为,SQL (Structured Query Language ),,即“结构式查询语言”,,SQL,的发音仍为“,sequel”,现在,SQL,已经成为一个标准 2024/9/14,3,,,SQL,数据库的体系结构,,,用户,1,用户,2,用户,3,用户,4,视图,1,视图,1,基本表,1,基本表,2,基本表,3,基本表,4,存储文件,1,存储文件,2,存储文件,3,存储文件,4,图3-1,SQL,对,RDBMS,模式的支持,SQL,用户,外模式,模式,内模式,2024/9/14,4,,SQL,语言的主要特点如下,,综合统一,,高度非过程化,,面向集合的操作方式,,以同一种语法结构提供两种使用方式,,语言简洁,易学易用,,2024/9/14,5,,,1,、综合统一,,SQL,语言集数据定义语言,DDL,、数据操纵语言,DML,、数据控制语言,DCL,功能于一体,语言风格统一,可独立完成数据库生命周期中的全部活动如:定义关系模式、建立数据库、查询、更新、维护、数据库重构、数据库安全控制等,,,2,、高度非过程化,,“怎么做”,,“做什么”,,减轻了用户的负担,有利于提高数据独立性,2024/9/14,6,,,3,、面向集合的操作方式,,非关系数据模型:面向记录,,SQL,:集合操作,,,4,、以同一种语法结构提供两种使用方式,,可联机交互操作,,,可以嵌入到高级语言中,,2024/9/14,7,,,5,、语言简洁,易学易用,,9,个动词,,2024/9/14,8,,3.2 数据定义,,SQL,语言可定义,,外模式,…………………,视图,,概念模式,………………,表、约束及索引,,2024/9/14,9,,3.2.1 基本表的定义、修改与删除,1、,定义基本表,,,CREATE TABLE,<,表名>,,(, [ ],,[, [ ] ] …,,[, ],),;,,,<,表名,>:所要定义的基本表的名字,,<,列名,>:组成该表的各个属性(列),,<,列级完整性约束条件,>:涉及相应属性列的完整性约束条件,,<,表级完整性约束条件,>:涉及一个或多个属性列的完整性约束条件,2024/9/14,10,,列级约束的种类,,主码约束----,PRIMARY KEY,,唯一约束----,UNIQUE,,该列不允许出现重复的属性值,,非空值约束----,NOT,,NULL,或,NULL,,字段的值非空或空,,关系的主键必须指定为,NOT,,NULL,,参照完整性约束----,FOREIGN KEY,(外码约束),,定义不同关系表之间的参照完整性,,[CONSTRAINT <,约束名,>],,FOREIGN KEY REFERENCES <,被参照表名,>,(,<,与外码对应的主码名,>,),2024/9/14,11,,,域完整性约束----,CHECK,,为该列设置应满足的条件,,[CONTRAINT,<约束名>,]CHECK,(<约束条件表达式>),,,默认约束----,DEFAULT,,为该列的属性值设置一个默认值,,[CONTRAINT,<约束名>,] DEFAULT,<默认值>,2024/9/14,12,,唯一约束,,指定若干列不允许出现有重复的属性值,,[CONSTRAINT <,约束名,>],UNIQUE(<,列组>),,,主码约束,,指定主键不空,也不允许重复出现,,[CONSTRAINT <,约束名,>],PRIMARY KEY,(<,列组,>),表级约束的种类,,2024/9/14,13,,参照完整性约束,(外键约束),,定义不同关系表之间的参照完整性,,[CONSTRAINT <,约束名,>],FOREIGN KEY,(,<,外码,>,),REFERENCES <,被参照表名,>,(,<,与外码对应的主码名,>,),,,域完整性约束,,为该列设置应满足的条件,,[CONSTRAINT,<约束名>,],CHECK,(<约束条件表达式>),,2024/9/14,14,,,SQL,中,域的概念用,数据类型,来实现。

定义表的各个属性列时需指明其数据类型及长度(或精度)2024/9/14,15,,,SQL,数据类型,,常用数据类型,,含义,CHAR(n),长度为,n,的定长字符串,,VARCHAR(n),最大长度为,n,的变长字符串,INT,长整数(也可以写作,INTEGER,),SMALLINT,短整数,NUMERIC(p,d),十进制数,由,p,位数字(不包括符号、小数点)组成,小数后面有,d,位数字,FLOAT(n),浮点数,精度至少为,n,位数字,DATE,日期,包含年、月、日,格式为,YYYY-MM-DD,TIME,时间,包含一日的时、分、秒,格式为,HH:MM:SS,2024/9/14,16,,例题,,[例1] 建立学生表,Student(,学号,姓名,性别,出生年月,入学成绩,党员否,班级编号,简历,照片,),其中学号为主码,班级编号为外码,姓名取值唯一,性别只能是“男”或“女”CREATE,,TABLE Student,学生,(,,学号,CHAR(10) PRIMARY KEY,,,姓名,CHAR(10) CONSTAINT S1 UNIQUE,,,性别,CHAR(2),CHECK,(,性别,in (,男,,,女,)),,,出生年月,DATE,,,入学成绩,INT,,,党员否,BOOLEAN,,,班级编号,CHAR(6),,,简历,CLOB,,,照片,BLOB);,2024/9/14,17,,例题,[例2] 建立一个选课表,Score (,学号,课程编号,成绩,学期,) ,,其中(学号,,,课程编号,),为主码。

CREATE TABLE Score(,,,学号,CHAR(10) ,,,,课程编号,CHAR(8) ,,,,成绩,INT,,,,学期,CHAR(9),,,Primary key (,学号,,,课程编号,),,,foreign key(,学号,) references Student(,学号,),,,,foreign key(,课程编号,) references Course(,课程编号,),,,check (,成绩,>=0 and,成绩,<=100));,2024/9/14,18,,,[例3,],建立学生选课数据库中的如下,2,个表及它们之间的关系班级表:,Class(,班级编号,班级名称,所属专业,人数),,课程表:,Course(,课程编号,课程名称,先修课号,学时,学分,),2024/9/14,19,,,说明,,一个表中可有多个,UNIQUE,声明,但只能有一个,PRIMARY,,KEY,声明声明为,PRIMARY,,KEY,的属性不允许取空值,但声明为,UNIQUE,属性可取空值最后的分号是,SQL,命令的结束标志,,在,SQL,语句中不分大小写,,定义表的各个属性时,不仅需要指明其数据类型,还需要给出其长度。

2024/9/14,20,,,Primary key,在建立的时候会默认地建立此域的索引,且此,primary key,可以作为作为另外的表的,foreign key,PRIMARY KEY,与,UNIQUE,的区别?,,,Primary key,一定是,not null,,Unique,无此限制,但只能有一个空值,,2024/9/14,21,,,CREATE,,TABLE,,<,表名,>,,(<,列名,><,数据类型,>[,列级约束,],,[,<,列名,><,数据类型,>[,列级约束,]…],,[,<,表级约束,>]);,,<,表名,>,:所要定义的基本表的名字,,<,列名,>,:组成该表的各个属性(列),,<,列级约束,>,:涉及相应属性列的完整性约束条件,,<,表级约束,>,:涉及一个或多个属性列的完整性约束条件,2024/9/14,22,,2、修改基本表,,ALTER TABLE,<,表名>,,[,ADD COLUMN<,新列名> [ 完整性约束 ] ],,[,DROP COLUMN <,列名>],,[,DROP CONSTRAINT <,完整性约束名> ],,[,ALTER COLUMN <,列名> ];,,,:要修改的基本表,,ADD,子句:增加新列和新的完整性约束条件,,DROP,子句:删除指定的列或完整性约束条件,,ALTER,子句:用于修改原有列的定义,如列名和数据类型,2024/9/14,23,,例题,,[例4] 向,Student,表增加“,Scome,(,入学时间)”列,其数据类型为日期型。

ALTER TABLE Student ADD,Scome,DATE;,,,不论基本表中原来是否已有数据,新增加的列一律为空值2024/9/14,24,,,删除属性列,,直接删除,,间接删除,,把表中要保留的列及其内容复制到一个新表中,,删除原表,,再将新表重命名为原表名,2024/9/14,25,,,[例5] 删除,Student,表中的“,Scome,(,入学时间)”列ALTER TABLE Student DROP,Scome,;,,,,2024/9/14,26,,例题,,[例6] 删除学生表中姓名必须取唯一值的约束ALTER TABLE Student DROP CONSTRAINT S1;,,ALTER TABLE Student DROP,UNIQUE(Sname,);,2024/9/14,27,,,,,[例7] 将学生表“,Sage”,的数据类型改为半字长整数ALTER TABLE Student ALTER Sage SMALLINT;,,,注:修改原有的列定义有可能会破坏已有数据,,2024/9/14,28,,3、删除基本表,,DROP TABLE,<,表名>,,[,RESTRICT|CASCADE];,,,,:要删除的基本表,,RESTRICT,,选项:有条件删除,,没有基于此表的约束引用、视图、触发器、存储过程或函数等,,CASCADE,,选项:无条件删除,,与此表相关的依赖对象将一起删除,,2024/9/14,29,,例题,,,[例7] 删除,Student,表,,,,DROP TABLE Student ;,2024/9/14,30,,3.2.2 建立与删除索引,,建立索引是加快查询速度的有效手段,,建立索引,,DBA,或表的属主(即建立表的人)根据需要建立,,有些,DBMS,自动建立以下列上的索引,,,PRIMARY KEY,,UNIQUE,,维护索引,,,DBMS,自动完成,,使用索引,,,DBMS,自动选择是否使用索引以及使用哪些索引,2024/9/14,31,,,在,SQL86,和,SQL89,标准中,基本表没有主码概念,可以用,索引,机制来弥补。

索引属于物理存储的路径概念,而不是逻辑的概念在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混在一块了2024/9/14,32,,,因此,在,SQL2,中引入了主码(主键)的概念,用户在创建基本表时用主码子句,Primary key,直接定义主码但至今大多数,DBMS,仍使用索引机制,有索引创建和撤销语句,其功能仅限于查询时起作用2024/9/14,33,,1、建立索引,,语句格式,,CREATE,[UNIQUE] [CLUSTER],INDEX <,索引名>,ON<,表名>,,([][,[] ]…);,,,,:,指定要建索引的基本表名字索引可以建立在该表的一,列,或多列上,各列名之间用逗号分隔,,:,指定索引值的排列次序,升序:,ASC,,降序:,DESC缺省值:,ASC,,UNIQUE:,表明此索引的每一个索引值只对应唯一的数据记录,,CLUSTER:,表示要建立的索引是聚簇索引,,省略,UNIQUE,和,CLUSTER,时,表示要建立非唯一索引,即普通索引2024/9/14,34,,例题,,[例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);,,2024/9/14,35,,,唯一值索引,,对于已含重复值的属性列不能建,UNIQUE,索引,,对某个列建立,UNIQUE,索引后,插入新记录时,DBMS,会自动检查新记录在该列上是否取了重复值这相当于增加了一个,UNIQUE,约束,2024/9/14,36,,,聚簇索引,,建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放也即聚簇索引的索引项顺序与表中记录的物理顺序一致,,例:,,CREATE CLUSTER INDEX,Stusname,ON,,,Student(Sname,);,,在,Student,表的,Sname,(,姓名)列上建立一个聚簇索引,而且,Student,表中的记录将按照,Sname,值的升序存放,2024/9/14,37,,,在一个基本表上最多只能建立,一个聚簇索引,,,聚簇索引的用途,,对于某些类型的查询,可以提高查询效率,,,聚簇索引的适用范围,,很少对基表进行增删操作,,很少对其中的变长列进行修改操作,,2024/9/14,38,,2、删除索引,,语句格式,,DROP INDEX,<,索引名>;,,,删除索引时,系统会从数据字典中删去有关该索引的描述。

[例7] 删除,Student,表的,Stusname,索引DROP INDEX,Stusname,;,2024/9/14,39,,,,索引一经建立,就由系统来维护它,不需要用户干预建立索引减少查询操作的时间,但如果数据增加删改频繁,系统会花费许多时间来维护索引这时需要删除一些不必要的索引2024/9/14,40,,3.3 数据查询,,SQL,语言的数据操纵主要是指对数据库数据的查询和更新数据库查询,是,SQL,数据库操纵语句的,核心,在,SQL,语句中,使用,SELECT,语句进行查询2024/9/14,41,,SELECT—FROM—WHERE,句型,,在关系代数中最常用的式子是下列表达式:,,,π,A1,…,An,(σ,F,(R,1,×…×,R,m,)),,R,1,、…、,R,m,为关系,,F,是公式,,A,1,、…、A,n,为属性针对上述表达式,,SQL,为此设计了,SELECT—FROM—WHERE,句型:,,,SELECT A,1,,…,A,n,,FROM R,1,,…,,R,m,,WHERE F,,该句型是从关系代数表达式演变来的,但,WHERE,子句中的条件表达式,F,要比关系代数中公式更灵活。

2024/9/14,42,,语句格式,,SELECT,[ALL| DISTINCT],<,目标列表达式>,,[,] …,,FROM <,表名或视图名,>,[,] …,,[WHERE <,条件表达式,>],,[GROUP BY <,列名1,>[HAVING <,组选择条件,>]],,[ORDER BY <,列名2,> [ASC|DESC]];,,2024/9/14,43,,SELECT,子句,:指定要显示的属性列,,FROM,子句,:指定查询对象(基本表或视图),,WHERE,子句,:指定查询条件,,GROUP BY,子句,:对查询结果按指定列的值分组,该属性列值相等的元组为一个组通常会在每组中作用集函数HAVING,短语,:筛选出只有满足指定条件的组,,ORDER BY,子句,:对查询结果表按指定列值的升序或降序排序,,2024/9/14,44,,,学生-课程数据库,,学生表:,Student(,学号,姓名,性别,出生年月,入学成绩,党员否,班级编号,简历,照片,),,班级表:,Class(,班级编号,班级名称,所属专业,人数),,课程表:,Course(,课程编号,课程名称,先修课号,学时,学分,),,选课表:,Score(,学号,课程编号,成绩,学期,),2024/9/14,45,,3.3.1 单表查询,,查询仅涉及一个表,是一种最简单的查询操作,,选择表中的若干列,,选择表中的若干元组,,对查询结果排序,,使用聚集函数,,对查询结果分组,,2024/9/14,46,,单表查询语句格式,,,SELECT,目标属性列组,L,,FROM,表或视图列,R,,WHERE,元组选择条件,C;,,,与其对应的关系代数表达式为,,L,(σ,C,(R)),。

2024/9/14,47,,1、选择表中的若干列,1)查询指定列,,例: 查询全体学生的学号与姓名SELECT,学号,姓名,,FROM Student,;,,,,例: 查询全体学生的姓名、学号和班级编号,SELECT,姓名,学号,班级编号,,FROM Student,;,2024/9/14,48,,2)查询全部列,,例: 查询全体学生的详细记录SELECT,学号,姓名,性别,出生年月,入学成绩,党员否,班级编号,简历,照片,,FROM Student,;,,,或,,,SELECT,*,,FROM Student,;,2024/9/14,49,,,,例:查询所有课程的详细记录SELECT,课程编号,课程名称,先修课号,学时,学分,,FROM Course,;,,,或,,,SELECT,*,,FROM Course,;,2024/9/14,50,,3)查询经过计算的值,,SELECT,子句的为表达式,,算术表达式,,字符串常量,,函数,,列别名等,,2024/9/14,51,,,例:  查全体学生的姓名、年龄和入学成绩SELECT,姓名,2010-,year(,出生日期),入学成绩,,FROM Student,;,,,输出结果:,,姓名   2010-,year(,出生日期)  入学成绩,,-----   ----------------------   ----------,,,张楚    21          545,,欧阳佳慧   20 516,,孔灵柱    21 526,,2024/9/14,52,,,使用指定,别名,的方式对查询结果表中出现的任何属性列进行,重命名,,来改变查询结果表中的列标题。

语句格式,,,as,<,别名>,,2024/9/14,53,,,例:  查全体学生的姓名、年龄和入学成绩SELECT,姓名,2010-,year(,出生日期),as,,年龄,入学成绩,,FROM Student,;,,,输出结果:,,姓名   年龄          入学成绩,,-----   ----------------------   ----------,,,张楚    21          545,,欧阳佳慧   20 516,,孔灵柱    21 526,2024/9/14,54,,2、选择表中的若干元组,,消除取值重复的行,,,查询满足条件的元组,,,2024/9/14,55,,,1)消除取值重复的行,,在,SELECT,子句中使用,DISTINCT,短语,,,假设选课表中有下列数据,,学号 课程编号,,成绩,,------- ------- -------,,95001 1 92,,95001 2 85,,95001 3 88,,95002 2 90,,95002 3 80,2024/9/14,56,,,ALL,与,DISTINCT,,,例: 查询选修了课程的学生学号。

1),SELECT,学号,FROM Score;,,,或(默认,ALL),,SELECT ALL,学号,FROM Score;,结果:,,学号,,,-------,,95001,,95001,,95001,,95002,,95002,2024/9/14,57,,,(2),SELECT,DISTINCT,,学号,,FROM Score,;,,,,结果:,,学号,,-------,,95001,,95002,,,2024/9/14,58,,,注意:,DISTINCT,短语的作用范围是,所有目标列,,,例:查询选修课程的各种成绩,,错误的写法,,SELECT DISTINCT,课程号,,DISTINCT,成绩,,FROM Score,;,,正确的写法,,,SELECT DISTINCT,课程号,成绩,,,FROM Score,;,2024/9/14,59,,2)查询满足条件的元组,,通过,WHERE,子句实现,,WHERE,子句常用的查询条件,,,2024/9/14,60,,(1)比较大小,,在,WHERE,子句的中使用比较运算符,,=,>,=,,!>,!<,,,逻辑运算符,NOT +,比较运算符,,,例: 查询考试成绩有不及格的学生的学号。

SELECT,学号,,FROM Score,,WHERE,成绩<60,;,2024/9/14,61,,,例:查询所有年龄在20岁以下的学生姓名及其年龄SELECT,姓名,2010-,year(,出生日期),as,年龄,,FROM Student,,WHERE,年龄< 20;,,或,,SELECT,姓名,2010-,year(,出生日期),as,年龄,,FROM Student,,,WHERE NOT,年龄,>=,,20,2024/9/14,62,,使用谓词,BETWEEN,…,AND,…,,,NOT BETWEEN,…,AND,…,,,例: 查询入学成绩在500,~530,之间的学生信息,,,SELECT *,,FROM Student,,,WHERE,入学成绩,BETWEEN 500 AND 530;,,注意,:,查询结果包括成绩等于,500,和,530,的学生,(2)确定范围,,2024/9/14,63,,,例: 查询出生日期不在1985年1月1日到1986年1月1日之间的学生姓名、性别和出生日期,,,SELECT,姓名,性别,出生日期,,FROM Student,,,WHERE,出生日期,NOT BETWEEN ‘1985-1-1’ AND ‘1986-1-1’;,2024/9/14,64,,(3)确定集合,,使用谓词,IN,<,值表>,,NOT IN,<,值表>,,:用逗号分隔的一组离散值,,,例: 查询200601、200602和200603班学生的姓名和性别。

SELECT,姓名,性别,,FROM Student,,WHERE,班级编号,IN ( ‘200601',‘200602',‘200603' );,2024/9/14,65,,例: 查询既不是200601班也不是200602班学生的姓名和性别SELECT,姓名,性别,,FROM Student,,WHERE,班级编号,NOT IN ( ‘200601',‘200602');,,,2024/9/14,66,,(4)字符串匹配,,,[,NOT] LIKE,‘<,匹配串>’ [,ESCAPE ‘ <,换码字符>’],,查找指定的属性列值与,<,匹配串,>,相匹配的记录固定字符串或含通配符的字符串,,当匹配串为固定字符串时,,,可以用 = 运算符取代,LIKE,谓词,,用 != 或 运算符取代,NOT LIKE,谓词,2024/9/14,67,,,通配符,,% (百分号) 代表,任意长度,(长度可以为0)的字符串,,例:,a%b,表示以,a,开头,以,b,结尾的任意长度的字符串如,acb,addgb,ab,,等都满足该匹配串,,_ (下横线) 代表,任意单个,字符,,例:,a_b,表示以,a,开头,以,b,结尾的长度为3的任意字符串。

如,acb,afb,等都满足该匹配串,2024/9/14,68,,,ESCAPE,短语,,当用户要查询的字符串本身就含有 % 或 _ 时,要使用,ESCAPE '<,换码字符>' 短语对通配符进行转义2024/9/14,69,,,1) 匹配模板为固定字符串,,例:,查询学号为95001的学生的详细情况SELECT *,,FROM Student,,,WHERE,学号,LIKE '95001';,,等价于:,,,SELECT *,,FROM Student,,WHERE,学号= '95001';,2024/9/14,70,,2) 匹配模板为含通配符的字符串,,,例: 查询所有姓刘的学生姓名、学号和性别SELECT,姓名,学号,性别,,FROM Student,,,WHERE,姓名,LIKE ‘,刘,%’;,,,例: 查询所有不姓刘的学生姓名、学号和性别SELECT,姓名,学号,性别,,FROM Student,,,WHERE,姓名,NOT LIKE ‘,刘,%’;,,2024/9/14,71,,,例:查询姓"欧阳"且全名为三个汉字的学生的姓名SELECT,姓名,,,性别,,FROM Student,,,WHERE,姓名,LIKE ‘,欧阳_ _',;,,,例: 查询名字中第2个字为"阳"字的学生的姓名和学号。

SELECT,姓名,,,学号,,FROM Student,,,WHERE,姓名,LIKE '_ _,阳%',;,2024/9/14,72,,,3) 使用换码字符将通配符转义为普通字符,,,,例:  查询,DB_Design,课程的课程编号和学分SELECT,课程编号,学分,,FROM Course,,WHERE,课程名,LIKE 'DB,\,_Design',ESCAPE '\',,2024/9/14,73,,,例: 查询以“,DB_”,开头,且倒数第3个字符为,i,的课程的详细情况SELECT *,,FROM Course,,WHERE,课程名,LIKE 'DB,\,_%i_ _',ESCAPE ' \ ',;,,2024/9/14,74,,(5) 涉及空值的查询,,使用谓词,IS NULL,,或,IS NOT NULL,,“IS NULL”,不能用 “=,NULL”,代替,,,例: 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩查询缺少成绩的学生的学号和相应的课程编号SELECT,学号,课程编号,,FROM Score,,WHERE,成绩,IS NULL;,2024/9/14,75,,,例: 查所有有成绩的学生学号和课程编号。

SELECT,学号,课程编号,,FROM Score,,WHERE,成绩,IS NOT NULL;,,2024/9/14,76,,,例: 查询2006-2007年第二学期(200620072)所有选修成绩不及格的学生学号、课程编号及成绩SELECT,学号,课程编号,成绩,,FROM Score,,WHERE,成绩,<60,AND,,学期=‘200620072’,;,,,2024/9/14,77,,(6) 多重条件查询,,用逻辑运算符,AND,和,OR,来联结多个查询条件,,,AND,的优先级高于,OR,,,可以用括号改变优先级,,,可用来实现多种其他谓词,,[,NOT] IN,,[NOT] BETWEEN … AND …,2024/9/14,78,,,例: 查询200601班学生党员名单SELECT,姓名,,FROM Student,,WHERE,班级编号=‘200601,’,AND,,党员=1,;,,2024/9/14,79,,,例:查询200601、200602和200603班学生姓名和性别SELECT,姓名,性别,,FROM Student,,WHERE,班级编号,IN ( ‘200601',‘200602',‘200603' );,,改写为:,,SELECT,姓名,性别,,FROM Student,,WHERE,班级编号=‘,200601‘,OR,,班级编号=,‘200602‘,OR,,班级编号=,‘200603' ;,2024/9/14,80,,,例:查询年龄在,18~22,岁的学生的姓名和年龄。

SELECT,姓名,,,年龄,,FROM Student,,,WHERE,年龄,BETWEEN 18 AND 22;,,改写为,,SELECT,姓名,,,年龄,,FROM Student,,,WHERE,年龄,>=18,AND,,年龄,<=22;,2024/9/14,81,,3、对查询结果排序,,使用,ORDER BY,子句,,可以按一个或多个属性列排序,,升序:,ASC;,降序:,DESC;,缺省值为升序,,,当排序列含空值时,,ASC:,排序列为空值的元组最后显示,,DESC:,排序列为空值的元组最先显示,,2024/9/14,82,,,例: 查询2006091001号学生选修课程的课程编号及成绩,查询结果按成绩降序排列SELECT,课程编号,成绩,,FROM Score,,WHERE,学号,=‘2006091001',,ORDER BY,成绩,DESC,;,,2024/9/14,83,,例: 查询全体学生情况,查询结果按所在班级编号升序排列,同班中的学生按姓名降序排列SELECT *,,FROM Student,,ORDER BY,班级编号,,姓名,DESC,;,,,,2024/9/14,84,,4、使用聚集函数,,聚集,:对表中的某一列出现的值进行聚集运算。

2024/9/14,85,,,聚集函数,,计数,,COUNT,(,[DISTINCT|ALL] *,),,COUNT,(,[DISTINCT|ALL] <,列名,>,),,计算总和,,SUM,(,[DISTINCT|ALL] <,列名,>,),,计算平均值,,AVG,(,[DISTINCT|ALL] <,列名,>,),,求最大值,,MAX,(,[DISTINCT|ALL] <,列名,>,),,求最小值,,MIN,(,[DISTINCT|ALL] <,列名,>,),2024/9/14,86,,,DISTINCT,短语:在计算时要取消指定列中的重复值,,,ALL,短语:不取消重复值,,,ALL,为缺省值,,,聚集函数可用在,SELECT,或,HAVING,子句中2024/9/14,87,,,例,:,,查询学生总人数SELECT,COUNT,(*),,FROM Student,;,,,,,SELECT,COUNT,(*) as,总人数,,FROM Student,;,,2024/9/14,88,,,例: 查询选修了课程的学生人数SELECT,COUNT,(DISTINCT,学号,),,FROM Score,;,,注:用,DISTINCT,以避免重复计算学生人数,,,SELECT,COUNT,(DISTINCT,学号,) as,选课人数,,FROM Score,;,2024/9/14,89,,,例,:,,计算04010101号课程的学生平均成绩及最高分、最低分。

SELECT,AVG,(,成绩,),,MAX,(,成绩,),,MIN,(,成绩,),,FROM Score,,,WHERE,课程编号,= ',04010101,',;,2024/9/14,90,,5、对查询结果分组,,分组,:将表中的元组划分为若干组,每个组中的元组在某些指定属性列上具有相同的特征通过,GROUP,,BY,子句实现细化聚集函数的作用对象,,未对查询结果分组,集函数作用于整个查询结果,,对查询结果分组,后,,集函数分别作用于每个组,2024/9/14,91,,例: 统计不同课程的选课人数SELECT,课程编号,,COUNT,(学号),,FROM Score,,GROUP BY,课程编号,;,,结果:,课程编号,COUNT(,学号,),,,1 22,,,,,2 34,,3 44,,4 33,,5 48,2024/9/14,92,,,GROUP BY,子句的作用对象是查询的中间结果表,,,分组方法:按指定的一列或多列值分组,值相等的为一组,,,使用,GROUP BY,子句后,,SELECT,子句的列名列表中只能出现,分组属性,和,聚集函数,,2024/9/14,93,,,使用,HAVING,短语筛选最终输出结果,,只有满足,HAVING,短语,指定条件,的,组,才输出,,,HAVING,短语与,WHERE,子句的区别,,作用对象不同,,WHERE,子句作用于基表或视图,从中选择满足条件的元组。

HAVING,短语作用于组,从中选择满足条件的组2024/9/14,94,,,例:,,查询选修了2门以上课程的学生学号SELECT,学号,,FROM Score,,GROUP BY,学号,,HAVING COUNT(*) >2,;,2024/9/14,95,,,例:查询有2门以上课程是8,0,分以上的学生学号及(8,0,分以上的)课程数SELECT,学号,,,COUNT(*),,FROM Score,,WHERE,成绩,>=80,,GROUP BY,学号,,,HAVING,,COUNT(*)>=2,;,,2024/9/14,96,,3.3.2 连接查询,,连接查询,:同时涉及,两个或两个以上,的关系的查询需要将所涉及的表连接起来进行查询,即“,FROM,表或视图列,R,”子句要涉及多个表连接可在,FROM,子句或,WHERE,子句中建立2024/9/14,97,,,查询语句及运算符,,SELECT,,FROM <,表名,1>,<,表名,2>,,WHERE [<,表名1>.][.],,2024/9/14,98,,,SQL,中连接查询的主要类型,,,按连接的运算符分类,,等值连接,,非等值连接,,,按连接的类型分类,,内连接,,外连接,,交叉连接(笛卡尔积),2024/9/14,99,,,SQL-92,中连接查询的表示方法,,连接条件放在,FROM,子句的后面,,,基本格式,,FROM join_table,join_type,join_table,,[ON (join_condition)],2024/9/14,100,,,join_table,:,参与连接操作的表名,可指定别名。

join_type,:,连接类型Inner join,:内连接,,Left outer join,:左外连接,,Right outer join,:右外连接,,Full outer join,:全外连接,,Cross join,:笛卡尔积,,ON,:,连接条件2024/9/14,101,,,连接条件,(,连接谓词,),:,用来连接两个表的条件一般格式,,[<,表名,1>.]<,列名,1>,<,比较运算符,>,[<,表名,2>.]<,列名,2>,,,比较运算符:,=,、,>,、,<,、,>=,、,<=,、,!=,,,[<,表名,1>.]<,列名,1>,BETWEEN,[<,表名,2>.]<,列名,2>,AND,[<,表名,2>.]<,列名,3>,2024/9/14,102,,,连接字段,,连接字段,:连接谓词中的列名连接条件中的各连接字段类型必须是可比的,但不必是相同的,,2024/9/14,103,,1、内连接(,INNER JOIN),,内连接,:查询与连接条件匹配的元组内连接使用比较运算符比较连接字段的值2024/9/14,104,,1)等值连接,,等值连接,,连接运算符为,=,,的连接操作,,[<,表名,1>.]<,列名,1> = [<,表名,2>.]<,列名,2>,,,任何子句中引用表,1,和表,2,中同名属性时,都必须加表名前缀。

引用唯一属性名时可以加也可以省略表名前缀2024/9/14,105,,,例,:,查询每个学生及其选修课程的情况SELECT s.*,sc.*,,FROM Student AS s,JOIN,Score AS sc,,ON s.,学号=,sc.,学号,;,,,或,,SELECT s.*,sc.*,,FROM Student AS s,Score AS sc,,WHERE s.,学号=,sc.,学号,;,2024/9/14,106,,2)自然连接,,自然连接,,等值连接的一种特殊情况,把目标列中重复的属性列去掉2024/9/14,107,,,例:查询每个学生及其选修课程的情况SELECT s.*,sc.*,,FROM Student AS s JOIN Score AS sc,,ON s.,学号=,sc.,学号;,,,SELECT s.,学号,姓名,性别,出生日期,课程编号,成绩,学期,,FROM Student AS s JOIN Score AS sc,,ON s.,学号=,sc.,学号;,2024/9/14,108,,3)不等连接,,不等连接查询,,连接运算符 不是“,=”,的连接操作,,,[<,表名,1>.]<,列名,1><,比较运算符,>[<,表名,2>.]<,列名,2>,,比较运算符:,>,、,<,、,>=,、,<=,、,!=,,,,[<,表名,1>.]<,列名,1> BETWEEN [<,表名,2>.]<,列名,2> AND [<,表名,2>.]<,列名,3>,,2024/9/14,109,,4)自身连接,,一个表与其自己进行连接,称为表的,自身连接。

需要给表起别名以示区别,,,由于所有属性名都是同名属性,因此必须使用别名前缀2024/9/14,110,,例,:,查询每一门课的间接先修课,即先修课的先修课SELECT,,FIRST.,课程编号,, SECOND.,先修课号,,FROM Course,,AS,FIRST,JOIN,Course AS,SECOND,,,ON,,FIRST.,先修课号,=SECOND.,课程编号,;,,,2024/9/14,111,,2、外连接(,Outer Join,),,外连接与普通连接的区别,,,普通连接操作只输出满足连接条件的元组,,,外连接操作以指定表为连接主体,将主体表中,不满足,连接条件的元组一并输出,,2024/9/14,112,,A,B,C,a,b,c,b,b,f,c,a,d,B,C,D,b,c,d,b,c,e,a,d,b,e,f,g,S,A,B,C,D,a,b,c,d,a,b,c,e,c,a,d,b,A,B,C,D,a,b,c,d,a,b,c,e,c,a,d,b,b,b,f,null,A,B,C,D,a,b,c,d,a,b,c,e,c,a,d,b,null,e,f,g,A,B,C,D,a,b,c,d,a,b,c,e,c,a,d,b,b,b,f,null,null,e,f,g,S,R,,R,R,S,,R,S,,,S,R,2024/9/14,113,,,左外连接,,主体表出现在,JOIN,的左边,,LEFT JOIN,,右外连接,,主体表出现在,JOIN,的右边,,RIGHT JOIN,,全外连接,,左右两边都是主体表,,FULL JOIN,2024/9/14,114,,,外连接返回符合连接条件的元组,还包括主体表中的所有元组,,非主体表有一“万能”的虚行,该行全部由空值组成,,虚行可以和主体表中所有不满足连接条件的元组进行连接,,由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值,,2024/9/14,115,,,例,:,,查询每个学生选课情况,(,包括没有选修课程的学生,),。

SELECT s.,学号,,,姓名,,,性别,,,课程编号,,,成绩,,FROM Student AS s,LEFT JOIN,Score AS sc,,ON s.,学号 =,sc.,学号,;,,,SELECT s.,学号,,,姓名,,,性别,,,课程编号,,,成绩,,FROM Score AS sc,RIGHT JOIN,Student AS s,,ON s.,学号 =,sc.,学号,;,2024/9/14,116,,3、交叉连接,,交叉连接,:不带连接谓词的连接很少使用,,,例:,,,SELECT,,Student.*,Score.*,,FROM Student,Score,,或,,,SELECT,,Student.*,Score.*,,FROM Student CROSS JOIN Score,2024/9/14,117,,4、多表连接,,多表连接:,两个以上的表进行连接例:查询每个学生学号、姓名、选修的课程名及成绩SELECT Student.,学号,姓名,课程名称,,,成绩,,FROM Student JOIN Score ON Student.,学号=,Score.,学号,,JOIN Course ON Score.,课程编号,= Course.,课程编号;,2024/9/14,118,,5、复合条件连接,,复合条件连接:,WHERE,子句中通过,NOT,、,AND,或,OR,操作符包含多个连接条件。

2024/9/14,119,,,例:查询选修“数据库系统及应用”号课程且成绩在8,0,分以上的所有学生的学号、姓名及成绩SELECT Student.,学号,,,姓名,课程名称,成绩,,FROM Student JOIN Score ON Student.,学号=,Score.,学号,,,JOIN Course ON Score.,课程编号=,Course.,课程编号,,WHERE,课程名称,=‘,数据库系统及应用,‘,,AND,成绩,>60;,,/*,其他限定条件 *,/,2024/9/14,120,,连接操作的执行过程,,嵌套循环法,(NESTED-LOOP),,首先在表,1,中找到第一个元组,然后从头开始扫描表,2,,逐一查找满足连接件的元组,找到后就将表,1,中的第一个元组与该元组拼接起来,形成结果表中一个元组表,2,全部查找完后,再找表,1,中第二个元组,然后再从头开始扫描表,2,,逐一查找满足连接条件的元组,找到后就将表,1,中的第二个元组与该元组拼接起来,形成结果表中一个元组重复上述操作,直到表,1,中的全部元组都处理完毕2024/9/14,121,,,排序合并法,(SORT-MERGE),,常用于,=,连接,,首先按连接属性对表,1,和表,2,排序,,对表,1,的第一个元组,从头开始扫描表,2,,顺序查找满足连接条件的元组,找到后就将表,1,中的第一个元组与该元组拼接起来,形成结果表中一个元组。

当遇到表,2,中第一条大于表,1,连接字段值的元组时,对表,2,的查询不再继续2024/9/14,122,,,找到表,1,的第二条元组,然后从刚才的中断点处继续顺序扫描表,2,,查找满足连接条件的元组,找到后就将表,1,中的第二个元组与该元组拼接起来,形成结果表中一个元组直接遇到表,2,中大于表,1,连接字段值的元组时,对表,2,的查询不再继续,,重复上述操作,直到表,1,或表,2,中的全部元组都处理完毕为止2024/9/14,123,,,索引连接,(INDEX-JOIN),,对表,2,按连接字段建立索引,,对表,1,中的每个元组,依次根据其连接字段值查询表,2,的索引,从中找到满足条件的元组,找到后就将表,1,中的一个元组与该元组拼接起来,形成结果表中一个元组2024/9/14,124,,3.3.3,,嵌套查询,,嵌套查询概述,,嵌套查询分类,,嵌套查询求解方法,,引出子查询的谓词,,,2024/9/14,125,,,嵌套查询概述,,一个,SELECT-FROM-WHERE,语句称为一个,查询块将一个查询块嵌套在另一个查询块的,WHERE,子句或,HAVING,短语的条件中的查询称为,嵌套查询。

前者称为,子查询,或,内查询,,后者称为,父查询,或,外查询2024/9/14,126,,,,,SELECT,姓名 外层查询,/,父查询,,,FROM Student,,WHERE,学号,IN,,,(,SELECT,学号 内层查询,/,子查询,,,FROM Score,,WHERE,课程号,= ‘C002 ',);,2024/9/14,127,,,子查询的限制,,不能使用,ORDER BY,子句,,ORDER BY,子句只能对最终结果排序,,,层层嵌套方式反映了,SQL,语言的结构化,,,有些嵌套查询可以用连接运算替代,,2024/9/14,128,,,嵌套查询分类,,不相关子查询,,子查询的查询条件不依赖于父查询,,,相关子查询,,子查询的查询条件依赖于父查询,2024/9/14,129,,,嵌套查询求解方法,,不相关子查询,,是由里向外逐层处理即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件2024/9/14,130,,,相关子查询,,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若,WHERE,子句返回值为真,则取此元组放入结果表;,,然后再取外层表的下一个元组;,,重复这一过程,直至外层表全部检查完为止。

2024/9/14,131,,,引出子查询的谓词,,带有,IN,谓词的子查询,,带有,比较运算符,的子查询,,带有,ANY,或,ALL,谓词的子查询,,带有,EXISTS,谓词的子查询,2024/9/14,132,,例:查询与张楚在同一班的学生的学号、姓名、班号,,,① 确定“张楚”所在班级编号,,SELECT,班级编号,,FROM Student,,WHERE,姓名,= ‘,张楚,‘,,,结果为:,,班级编。

下载提示
相似文档
正为您匹配相似的精品文档