




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 SQL语言3.1 SQL语言的基本概念与特点语言的基本概念与特点 一、主要特点1. SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体。2. 类似自然语言,简洁易用。3. 非过程语言4. 面向集合的语言5.自含式语言,又是嵌入式语言。可独立使用,也可嵌入到宿主语言中。二、基本概念n基本表(BASE TABLE):n视图(VIEW):SQL视图1视图2基本表1基本表2基本表3基本表4存储文件1存储文件2外模式模式内模式图3.1 SQL语言支持的关系数据库的三级逻辑结构 SQL语言支持数据库的三级模式结构,如图语言支持数据库的三级模式结构,如图3.1所示。所示。其中其中外模式外模
2、式对应于视图和部分基本表,对应于视图和部分基本表,模式模式对应于基对应于基本表,本表,内模式内模式对应于存储文件。对应于存储文件。 3.2 数据定义操作对象操 作 方 式创 建删 除修 改数据库C R E A T E DATABASEDROP DATABASEALTER DATABASE基本表CREATE TABLE DROP TABLEALTER TABLE索 引CREATE INDEXDROP INDEX 视 图CREATE VIEWDROP VIEW 数据定义语言数据定义语言(Data Definition Language) Create、Drop、Alter 定义一组关系(基本表)、
3、说明各关系的信息定义一组关系(基本表)、说明各关系的信息 各关系的模式各关系的模式 各属性的值域各属性的值域 完整性约束完整性约束 索引索引 安全性和权限安全性和权限3.2.1 创建与删除数据库创建与删除数据库(1) 数据库的创建创建数据库的语句格式为:C R E AT E D ATA B A S E AUTHORIZATION ;例如,CREATE DATABASE ST-COURSE AUTHORIZATION 王非;(2) 数据库的删除数据库的删除DROP DATABASE CASCADE|RESTRICT;删除的方式有两种:CASCADE(连锁式)方式(连锁式)方式:RESTRICT(
4、约束式)方式(约束式)方式3.2.2 创建、删除、修改基本表创建、删除、修改基本表SQL语言中的二种数据类型:系统提供的数据类型,简称为数据类型;用户定义的数据类型,称为域。表表3.3 系统提供的数据类型系统提供的数据类型数 据 类 型类 型 说 明分 类类型表示字符类型Char(n)长度为n的定长字符串Varchar(n)最大长度为n的变长字符串整数类型Int长整数Smallint短整数浮点类型Float双字长浮点数Real实数Decimal(n,p)小数,共n位,小数点后面有p位数字位串类型Bit(n)长度为n的二进制位串Bitvarying(n)最大长度为n的变长二进制位串日期和时间类型
5、Date日期:格式为YYYYMMDDTime时间:格式为HH:MM:SS定义域的语句形式为:CREATE DOMAIN As ;如果该域不再需要,可以使用下列语句将其删掉DROP DOMAIN postcode; 域定义语句(域定义语句(SQL-92支持)支持) 需重复使用的需重复使用的 Create Domain stu_name varchar(20) Create Domain zip_code char(6)DDLSQL中的域类型中的域类型(1) 基本表的创建基本表的创建CREATE TABLE . ( , ,n,,n;列级完整性约束列级完整性约束是针对属性值设置的限制条件,主要有:N
6、OT NULLUNIQUEDEFAULTCHECK表级完整性约束表级完整性约束 如果列级约束条件表达式涉及到多列属性,则成为表级完整性约束。表级约束主要有下列几种:PRIMARY KEYFOREIGN KEY例3.1 用SQL建立STCOURSE库中的下列四个基本表(见2.4节),其表结构为:课程类表T(TNO,TNAME,CREDIT,HOURS,PTNO)开课表 C(CNO,TNO,CTERM,TNAME, TEACHER) 学生表S(SNO,SNAME,SSEX,SAGE, SNATIVE)学生选课表 S-C(SNO,CNO,GRADE)创建基本表的创建基本表的SQL语句如下:语句如下:
7、创建课程类表:CREATE TABLE T (TNO Char(5) PRIMARY KEY, TNAME Varchar(10) NOT NULL, CREDIT Char(1), HOURS Smallint, PTNO,Char(5);创建开课表:CREATE TABLE C (CNO Char(4) PRIMARY KEY, TNO Char(5), CTERM Char(6), TNAME Varchar(10) , TEACHER Char(8),FOREIGN KEY (TNO) REFERENCES T(TNO);创建学生表:CREATE TABLE S (SNO Char(6
8、) PRIMARY KEY,SNAME Char(8) NOT NULL,SSEX Char(2) DEFAULT男男,SAGE Smallint,SNATIVE Varchar(20),CHECK (SSEX IN (男男,女女); 创建选课表:CREATE TABLE S-C (SNO Char(6),CNO Char(4),GRADE Smallint,PRIMARY KEY(SNO,CNO),),FOREIGN KEY(SNO)REFERENCES S(SNO),),FOREIGN KEY (CNO) REFERENCES C(CNO),), CHECK (GRADE BETWEEN
9、0 AND 100);); 删除表中的某属性删除表中的某属性 去除属性及相应的数据去除属性及相应的数据Alter Table r Drop A(2)基本表的修改)基本表的修改 增加表中的属性增加表中的属性 向已经存在的表中添加属性向已经存在的表中添加属性 allow null 已有的元组中该属性的值被置为已有的元组中该属性的值被置为NullAlter Table r Add A DAlter Table S phone char(16);修改模式修改模式 Alter 用用SQL删除关系(表)删除关系(表) 将整个关系模式(表结构)彻底删除将整个关系模式(表结构)彻底删除 表中的数据也将被删除表
10、中的数据也将被删除Drop Table rDrop Table S;(3)基本表的删除)基本表的删除 Drop 用用SQL删除关系(表)删除关系(表) 将整个关系模式(表结构)彻底删除将整个关系模式(表结构)彻底删除 Drop Table r 用用SQL删除表中的某属性删除表中的某属性 去除属性及相应的数据去除属性及相应的数据 Alter Table r Drop A 用用SQL增加表中的属性增加表中的属性 向已经存在的表中添加属性向已经存在的表中添加属性 已有的元组中该属性的值被置为已有的元组中该属性的值被置为Null Alter Table r Add A D3.2.3 创建与删除索引创建
11、与删除索引(1)索引的创建索引的创建 IndexCREATE UNIQUE CLUSTERED | NONCLUSTERED INDEX index-name On TableName(Column,Column,) 索引的种类索引的种类 聚簇索引(聚簇索引(Clustered Index) 非聚簇索引(非聚簇索引(Non-Clustered Index) 聚簇索引(聚簇索引(Clustered Index) 表中的元组按聚簇索引的顺序物理地存放表中的元组按聚簇索引的顺序物理地存放 根级页面根级页面-中间层页面中间层页面-叶级页面(叶级页面(数据页面数据页面) 一个表中只能有一个聚簇索引一个表
12、中只能有一个聚簇索引 更新的复杂性,需要大量的临时空间更新的复杂性,需要大量的临时空间 非聚簇索引(非聚簇索引(Non-Clustered Index) 表中元组存储的物理顺序与索引的顺序无关表中元组存储的物理顺序与索引的顺序无关 叶级索引页面是指向数据页面的指针叶级索引页面是指向数据页面的指针 每个表可有多个非聚簇索引每个表可有多个非聚簇索引例例3.2 为为STCOURSE数据库中的四个表课程类表数据库中的四个表课程类表T,开课表,开课表C,学生表,学生表S和选课表和选课表SC建立索引。建立索引。CREATE UNIQUE INDEX TNO-INDEX ON T (TNO ASC););C
13、REATE UNIQUE INDEX CNO-INDEX ON C (CNO DESC););CREATE UNIQUE INDEX SNO-INDEX ON S (SNO););CREATE UNIQUE INDEX SC-INDEX ON S-C (SNO ASC,CNO DESC);); 2. 索引的删除索引的删除DROP INDEX ;例3.3 删除索引CNO-INDEX和SNO-INDEX。DROP INDEX CNO-INDEX,SNO-INDEX;删除索引时,系统会同时从数据字典中删去有关该索引的定义。基本结构基本结构Select A1, A2, ., AnFrom r1, r2
14、, ., rmWhere PA1, A2, ., An( p(r1r1.rm)SelectWhereFrom3.2 3.2 查询查询 对对 From 子句中的各关系,作笛卡儿子句中的各关系,作笛卡儿积(积() 对对 Where 子句中的逻辑表达式进行选子句中的逻辑表达式进行选择(择()运算,找出符合条件的元组)运算,找出符合条件的元组 根据根据 Select 子句中的属性列表,对上子句中的属性列表,对上述结果作投影(述结果作投影( )操作)操作 结果集结果集查询操作的对象是关系,结果还是一个关查询操作的对象是关系,结果还是一个关系,是一个结果集,是一个动态数据集系,是一个结果集,是一个动态数据
15、集SelectSelect语句的含义语句的含义3.3.1 简单查询简单查询Select sdept From Student Select 子句的缺省情况是保留重复元组( ALL ),可用 Distinct 去除重复元组Select Distinct sdept From Student 去除重复元组:费时 需要临时表的支持Select子句子句重复元组重复元组 星号星号 * * 表示所有属性表示所有属性星号星号 * * :按关系模式中属性的顺序:按关系模式中属性的顺序排列,并具有一定的排列,并具有一定的逻辑数据独立性逻辑数据独立性 Select * From S 显式列出属性名:按用户顺序排列
16、显式列出属性名:按用户顺序排列Select S.*,cno,gradeFrom S,S_CWhere S.sno = S_C.snoSelect子句 * *与属性列表 为结果集中的某个属性改名为结果集中的某个属性改名 使结果集更具可读性使结果集更具可读性 Select sno as stu_no,cno as course_no, gradeFrom SC查询结果为:查询结果为:Select子句更名stu_nocourse_no grade010301C00176010301C00384010301C00688010302C00180010302C00480010302C00690010303
17、C00290010303C00480求学生的姓名、性别、出生年,并用别名表示Select sno 姓姓名名,sname 性别性别, 生于生于 出生于出生于,2004 sage 出生年份出生年份From S 查询结果为:查询结果为:姓名姓名性别性别出生于出生于出生年份出生年份李明男生于生于1985王平男生于生于1984林丽萍女生于生于1985定义别名的定义别名的“as”可省,且可省,且SELECT子句中可出现常子句中可出现常量量。表表3.4 WHERE子句中常用的运算符子句中常用的运算符 运算符谓 词算术运算符+,-,*,/比较运算符=,!=,=,!,!逻辑运算符AND,OR,NOT表表3.5
18、WHRER子句中常用的表达式子句中常用的表达式 表达式谓词说明举例算术表达式 由算术运算符将常数或变量联结起来的式子20,男关系表达式 由比较运算符将算术表达式联结起来的式子SSXE=男,SAGE20逻辑表达式 由逻辑运算符将关系表达联结起来的式子SSEX=男AND SAGE20条件表达式BETWEENAND NOT BETWEENAND在某值之间不在某值之间BETWEEN 20AND 23INNOT IN 在某组中不在某组中IN (湖北武汉,湖南衡阳)IS NULLIS NOT NULL 是空值不是空值 字符串比较LIKENOT LIKE LIKE王%Where 子句子句运算符运算符 比较:
19、比较:、=、=、not + 确定范围:确定范围:Between A and B、Not Between A and B 确定集合:确定集合:IN、NOT IN 字符匹配:字符匹配:LIKE,NOT LIKE 空值:空值:IS NULL、IS NOT NULL 多重条件:多重条件:AND、OR、NOTWhere 子句子句Like 字符匹配:字符匹配:Like、Not Like 通配符通配符 % 匹配任意字符串匹配任意字符串 _ 匹配任意一个字符匹配任意一个字符 大小写敏感大小写敏感求所有年龄在20岁以下的男学生的姓名及年龄。SELECT SNAME,SAGEFROM SWHERE SAGE ,=
20、,、=、=、=、 例:找出与例:找出与010303 同龄的学生同龄的学生Select *From StudentWhere sage = ( Select sage From Student Where sno = 010303 )子查询单值比较子查询返回子查询返回多行一列多行一列运算符:运算符:In、All、Some(Any)、Exists子查询多值标量值与子查询返回集中的某一个相等,true IN 被用来测试多值中的成员被用来测试多值中的成员例:查询选修例:查询选修C001课程的学生的学号、课程的学生的学号、姓名。姓名。Select sno,snameFrom StudentWhere s
21、no IN (Select sno From SCWhere cno = C001 )子查询子查询多行一列多行一列子查询多值成员In例:例: 查询选修了查询选修了 C语言语言的学生的学号和姓名的学生的学号和姓名Select sno,snameFrom SWhere sno IN ( Select sno From SC Where cno IN ( Select cnoFrom CWhere tname = C语言语言)多值比较:多值比较:多行一列多行一列 父查询与多值子查询之间的比较需用父查询与多值子查询之间的比较需用All来连接来连接 标量值标量值s比子查询返回集比子查询返回集R中的每个都
22、大时,中的每个都大时,sAll R 为为True All表示所有表示所有 all、 all、=all、 all all 等价于等价于 not in例:找出年龄最小的学生例:找出年龄最小的学生Select * From S Where sage ANY大于子查询结果中的某个值,即表示大于查询结果中最小值ALL大于子查询结果中的所有值,即表示大于查询结果中最大值ANY小于子查询结果中的某个值,即表示小于查询结果中最大值=ANY大于等于子查询结果中的某个值,即表示大于等于结果集中最小值=ALL大于等于子查询结果中的所有值,即表示大于等于结果集中最大值=ANY小于等于子查询结果中的某个值,即表示小于等
23、于结果集中最大值=ALL小于等于子查询结果中的所有值,即表示小于等于结果集中最小值=ANY等于子查询结果中的某个值,即相当于IN=ALL等于子查询结果中的所有值(通常没有实际意义)!=(或) ANY不等于子查询结果中的某个值!=(或) ALL不等于子查询结果中的任何一个值,即相当于NOT IN多值比较:多值比较:多行一列多行一列 父查询与多值子查询之间的比较需用父查询与多值子查询之间的比较需用Some/Any来连接来连接 标量值标量值s比子查询返回集比子查询返回集R中的中的某一个某一个都大时都大时 s Some R为为True 或或 s Any R为为True Some(早期用早期用Any)表
24、示某一个表示某一个,只要有一个即返只要有一个即返回真回真 some、 some、=some、 some = some 等价于等价于 in、 some 不等价于不等价于 not in 子查询多值比较Some/Any例:找出不是最小年龄的学生例:找出不是最小年龄的学生Select * From SWhere sage some ( Select sage From S )子查询子查询多值比较多值比较例:找出具有最高平均成绩的学号及平均成绩例:找出具有最高平均成绩的学号及平均成绩Select sno ,avg(grade)From SC Group By sno Having avg(grade)
25、= all (Select avg(grade) From SC Group By sno) 子查询子查询多值比较多值比较SQL-92SQL-92支持多列的成员资格测试支持多列的成员资格测试例:例:找出同系、同年龄、同性别的学生找出同系、同年龄、同性别的学生Select Select * *from S as Tfrom S as TWhere Where (T.sdept,T.sage,T.ssexT.sdept,T.sage,T.ssex) IN ) IN ( Select ( Select From student as SFrom student as SWhere S.sno T.s
26、noWhere S.sno T.sno ) ) 子查询多列元组的比较多列元组的比较子查询子查询存在判断存在判断Exists Exists + 子查询用来判断该子查询是否返回元组子查询用来判断该子查询是否返回元组当子查询的结果集非空时,当子查询的结果集非空时,Exists为为True当子查询的结果集为空时,当子查询的结果集为空时,Exists为为False不关心子查询的具体内容,因此用不关心子查询的具体内容,因此用 Select *Exists和和Not Exists具有外部引用的子查询,称为相关子查询(Correlated Queries)外层元组的属性作为内层子查询的条件子查询子查询相关子查
27、询相关子查询 例:列出选修了例:列出选修了C01课程的学生的学号、姓名课程的学生的学号、姓名Select sno,snameFrom SWhere Exists ( Select * From SC Where SC.sno = S.sno And cno = C01)相关子查询Correlated & Exists 例:列出得过例:列出得过100分的学生的学号、姓名分的学生的学号、姓名Select sno,snameFrom SWhere Exists ( Select * From SCWhere SC.sno = S.sno Andgrade = 100)子查询Correlate
28、d & Exists例:查询选修了例:查询选修了C01课程的学生的系主任课程的学生的系主任Select managerFrom departmentWhere Exists ( Select * From SWhere sdept = department.depid And Exists ( Select * From SC Where SC.sno = S.sno Andcno = C01)子查询子查询Correlated & Exists* 例:列出没有选例:列出没有选C003课程的学生的学号、姓名课程的学生的学号、姓名Select sno,snameFrom SWher
29、e Not Exists ( Select * From SCWhere SC.sno = S.sno Andcno = C003)子查询子查询Correlated & Not Exists例:查询选修了所有课程的学生的姓名例:查询选修了所有课程的学生的姓名(ForAll)Select snameFrom SWhere Not Exists ( Select * From CWhere Not Exists ( Select *From SCWhere S.sno = SC.sno AndSC.cno = C.cno)这门课他没选这门课他没选这样的课是不存在的这样的课是不存在的子查询子
30、查询Correlated & Not Exists*另解:查询选修了所有课程的学生的姓名Select snameFrom StudentWhere sno in ( Select sno From SC group by sno having count(cno)= ( Select count(*) From Course)3.3.4 组合查询组合查询组合查询中包括使用集函数进行查询,分组查询和集合查询。 使用集函数 SQL提供的集函数如表3.7所示。用这些函数可以产生某个列的统计值。SQL集函数可做为列标识符出现在SELECT子句的目标列或HAVING子句的条件中。
31、把一列中的值进行聚合运算,返回单值的把一列中的值进行聚合运算,返回单值的函数函数五个预定义的聚合函数五个预定义的聚合函数 平均值:平均值:AvgAvg 总和:总和: SumSum 最小值:最小值:MinMin 最大值:最大值:MaxMax 计数:计数: CountCountCount(Count(* *) )、Count(DistinctCount(Distinct) )数值数值 SQL集函数例:列出学生的平均年龄。Select Avg(sage) From S例:列出C001课程的最高成绩、最低成绩Select Max(grade), Min(grade) From SCwhe
32、re cno=C001例:列出010301学生选修课程的门数 Select Count(cno) From SCwhere sno=010301集函数简例 集函数和分组n当希望集函数集函数作用在一组元组集上时,可以和分组子句Group byGroup by一起使用。n子句Group by Group by 将表的元组按列名列名值相同进行分组。nSelect子句子句中的列、表达式按组取单值n例:查询每个选课学生的学号、平均成绩 Select sno, Avg(grade) From SC Group by Group by snoHaving子句子句nHavingl针对聚合函数的结
33、果值进行筛选(选择),针对聚合函数的结果值进行筛选(选择),它作用于分组计算结果集它作用于分组计算结果集l跟在跟在Group By子句的后面,子句的后面,没有没有Group By则针则针对全表对全表n例:查询选课门数在2门以上的学生的学号及 选课门数 Select sno, count(cno) From SC Group By sno Having count(cno) 2Having子句和Where子句联用联用Having子句和子句和Where子句子句联用时, Where条件在Having条件之前先执行例:列出具有两门(含两门)以上不及格的学生的学号、不及格的课目数。Select sno,
34、count(sno) From SC Where grade = 2Having 与与 Where的区别的区别Where 决定哪些元组被选择参加运算,作用于关系中的元组Having 决定哪些分组符合要求,作用于分组集函数的条件关系必须用Having,Where中不应出现集函数。一个错误的例: 查询学习C001课程、成绩大于或等于该课程的平均成绩的学生的学号 Select sno From SC Where grade =Avg(grade) 多个多个 Select 语句的结果可以进行集合操语句的结果可以进行集合操作,使结果为作,使结果为“集合集合”(default) SQL-92支持支持 参加
35、集合操作的关系(结果集)必须是参加集合操作的关系(结果集)必须是相容相容的的 SQL的集合操作SQL的集合操作的集合操作相容相容 属性个数必须一致属性个数必须一致 对应的类型必须一致对应的类型必须一致 属性名无关属性名无关 最终结果集采用第一个结果的属性名最终结果集采用第一个结果的属性名 缺省为自动去除重复元组缺省为自动去除重复元组 除非显式说明除非显式说明ALL Order By放在整个语句的最后放在整个语句的最后 union(并,对应与关系代数的(并,对应与关系代数的),标准),标准SQL都支持的都支持的 采用集合的观点,合成多个查询的结果采用集合的观点,合成多个查询的结果s
36、elect - without - order by . UNION ALL select - without - order by . UNION ALL select - without - order by . ORDER BY integer ASC | DESC , . SQL的集合操作并例:查询计算机系的学生例:查询计算机系的学生或者或者年龄不大于年龄不大于1919岁岁的学生,并按年龄倒排序。的学生,并按年龄倒排序。(Select sno, sname,sageFrom StudentWhere sdept = CS)UNION(Select sno, sname,sageFrom
37、 StudentWhere sage = 19)Order By sage DESC intersect(交,对应与关系代数的(交,对应与关系代数的),并不),并不是所有的是所有的DBMS都支持都支持 例:查询计算机系的学生例:查询计算机系的学生并且并且年龄不大于年龄不大于1919岁的学生,并按年龄倒排序。岁的学生,并按年龄倒排序。 (Select sno, sname,sageFrom S Where sdept = CS)intersect(Select sno, sname,sageFrom Student Where sage = 19)Order By sage DESC SQL的集
38、合操作交另解n例:查询计算机系的学生例:查询计算机系的学生并且并且年龄不大于年龄不大于1919岁的学生,并按年龄倒排序。岁的学生,并按年龄倒排序。Select sno, sname,sageFrom S Where sdept = CS and sage 75在 From中使用查询表达式NULL 表示数据的缺失 一个确实存在,但我们不知道的值 对本实体此数值无意义,可能是设计上的失误 是SQL的关键字,用于任何类型描述缺失的值UNKONW 是三值逻辑的一个真值(True/False/Unkonw)*空值NULL的运算法则 对对NULL值和其他任何值作算术运算时,值和其他任何值作算术运算时,结果
39、为结果为NULL 对对NULL值和其他任何值作比较时,结果值和其他任何值作比较时,结果为为UNKOWN Is Null / Is Not Null空值空值*Unkown 视视True为为1,False为为0,Unkown为为1/2 AND:取小取小 OR:取大取大 NOT:取取1的补的补 真值表不必死记硬背真值表不必死记硬背空值空值*数据数据更新包括包括插入数据、插入数据、修改数据、修改数据、删除数据删除数据3.4 数据更新 数据插入(数据插入(Insert) 单行插入单行插入例:新增一个学生信息例:新增一个学生信息Insert Into StudentValues ( 010304, Glo
40、ria,25, F, CS) 多行插入多行插入例例:给给CS系的学生开设必修课系的学生开设必修课C005,建立选课信息,建立选课信息Insert Into SC values( Select sno,cno,null From Student,Course Where sdept = CS and cno = C05)3.4.1 插入数据插入数据 数据插入数据插入 按关系模式的属性顺序按关系模式的属性顺序Insert Into Student Values ( 95001, 张三张三,27, M, CS ) 按指定的属性顺序,也可以只添加部分属性(非按指定的属性顺序,也可以只添加部分属性(非N
41、ull属性为必需)属性为必需)Insert Into Student ( sno, sname, sage)Values ( 95002, 李四李四, 26 ) 数据更新(数据更新(Update) 改变符合条件的某个(某些)元组的改变符合条件的某个(某些)元组的属性值属性值例:将例:将95001学生转入学生转入MA系系Update SSet sdept = MAWhere sno = 95001例:所有学生年龄加例:所有学生年龄加1Update StudentSet sage = sage + 13.4.2 修改数据修改数据数据更新(数据更新(Update)例:将选修例:将选修C005课程的学
42、生的成绩改为该课课程的学生的成绩改为该课的平均成绩的平均成绩Update SCSet grade = (Select avg(grade)From SCWhere cno = C05)Where cno = C05先计算先计算avg,再做,再做Update3.4.3 删除数据n数据删除(数据删除(Delete)l只能对一个关系起作用,若要从多个关只能对一个关系起作用,若要从多个关系中删除元组,则必须对每个关系分别系中删除元组,则必须对每个关系分别执行删除命令执行删除命令Delete From r Where Pl从关系从关系 r 中删除满足中删除满足P的元组,只是删除的元组,只是删除数据,而不
43、是定义数据,而不是定义 删除单个元组删除单个元组例:删除学号为例:删除学号为95001的学生的选课信息的学生的选课信息Delete From SCWhere sno = 95001 删除多个元组删除多个元组例:删除选课而未参加考试的学生的选课信息例:删除选课而未参加考试的学生的选课信息Delete From SCWhere grade is null 删除整个关系中的所有数据删除整个关系中的所有数据例:删除所有学生的选课信息例:删除所有学生的选课信息Delete From SC 视图(视图(View)3.5.1 创建视图创建视图、删除、删除Create View v as Drop View
44、v例:计算机系的花名册例:计算机系的花名册Create View CS_Stu asSelect sno,sname,ssexFrom S Where sdept = CS3.5 视图视图名可以出现在任何关系名可以出现的地方视图名可以出现在任何关系名可以出现的地方例:列出计算机系的男生例:列出计算机系的男生Select sno,snameFrom CS_StuWhere ssex = 男男 例:建立学生平均成绩视图例:建立学生平均成绩视图Create View avg_grade(sno,avg) asSelect sno,avg(grade)From SC Group By sno3.5.3
45、 视图(视图(View)的查询)的查询 视图(视图(View)例:找出平均成绩大于等例:找出平均成绩大于等75的学生的学生Select *From avg_gradeWhere avg = 75注意:此例的使用方法是非标准的。注意:此例的使用方法是非标准的。视图的更新:单表、原始属性构成的视图可以视图的更新:单表、原始属性构成的视图可以更新(像基本表那样更新)更新(像基本表那样更新) 由多表构成的视图由很大的限制由多表构成的视图由很大的限制 视图中的非原始属性也不能更新视图中的非原始属性也不能更新例:例:Update avg_gradeSet avg = 100Where sno = 0103
46、01avg不是原不是原始属性始属性3.5.4 视图(视图(View)的)的 更新更新 视图的作用视图的作用 简化用户的操作简化用户的操作 不同的用户可从不同的角度看待同一数据不同的用户可从不同的角度看待同一数据 支持一定的逻辑数据独立性支持一定的逻辑数据独立性 数据的安全性数据的安全性3.6数据控制3.6.1权限的类型 SQL定义了6类权限供用户选择。SELECT 允许对基本表或视图执行查询INSERT 允许对基本表或视图执行插入DELETE 允许对基本表或视图执行修改UPDATE 允许对基本表或视图执行删除REFERENCES 允许在定义新关系时,建立完整性约束,即引用指定关系的主码作为新关
47、系的外部码。USAGE 允许用户使用已经定义的域。3.6.2授权授权GRANT ALLPRIVILIGES ON TOPUBLIC WITH GRANT OPTION其中:ALLPRIVILIGES指所有的权限;数据库对象指基本表、视图、过程、域等;PUBLIC指所有的用户;WITH GRANT OPTION指允许取得权限的用户再将该权限授予别的用户。例3.31把对学生表的查询,插入的权限授给U,并且U还可以把这些权限授予其他用户。GRANT SELECT, INSERT ON S TO U1 WITH GRANT OPTION;把对学生选课表S-C中的成绩修改的权限授给U。GRANTUPDA
48、TE(GRADE)ONS-CTOU;把引用开课表C的主码CNO做为新关系的外码的权限授给U。GRANT REFERENCES (CNO) ON C TO U3;假设定义了一个域NAME,把使用该域的权限授给U。GRANTUSAGE ONDOMAINNAMETOU;3.6.3收回授权收回授权用REVOKE语句将授出的权限再收回。语句的格式为:REVOKE ALL PRIVILIGES|ONFROMPUBLIC;例3.32REVOKE UPDATE(GRADE)ONS-CFROMU;该语句将收回U对S-C表中的成绩GRADE的修改权限。REVOKESELECT,INSERTONSFROMU;该语句
49、将收回U1对表S的查询、插入的权限,并且自动地收回他给其他用户的授权,即收回权限的操作会级联下去。3.7嵌入式嵌入式SQL SQL语言有两种使用方式:交互式交互式SQL 在终端交互方式下使用,称为交互式SQL,也称为自主式或自含式SqL;嵌入式嵌入式SQL 嵌入在高级语言的程序中使用,称为嵌入式SQL。对嵌入了对嵌入了SQL语句的源程序的处理语句的源程序的处理 一种是扩充宿主语言的编译程序,使之能处理SQL语句,称为增强编译方式; 另一种是采用预处理方式。目前多数系统采用后一种方式。预处理方式的具体过程如图3.7所示。预处理程序宿主语言编译程序宿主语言+嵌入式SQL宿主语言+函数调用目标程序图
50、3.7 预处理方式的处理过程3.7.1 基本技术基本技术1、SQL和宿主语言的接口 存储设备上的数据库是用SQL语句来存取的,即SQL语句负责管理数据库, 主语言语句负责控制程序流程和其他功能。 SQL语句和宿主语言间信息的传递是通过共享变量实现的。共享变量也就成了SQL和宿主语言的接口。 共享变量先由宿主语言程序定义,再用SQL的变量声明语句说明,随后SQL语句就可以引用这些变量。共享变量的说明共享变量的说明 用SQL的变量声明语句说明共享变量, 把要使用的变量放在两个嵌入式的SQL语句之间,这两个语句称为变量声明语句。 其格式如下所示: EXEC SQL BEGIN DECLARE SEC
51、TION;共享变量说明语句 EXEC SQL END DECLARE SECTION;其中共享变量说明语句的格式应该依据宿主语言的格式,并且宿主语言和SQL语言都可以处理这些数据。特殊的共享变量特殊的共享变量SQLSTATE SQL2规定了一个特殊的共享变量SQLSTATE,它的状态反映了SQL语句执行的状况, 它是由5个字符组成的字符数组。当一个SQL语句执行成功时,系统自动给它赋上全零值(即“00000”),表示未发生错误; 否则其值为非全零,分别表示执行SQL语句时发生的各种错误。在执行完一个SQL语句后,程序可以根据SQLSTATE的值转向不同的分支,以控制程序的流向。2、主变量(即共
52、享变量)、主变量(即共享变量) 在SQL语句中引用这些共享变量时,要在这些变量前加上冒号“:”作为前缀标识,如:number。 当这些变量在宿主语言中使用时,不需要加冒号。 注意:宿主语言不能引用数据库中的字段变量。 在主变量中还分为输入主变量和输出主变量。输入主变量是指由宿主语言语句对其赋值,SQL语句引用;利用输入主变量,可以:指定向数据库中插入的数据、将数据库中的数据修改为指定值、指定要执行的操作。输出主变量是指由SQL语句对其赋值或设置状态信息,返回给宿主语言程序。利用输出主变量可以得到SQL语句的结果数据和状态。一个主变量有可能既是输入主变量又是输出主变量。下面举例说明。例3.33
53、SQL语句嵌套在C语言程序中 EXEC SQL BEGIN DECLARE SECTION; Char s_code (7); Char name(9); Char sex(3); Int age; /*共享变量说明*/ Char come(21); Char c_code(5); Int grade;EXEC SQL END DECLARE SECTION; EXEC SQL INSERT INTO S(SNO,SNAME,SSEX,SAGE,SNATIVE)VALUES (:s_code,:name,:sex,:age,:come);/*上述s_code,name,sex,age,come
54、为输入主变量,在此之前已被宿主语言语句赋值。*/ EXEC SQL SELECT GRADE INTO :grade FROM S-C WHERE SNO=:s_code AND CNO=:c_code;/*上述 grade为输出主变量,其值由SQL的查询语句赋值;s_code和c_code为输入主变量,在此之前已被宿主语言语句赋值。*/ 在共享变量说明语句中字符数组的长度都比原来字符串长度大1,这是由于在C语言中规定变量值在作字符串使用时应有结束符“0”。 3、嵌入到宿主语言中的、嵌入到宿主语言中的SQL语句的标识语句的标识在 所 有 的 S Q L 语 句 前 必 须 加 上 前 缀 标
55、识“EXEC SQL”,并以“END-EXEC”作为语句结束标志。格式如下:EXEC SQL END-EXEC结束标志依不同的宿主语言而不同,在PL/I,C和PASCAL语言程序中规定结束标志为分号“;”。4、指示变量(、指示变量(Indication Variable) 一个主变量后可以附带一个指示变量,用来指示所指主变量的值或条件。 指示变量是一个整型变量,它可以指示输入主变量是否为空,也可以检测输出主变量是否为空值,值是否被截断。 指示变量也必须在SQL的变量说明语句“BEGIN DECLARE SECTION”和“END DECLARE SECTION”之间进行说明。 SQL语句中的指
56、示变量前也必须加冒号,并且要紧跟在所指示的主变量之后。5、游标、游标在嵌入式SQL中引入了游标的概念,用它来协调两种不同的数据处理方式。 游标游标实际上是系统为用户开设的一个数据缓冲区和一个指针,缓冲区用来存放SQL语句的执行结果,指针指向其中的一个元组。 每个游标都有一个名字。用户可以通过游标逐一获取记录,并将记录赋给主变量,由主变量做进一步处理。 游标的使用需要四条语句。声明游标DECLARE CURSOR FOR ;打开游标OPEN ;取游标数据FETCH INTO , ,n;关闭游标CLOSE ;在在SQL语句中不必使用游标的有:语句中不必使用游标的有:变量说明语句;数据定义语句(DD
57、L);数据控制语句(DCL);查询结果为单记录的SELECT语句;数据插入语句(INSERT);非CURRENT形式的UPDATE语句;非CURRENT形式的DELETE语句;在在SQL语句中要使用游标的有:语句中要使用游标的有:查询结果为多条记录的SELECT语句;CURRENT形式的UPDATE语句;CURRENT形式的DELETE语句;3.7.2 举例举例 1、不使用游标的嵌入式SQL语句例3.34 从学生选课关系表S-C中删除开课码为某一给定值的元组。该开课码由共享变量给出。 EXEC SQL DELETE FROM S-C WHERE CNO=:c_code; 将学生选课关系表S-C
58、中某个开课码所对应课程的成绩均上调某个值。开课码和上调的成绩值由共享变量给出。 EXEC SQL UPDATE S-C SET GRADE=GRADE+:grade WHERE CNO=:c_code; 2、使用游标的嵌入式、使用游标的嵌入式SQL语句语句(1)当SELECT语句查询出的结果为多条记录时,就要使用游标了。例3.35 查询学校所开设课程的全部信息 EXEC SQL BEGIN DECLARE SECTION; Char t_code(6),t_name(11),credit(2); Int time; Char p_code(6);EXEC SQL END DECLARE SEC
59、TION; /*共享变量说明*/ EXEC SQL DECLARE TX CURSOR FOR SELECT TNO,TNAME,CREDIT,HOURS,PTNOFROM T; /*声明游标*/EXEC SQL OPEN TX; /*打开游标*/WHILE(1) /*用循环结构逐条处理结果集中的记录*/ EXEC SQL FETCH TX INTO :t_code,:t_name,:credit,:time,:p_code /*游标指针向前推进一行,从结果集中取当前行,送至相应主变量*/ if (SQLCA.SQLSTATE!=00000) break; /* SQLSTATE不为全零,表示取数据出错,退出循环。*/ /*由主语言语句对取出的数据进行处理*/ ;EXEC SQL CLOSE TX;(2)使用游标)使用游标当我们要对满足条件的元组集合还要逐行地拿出来进行另外的条件判断时(即所谓的CURRENT形式的UPDATE和DELETE语句),就要使用游标了。在游标处于活动状态时,可以修改或删
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程设计规范与标准考核试卷
- 机织运动服装在运动康复中的角色考核试卷
- 技术服务多元化战略与市场拓展考核试卷
- 服装行业大数据分析应用考核试卷
- 户外登山鞋租赁与保养常识考核试卷
- 中小学生手卫生课件
- 施工电梯备案合同范本
- 劳务永久合同范本
- 宠物购买意向合同范本
- 铸造机械采购合同范本
- 仓库管理人员安全培训考试题含答案
- 2024年度核医学科危重症患者应急预案流程图
- 2024未来会议:AI与协作前沿趋势白皮书
- 书画同源 课件-2023-2024学年高中美术人教版(2019)选择性必修2 中国书画
- 2024年广东普通专升本《公共英语》完整版真题
- 全飞秒激光近视手术
- 中国民族音乐的宫庭音乐
- 单原子催化剂的合成与应用
- 电网调度运行人员考试:电网调度调控考试试题及答案(最新版)
- 成都市深基坑管理规定课件
- Midea美的F50-22DE5(HEY)电热水器说明书
评论
0/150
提交评论