null3 数据库语言SQL3 数据库语言SQL
Elelen Enmi胶原蛋白口服液买四赠一 品牌正品情侣装 亲子装全场包邮 淘宝:http://li370286038.taobao.com/ 或者拍拍:http://shop.paipai.com/370286038本章目标本章目标 本章主要介绍SQL语言的基本语法和使用方式,要求熟练掌握SQL语言的使用规则,能够根据实际需求写出能够准确完成操作的SQL语句。3.1 概述3.1 概述SQL的发展
1974年,由Boyce和Chamberlin提出
1975~1979,IBM San Jose Research Lab的关系数据库管理系统原型System R实施了这种语言
SQL-86是第一个SQL
SQL-89、SQL-92(SQL2)、SQL-99(SQL3)
现状
大部分DBMS产品都支持SQL,成为操作数据库的标准语言
有特殊性,支持程度不同null 数据定义(DDL)
定义、删除、修改关系模式(基本表)
定义、删除视图(View)
定义、删除索引(Index)
数据操纵(DML)
数据查询
数据增、删、改
数据控制(DCL)
用户访问权限的授予、收回3.1.1 SQL的功能null 交互式SQL
一般DBMS都提供联机交互工具
用户可直接键入SQL命令对数据库进行操作
由DBMS来进行解释
嵌入式SQL
能将SQL语句嵌入到高级语言(宿主语言)
使应用程序充分利用SQL访问数据库的能力、宿主语言的过程处理能力
一般需要预编译,将嵌入的SQL语句转化为宿主语言编译器能处理的语句3.1.2 SQL的形式null数据定义
Create、Drop、Alter
数据操纵
数据查询:Select
数据修改:Insert、Update、Delete
数据控制
Grant、Revoke3.1.3 SQL的动词null数据查询是数据库应用的核心功能。
基本结构:
Select A1, A2, ..., An
From r1, r2, ..., rm
Where P3.2 数据查询πA1, A2, ..., An(p(r1×r1×...×rm))3.2.1 Select语句的含义 3.2.1 Select语句的含义 对 From 子句中的各关系,作笛卡儿积(×)
对 Where 子句中的逻辑表达式进行选择(σ)运算,找出符合条件的元组。
根据 Select 子句中的属性列表,对上述结果作投影( π)操作。
查询操作的对象是关系,结果还是一个关系,是一个结果集,是一个动态数据集。3.2.2 Select子句
对应于关系代数的投影(π)运算,用以列出查询结果集中的期望属性。null 重复元组
SQL 具有包的特性
Select子句的缺省情况是保留重复元组(ALL),可用 Distinct去除重复元组
Select Distinct sdept From Student
Select All sdept From Student
去除重复元组:费时
需要临时表的支持null *与属性列表
星号 * 表示所有属性
星号 * :按关系模式中属性的顺序排列,并具有一定的逻辑数据独立性
显式列出属性名:按用户顺序排列
Select * From Student
Select Student.*,cno,grade
From Student,SC
Where Student.sno = SC.snonull 更名
为结果集中的某个属性改名
使结果集更具可读性
Select sno as stu_no,cno as course_no, grade
From SC
Select sno,sname,2001 - sage as birthday
From Student3.2.3 where子句3.2.3 where子句where子句对应与关系代数中的选择(σ)。
查询满足指定条件的元组可以通过Where子句来实现。
使where子句中的逻辑表达式返回True值的元组,是符合要求的元组,将被选择出来。null 运算符
比较:<、<=、>、>=、=、<>、not + ~
确定范围:
Between A and B、Not Between A and B
确定集合:IN、NOT IN
字符匹配:LIKE,NOT LIKE
空值:IS NULL、IS NOT NULL
多重条件:AND、OR、NOT null like
字符匹配:Like、Not Like
通配符:
% —— 匹配任意字符串
_ —— 匹配任意一个字符
大小写敏感null列出姓张的学生的学号、姓名。
Select sno,sname
From Student
Where sname LIKE ‘张%’
列出张姓且单名的学生的学号、姓名。
Select sno,sname
From Student
Where sname LIKE ‘张_ _’null 转义符 escape
例:列出课程名称中带有‘_’的课号及课名。
Select cno,cname
From Course
Where cname LIKE ‘%\_%’ escape ‘\’3.2.4 from子句3.2.4 from子句From子句对应与关系代数中的笛卡儿积(×)
列出将被扫描的关系(表)
例:列出所有学生的学号、姓名、课号、成绩。
Select Sudent.sno,sname,SC.cno,grade
From Student,SC
Where Student.sno = SC.snonull 元组变量
为 From 子句中的关系定义元组变量
方便关系名的引用
在同一关系的笛卡儿积中进行辨别
例:列出与95001同岁的同学的学号,姓名,年龄。
Select T.sno,T.sname,T.sage
From Student as T,Student as S
Where S.sno = ‘95001’ AND
T.sage = S.sage3.2.5 Order By子句3.2.5 Order By子句指定结果集中元组的排列次序
耗时
ASC(缺省)、DESC、未选中的属性
例:列出CS系中的男生的学号、姓名、年龄,并按年龄进行排列(升序)。
Select sno,sname, sage
From Student
Where sdept = ‘CS’
Order By sage ASC 3.3 数据定义语言3.3 数据定义语言数据定义语言(Data Definition Language)
Create、Drop、Alter
定义一组关系(基本表)、说明各关系的信息
各关系的模式
各属性的值域
完整性约束
索引
安全性和权限 3.3.1 SQL中的域类型3.3.1 SQL中的域类型 字符型
char(n) 、varchar(n)
数值型
integer、smallint
numeric(p,d)
real、double、float(n)
日期/时间型
date
time3.3.2 SQL中的域定义3.3.2 SQL中的域定义 域定义语句(SQL-92支持)
需重复使用的
Create Domain stu_name varchar(20)
Create Domain zip_code char(6)
域的删除
Drop Domain datelog
各DBMS的方法是不同的Restrict/Cascade
使用该域的属性的处理 3.3.3 SQL中的模式定义3.3.3 SQL中的模式定义 Create Table r (A1D1, A2D2,…, AnDn,
<表级完整性约束1>,
…
<表级完整性约束n>)
其中:
r 关系名(表名)、 Ai 关系 r 的一个属性名
Dn 属性Ai域值的域类型
主键声明:
primary key (Aj1 ,Aj2 ,…,Ajvm )null Create Domain stu_name varchar(20)
Create Table Student (
sno char(10) primary key(sno) ,
sname stu_name ,
sage smallint,
ssex char(1),
sdept char(2))null Create Table Course (
cno char(10) primary key (cno) ,
cname varchar(20) ,
credit smallint )
Create Table SC (
sno char(10) not null ,
cno char(10) not null ,
grade smallint,
primary key (sno, cno))Elelen Enmi胶原蛋白口服液买四赠一 品牌正品情侣
装 亲子装全场包邮 淘宝:http://li370286038.taoba
o.com/ 或者拍拍:http://shop.paipai.com/3702860383.3.4 删除表结构3.3.4 删除表结构用SQL删除关系(表)
将整个关系模式(表结构)彻底删除
表中的数据也将被删除
Drop Table r
Drop Table student3.3.5 修改表结构3.3.5 修改表结构 删除表中的某属性
去除属性及相应的数据
Alter Table r Drop A
增加表中的属性
向已经存在的表中添加属性
allow null
已有的元组中该属性的值被置为Null
Alter Table r Add A D
Alter Table student phone char(16)3.3.6 Default Value3.3.6 Default Value属性的默认值
用户不提供某属性的值时,默认值被使用
初始值
DDL中:
ModifyDate char(30) Default TimeStamp
Alter Table student
Add ID integer Default 10013.3.7 索引Index3.3.7 索引Index索引是一种数据结构,是对照表、指针表
索引是为了加速对表中元组的检索而创建的一种分散存储结构(B树)
索引是对表而建立的,由除存放表的数据页面以外的索引页面组成
索引是把双刃剑,减慢更新的速度
索引不是SQL标准的要求
索引的种类
聚簇索引(Clustered Index)
非聚簇索引(Non-Clustered Index) null 聚簇索引(Clustered Index)
表中的元组按聚簇索引的顺序物理地存放
根级页面---中间层页面---叶级页面(数据页面)
一个表中只能有一个聚簇索引
更新的复杂性,需要大量的临时空间
非聚簇索引(Non-Clustered Index)
表中的元组按聚簇索引的顺序物理地存放
根级页面---中间层页面---叶级页面(数据页面)
一个表中只能有一个聚簇索引
更新的复杂性,需要大量的临时空间null CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED]
INDEX index-name On TableName(Column,Column,…)
Create Index YearIndex On Movie(year)
Create Clustered Index SnoIndex On student(sno)
Drop Index YearIndex3.4 数据添加3.4 数据添加用SQL的插入语句,向数据库表中添加数据
按关系模式的属性顺序
Insert Into Student
Values ( ‘0095001’, ‘张三’,27, ‘M’, ‘CS’ )
按指定的属性顺序,也可以只添加部分属性(非Null属性为必需)
Insert Into Student ( sno, sname, sage)
Values ( ‘0095002’, ‘李四’, 26 ) 3.5 聚合函数 3.5 聚合函数 把一列中的值进行聚合运算,返回单值的函数。
五个预定义的聚合函数:
平均值:Avg
总和: Sum
最小值:Min
最大值:Max
计数:Count
Count(*)、Count(Distinct…) 3.5.1 Group By3.5.1 Group By将查询结果集按某一列或多列的值分组,值相等的为一组,一个分组以一个元组的形式出现。
只有出现在Group By子句中的属性,才可出现在Select子句中。
例:统计各系学生的人数。
Select sdept,count(*) as stu_count
From Student
Group By sdept 3.5.2 Having3.5.2 Having针对聚合函数的结果值进行筛选(选择),它作用于分组计算结果集。
跟在Group By子句的后面,没有Group By则针对全表。
例:列出具有两门(含)以上不及格的学生的学号、不及格的课目数。
Select sno,count(sno) From SC
Where grade < 60
Group By sno
Having count(sno) >= 2 3.5.3 Having与Where的区别 3.5.3 Having与Where的区别 Where 决定哪些元组被选择参加运算,作用于关系中的元组。
Having 决定哪些分组符合要求,作用于分组。
聚合函数的条件关系必须用Having,Where中不应出现聚合函数。3.5.4 聚合函数忽略Null3.5.4 聚合函数忽略NullCount:不计
Sum:不将其计入
Avg:具有 Null 的元组不参与
Max / Min:不参与
例:Select count(sdept) From Student
Select Avg(sage) From Student 3.6 子查询 3.6 子查询 子查询是嵌套在另一查询中的 Select-From-Where 表达式(Where/Having)。
SQL允许多层嵌套,由内而外地进行分析,子查询的结果作为父查询的查找条件。
可以用多个简单查询来构成复杂查询,以增强SQL的查询能力。
子查询中不使用 Order By 子句,Order By子句只能对最终查询结果进行排序。3.6.1 单值比较 3.6.1 单值比较 返回单值的子查询,只返回一行一列
父查询与单值子查询之间用比较运算符进行连接
运算符:>、>=、=、<=、<、 <>
例:找出与95001同龄的学生
Select * From Student
Where sage = ( Select sage From Student
Where sno = ‘95001’ )3.6.2 多值3.6.2 多值 子查询返回多行一列
运算符:In、All、Some(Any)、Exists null in
标量值与子查询返回集中的某一个相等,true in 被用来测试多值中的成员。
例:查询选修‘C01’课程的学生的学号、姓名。
Select sno,sname
From Student
Where sno IN
(Select sno From SC
Where cno = ‘C01’ )null例:查询选修了 ‘数据库’的学生的学号和姓名
Select sno,sname
From Student
Where sno IN ( Select sno From SC
Where cno IN ( Select cno From Course
Where cname = ‘数据库’))null all
多值比较:多行一列
父查询与多值子查询之间的比较需用All来连接
标量值s比子查询返回集R中的每个都大时,s>All R 为 True All 表示所有
> all、< all、<=all、>=all、<> all<> all 等价于 not in
例:找出年龄最小的学生
Select * From Student Where sage < all
( Select sage From Student ) null some、any
多值比较:多行一列
父查询与多值子查询之间的比较需用Some/Any来连接
标量值s比子查询返回集R中的某一个都大时,s > Some R为True 或 s > Any R为True
Some(早期用Any)表示某一个,只要有一个即返回真
> some、< some、<=some、>=some、<> some = some 等价于 in、<> some 不等价于 not in null例:找出不是最小年龄的学生
Select * From student
Where sage > some
( Select sage From Student )
例:找出具有最高平均成绩的学号及平均成绩
Select sno ,avg(grade)
From SC
Group By sno
Having avg(grade) >= all
( Select avg(grade) From SC Group By sno )null exists
Exists + 子查询用来判断该子查询是否返回元组
当子查询的结果集非空时,Exists为True
当子查询的结果集为空时,Exists为False
不关心子查询的具体内容,因此用 Select * null例:列出选修了C01课程的学生的学号、姓名
Select sno,sname
From Student
Where Exists ( Select * From SC
Where SC.sno = Student.sno
And cno = ‘C01’) null例:列出得过100分的学生的学号、姓名
Select sno,sname
From Student
Where Exists
( Select * From SC
Where SC.sno = Student.sno
And grade = 100 ) null例:查询选修了‘C01’课程的学生的系主任
Select manager
From department
Where Exists ( Select * From student
Where sdept = department.depid And
Exists ( Select * From SC Where SC.sno
= student.sno And cno = ‘C01’))null例:列出没有选C01课程的学生的学号、姓名
Select sno,sname
From Student
Where Not Exists
( Select * From SC
Where SC.sno = Student.sno
And cno = ‘C01’) Elelen Enmi胶原蛋白口服液买四赠一 品牌正品情侣装
亲子装全场包邮 淘宝:http://li370286038.taobao.co
m/ 或者拍拍:http://shop.paipai.com/370286038null例:查询选修了所有课程的学生的姓名( ForAll )
Select sname
From Student
Where Not Exists
( Select * From Course
Where Not Exists
( Select * From SC
Where Student.sno = SC.sno
And SC.cno = Course.cno))3.6.3 多列元组的比较3.6.3 多列元组的比较 SQL-92支持多列的成员资格测试(ASA7.0不支持)
例:找出同系、同年龄、同性别的学生
Select * from Student as T
Where(T.sdept,T.sage,T.ssex) IN
( Select sdept,sage,ssex
From student as S
Where S.sno <> T.sno ) 3.6.4 派生关系3.6.4 派生关系SQL-92允许在 From中使用查询表达式
必须为其取名
例:查询平均成绩大于75分的学号、姓名、平均成绩
Select stu_no,sname,avg_grade
From Student, (Select sno,avg(grade)
From SC Group By sno ) as S (stu_no,avg_grade)
Where Student.sno = S.stu_no And avg_grade > 753.7 空值与连接3.7 空值与连接 3.7.1 NULL
表示数据的缺失
一个确实存在,但我们不知道的值
对本实体此数值无意义,可能是
上的失误
是SQL的关键字,用于任何类型描述缺失的值 3.7.3 NULL的运算法则3.7.3 NULL的运算法则对NULL值和其他任何值作算术运算时,结果为NULL
对NULL值和其他任何值作比较时,结果为UNKOWN
Is Null / Is Not Null3.7.4 Unkown的运算规则3.7.4 Unkown的运算规则视True为1,False为0,Unkown为1/2
AND:取小
OR:取大
NOT:取1的补
真值表不必死记硬背3.8 数据库的修改 3.8 数据库的修改 数据库修改包括插入数据、修改数据、删除数据。3.8.1 数据删除3.8.1 数据删除只能对整个元组操作,不能只删除某些属性上的值。
只能对一个关系起作用,若要从多个关系中删除元组,则必须对每个关系分别执行删除命令。
Delete From r Where P
从关系 r 中删除满足P的元组,只是删除数据,而不是定义。null删除单个元组
例:删除学号为95001的学生的选课信息
Delete From SC
Where sno = ‘95001’
删除多个元组
例:删除选课而未参加考试的学生的选课信息
Delete From SC
Where grade is null
删除整个关系中的所有数据
例:删除所有学生的选课信息
Delete From SC3.8.2 数据插入3.8.2 数据插入 单行插入:一次只插入一个元组
例:新增一个学生信息
Insert Into Student
Values ( ‘98001’, ‘Gloria’,25, ‘F’, ‘CS’)null 多行插入:插入一个集合
例:给CS系的学生开设必修课C05,建立选课信息
Insert Into SC
Select sno,cno,null
From Student,Course
Where sdept = ‘CS’ and
cno = ‘C05’3.8.3 数据更新3.8.3 数据更新改变符合条件的某个(某些)元组的属性值
例:将95001学生转入MA系
Update Student
Set sdept = ‘MA’
Where sno = ‘95001’
例:所有学生年龄加1
Update Student
Set sage = sage + 1 null例:将选修C05课程的学生的成绩改为该课的平均成绩
Update SC
Set grade = ( Select avg(grade )
From SC
Where cno = ‘C05’)
Where cno = ‘C05’3.9 视图3.9 视图是从一个或几个基本表(或视图)中导出的虚表
数据库中只保存它的定义
是RDBMS提供给用户以多种角度观察数据库中数据的重要机制
创建视图、删除
Create View v as
Drop View v null例:计算机系的花名册
Create View CS_Stu as
Select sno, sname, ssex
From Student
Where sdept = ‘CS’3.9.1 视图(View)3.9.1 视图(View)视图名可以出现在任何关系名可以出现的地方
例:列出计算机系的男生
Select sno,sname
From CS_Stu
Where ssex = ‘M’ null例:建立学生平均成绩视图
Create View avg_grade(sno,avg) as
Select sno,avg(grade)
From SC
Group By sno
例:找出平均成绩大于等75的学生
Select *
From avg_grade
Where avg >= 75
注意:此例的使用方法是非标准的。 null视图的更新:单表、原始属性构成的视图可以更新(像基本表那样更新)
由多表构成的视图由很大的限制
视图中的非原始属性也不能更新
例:Update avg_grade
Set avg = 100
Where sno = ‘95001’ 3.9.2 视图的作用 3.9.2 视图的作用 简化用户的操作
不同的用户可从不同的角度看待同一数据
支持一定的逻辑数据独立性
数据的安全性3.9.3 综合示例3.9.3 综合示例Create Domain stu_name varchar(20)
Create Table Student (sno char(10) not null,
sname stu_name ,
sage smallint,
ssex char(1),
sdept char(2),
primary key (sno),
check(ssex in (‘M’, ‘F’)))nullCreate Table Course ( cno char(10) not null ,
cname varchar(20) ,
credit smallint,
primary key (cno))
Create Table SC ( sno char(10) not null ,
cno char(10) not null ,
grade smallint,
primary key (sno, cno),
check(grade >=0 and
grade <=100))3.10 嵌入式SQL3.10 嵌入式SQL 前面所介绍的SQL语言作为一种独立的自含式语言,是联机终端用户在交互环境下使用的,称为交互式SQL(INTERACTIVE SQL),简称ISQL。null在实际应用当中,常常还需要解决这样两个问题:
有许多应用是过程化的,要求根据不同的条件来完成不同的任务;
有许多应用不仅需要读出数据,还必须读查询得到的数据进行处理。null 对于上述问题,单独使用SQL语言是很难满足实际需求的。为了解决这些问题,SQL还提出了另外一种使用方式,即可以作为一种数据子语言嵌入某些主语言中,利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。这种将SQL嵌入COBOL, C, C++, FORTRAN,中使用,称为嵌入式SQL(EMBEDDED SQL),简称ESQL;而接受SQL嵌入的高级语言,称为主语言或者宿主语言。null对于宿主语言中的嵌入式SQl,DBMS通常采用两种方法处理。
一是预编译方法;
一是修改和扩充主语言方法,使之能够处理SQL。
当前主要采用第一种方法。其过程是,有DBMS的预处理程序对源程序进行扫描,识别出SQL语句,然后将它们转换为主语言调用语句,从而使得主语言能过识别它们,最后由主语言的编译程序将整个源程序编译成目标代码。null所有在终端交互方式下使用的SQL均能在嵌入方式下使用。由于使用方式的差异,存在着具体操作方式上的不同。但无论是怎样的使用方式,都需要解决下面三个主要问题:
应用程序中主语言的语句和SQL的语句,这两种语句;
应用程序中既有主语言变量又有SQL列变量,如何区分这两种变量;
主语言变量一般均为标量,而SQL中的列变量一般均为集合量,如何建立由集合量到标量的转换。3.10.1 主语言语句和SQL语句的区分3.10.1 主语言语句和SQL语句的区分在嵌入方式下,所有SQL语句在嵌入主语句的程序时几乎都必须在其前缀加EXEC SQL,而结束标志可以因主语言不同而不同,一般是在语句结束处用END-EXEC 或用分号“;”。
在程序中所使用的SQL中的表,包括基表和视图都要用EXEC SQL DECLEAR语句加以说明。
SQL语句执行后,系统要反馈给程序以信息,这些信息均送入SQL通讯区(SQL Communication Area)SQLCA。
SQLCA是一个数据结构,在应用程序中用EXEC SQL INCLUDE SQLCA 语句加以定义。nullSQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE,这是一个整型变量,反映SQL语句执行后的结果状态。
应用程序每执行一条SQl语句之后都应测试一次SQLCODE的值。
当它为0时表示正常结束,即SQL语句成功;
非0时为非正常结束,SQL语句不成功。
即使说,SQLCODE的基本功用是DBMS向宿主程序执行SQL语句的情况。Elelen Enmi胶原蛋白口服液买四赠一 品牌正品情侣装
亲子装全场包邮 淘宝:http://li370286038.taobao.com/
或者拍拍:http://shop.paipai.com/370286038null 例:在一些高级语言中使用嵌入式SQL语言的与删除S的情况。
在C中使用SQL语言使以EXEC SQL开始,以分号“;”结束,其格式为:
EXEC SQL;
删除关系S的命令为:
EXEC SQL DROP TABLE S;null在COBLE 中以EXEC SQL开始,以END_EXEC结束,格式为:
EXEC SQLEND_EXEC
删除S的语句为:
EXEC SQL DROP TABLE S END_EXEC
在Power Builder中使用SQL与通常SQL没有任何区别,语句前不需要加任何EXEC SQL,只需用分号作为语句结束标记,即删除S的语句为:
DROP TABLE Snull 嵌入式SQL语句根据其作用的不同,可以分为可执行语句和说明性语句两类。可执行语句又分为数据定义、数据控制和数据操作三种。在宿主语言编写的程序(宿主程序)中任何允许出现执行高级语言语句的地方,都可以嵌入可执行SQL语句;任何允许出现说明性高级语句的地方,都可以写说明性SQL语句。3.10.2 主语言变量与SQL变量的区别3.10.2 主语言变量与SQL变量的区别主变量与指示变量
主变量
在嵌入方式下,程序中的SQL语句段内可使用主语言的程序变量来输入和输出数据。SQL中使用主语言程序定义的变量称为主变量。null主变量根据其作用的不同,分为输入主变量和输出主变量。
输入主变量由应用程序对其赋值,SQL加以引用;
输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序。
一个主变量可以既是输入主变量,又是输出主变量。null利用输入主变量,我们可以完成以下功能:
指定向数据库中插入的数据;
把数据库中的数据修改为指定值;
指定WHERE子句或HAVING子句中的条件。
利用输出主变量,我们可以得到SQL语句的执行结果和状态信息。null 指示变量
一个主变量可以附带一个任选的指示变量(indicator variable)。
指示变量是一个整型变量,用来“指示”所述主变量的值或者条件。
指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值,值是否被截断等。null主变量与指示变量的说明
所有SQL语句中用到的主变量和指示变量都必须加以说明。
说明的开头行与结尾行分别为:
EXEC SQL BEGIN DECLEAR SECTION
EXEC SQL END DECLEAR SECTION。
说明了之后的主变量和指示变量,可以在SQL语句中任何一个能够使用表达式的地方调用。nullSQL语句中的主变量名称前必须添加冒号(∶)作为标志,这是为了与数据库中的对象名(表名,视图名,属性名等)向区别。同样,SQL语句中的指示变量之前也必须加有冒号,同时紧跟在所指的主变量之后。
在SQL语句之外的其它地方,说明之后的主变量和指示变量可以直接引用,不必添加冒号。
在主程序内,一般不出现SQL变量。能够使用表达式的地方调用。3.10.3.游标语句的使用3.10.3.游标语句的使用 1. 概念
SQL语言与主语言在数据处理有着不同方式。SQL是面向集合的,一条SQL语句原则上可以产生或处理多条。主语言使面向记录的,一组主变量一次只能存放一条记录,仅仅使用主变量并不能够完全满足SQL语句向应用程序输出数据的要求。这里基本的问题是,在嵌入方式下,SQL的变量是集合型的,主变量为标量型的, SQL变量不能够直接提供给主程序使用。为了解决这个问题,就需要有一种机制,将SQL变量中的集合量逐个取出送入主变量内,进而提供给主程序使用。解决问题的基本思路是在嵌入式SQL中引入“游标”的概念,用游标来协调SQL和主语言的两种不同数据处理方式。null 游标本质上是系统为用户开设的一个数据缓冲区,用以存放SQL语句的结果数据集。
每个游标区都有一个名字。用户可以通过游标逐一读取数据记录,然后赋值给主变量 ,再交由主语言程序作进一步的处理。
利用游标概念提供上述协调机制的基本方法是在嵌入式SQL中增加一组游标(cursor)语句。null游标语句
游标定义语句
有为某一种语句的结果定义一个命名的游标。其语句为:
EXEC SQL DECLARE <游标名>CURSOR FOR<映像语句>null游标打开语句
游标定义后再使用时需要打开游标,此时游标处于活动状态并指向集合的第一个记录。其一般形式为:
EXEC SQL OPEN <游标名>
游标关闭语句
游标使用完后需要关闭。其一般形式为:
EXEC SQL CLOSE <游标名>null游标推进语句
该语句读出当前记录,并将游标推向集合中的下一个记录,此语句常用于循环,其一般形式为:
EXEC SQL FETCH <游标名>null例:查询DEPT变量中给出的某个系的全体学生的信息。
EXEC SQL DECLARE SX CURSOR FOR
SELECT S#,Sn,Sa
FROM S
WHERE Sd=:DEPT;
EXEC SQL OPEN SX;
DO WHILE
EXEC SQL FETCH SX;
INTO S# ,SNAME,AGE
…..
END;
EXEC SQL CLOSE SX;null作业:
课本习题3的:2,13Elelen Enmi胶原蛋白口服液买四赠一 品牌正品情侣装
亲子装全场包邮 淘宝:http://li370286038.taobao.com/
或者拍拍:http://shop.paipai.com/370286038本章小结本章小结简单查询:选择条件、排序输出、聚合运算以及分组处理。
连接查询:查询的并、交、差;连接与笛卡尔积;元组变量。
嵌套查询:产生单值的子查询;涉及到关系的选择条件;涉及到元组的选择条件;相关子查询。
数据库更新:插入、删除、修改。
定义关系模式:定义表、撤消表;更改关系模式;建立和撤消索引。
视图:定义视图、查询视图、更新视图、撤消视图。