1、3 数据库语言数据库语言SQLElelen Enmi胶原蛋白口服液买四赠一胶原蛋白口服液买四赠一 品牌正品情侣装品牌正品情侣装 亲子装全场包邮亲子装全场包邮 淘宝:淘宝:http:/ 本章主要介绍本章主要介绍SQL语言的基本语法和语言的基本语法和使用方式,要求熟练掌握使用方式,要求熟练掌握SQL语言的使用语言的使用规则,能够根据实际需求写出能够准确完规则,能够根据实际需求写出能够准确完成操作的成操作的SQL语句。语句。3.1 概述概述1.SQL的发展的发展 1974年,由年,由Boyce和和Chamberlin提出提出 19751979,IBM San Jose Research Lab的关系
2、数据的关系数据库管理系统原型库管理系统原型System R实施了这种语言实施了这种语言 SQL-86是第一个是第一个SQL标准标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3)2.现状现状 大部分大部分DBMS产品都支持产品都支持SQL,成为操作数据库的标,成为操作数据库的标准语言准语言 有特殊性,支持程度不同有特殊性,支持程度不同q 数据定义(数据定义(DDL)定义、删除、修改关系模式(基本表)定义、删除、修改关系模式(基本表)定义、删除视图(定义、删除视图(View)定义、删除索引(定义、删除索引(Index)q 数据操纵(数据操纵(DML)数据查询数据查询 数据增、删
3、、改数据增、删、改q 数据控制(数据控制(DCL)用户访问权限的授予、收回用户访问权限的授予、收回3.1.1 SQL的功能的功能q 交互式交互式SQL 一般一般DBMS都提供联机交互工具都提供联机交互工具 用户可直接键入用户可直接键入SQL命令对数据库进行操作命令对数据库进行操作 由由DBMS来进行解释来进行解释q 嵌入式嵌入式SQL 能将能将SQL语句嵌入到高级语言(宿主语言)语句嵌入到高级语言(宿主语言)使应用程序充分利用使应用程序充分利用SQL访问数据库的能力、访问数据库的能力、宿主语言的过程处理能力宿主语言的过程处理能力 一般需要预编译,将嵌入的一般需要预编译,将嵌入的SQL语句转化为
4、宿语句转化为宿主语言编译器能处理的语句主语言编译器能处理的语句3.1.2 SQL的形式的形式q数据定义数据定义Create、Drop、Alterq数据操纵数据操纵数据查询:数据查询:Select数据修改:数据修改:Insert、Update、Deleteq数据控制数据控制Grant、Revoke3.1.3 SQL的动词的动词数据查询数据查询是数据库应用的核心功能。是数据库应用的核心功能。v 基本结构:基本结构:Select A1,A2,.,AnFrom r1,r2,.,rmWhere P3.2 数据查询数据查询SelectWhereFromA1,A2,.,An(p(r1r1.rm)3.2.1
5、Select语句的含义语句的含义 对对 From 子句中的各关系,作笛卡儿积(子句中的各关系,作笛卡儿积()对对 Where 子句中的逻辑表达式进行选择(子句中的逻辑表达式进行选择()运算,找出符合条件的元组。运算,找出符合条件的元组。根据根据 Select 子句中的属性列表,对上述结果作子句中的属性列表,对上述结果作投影(投影()操作。)操作。查询操作的对象是关系,结果还是一个关系,查询操作的对象是关系,结果还是一个关系,是一个结果集,是一个动态数据集。是一个结果集,是一个动态数据集。3.2.2 Select子句子句 对应于关系代数的投影(对应于关系代数的投影()运算,用以)运算,用以列出查
6、询结果集中的期望属性。列出查询结果集中的期望属性。q 重复元组重复元组 SQL 具有包的特性具有包的特性 Select子句的缺省情况是保留重复元组子句的缺省情况是保留重复元组(ALL),可用可用 Distinct去除重复元组去除重复元组 Select Distinct sdept From Student Select All sdept From Student 去除重复元组去除重复元组:费时费时 需要临时表的支持需要临时表的支持q *与属性列表与属性列表v 星号星号 *表示所有属性表示所有属性 星号星号 *:按关系模式中属性的顺序排列,按关系模式中属性的顺序排列,并具有一定的逻辑数据独立性
7、并具有一定的逻辑数据独立性 显式列出属性名:显式列出属性名:按用户顺序排列按用户顺序排列Select*From StudentSelect Student.*,cno,grade From Student,SC Where Student.sno=SC.snoq 更名更名 为结果集中的某个属性改名为结果集中的某个属性改名 使结果集更具可读性使结果集更具可读性Select sno as stu_no,cno as course_no,grade From SCSelect sno,sname,2001-sage as birthday From Student3.2.3 where子句子句 wh
8、ere子句对应与关系代数中的选择子句对应与关系代数中的选择()。查询满足指定条件的元组可以通过查询满足指定条件的元组可以通过Where子句来实现。子句来实现。使使where子句中的逻辑表达式返回子句中的逻辑表达式返回True值值的元组,是符合要求的元组,将被选择的元组,是符合要求的元组,将被选择出来。出来。q 运算符运算符 比较:比较:、=、=、=、not+not+确定范围:确定范围:Between A and B、Not Between A and B 确定集合:确定集合:IN、NOT IN 字符匹配:字符匹配:LIKE,NOT LIKE 空值:空值:IS NULL、IS NOT NULL
9、多重条件:多重条件:AND、OR、NOT q like字符匹配:字符匹配:Like、Not Like通配符:通配符:%匹配任意字符串匹配任意字符串_ 匹配任意一个字符匹配任意一个字符大小写敏感大小写敏感 列出姓张的学生的学号、姓名。列出姓张的学生的学号、姓名。Select sno,sname From Student Where sname LIKE 张张%列出张姓且单名的学生的学号、姓名。列出张姓且单名的学生的学号、姓名。Select sno,sname From Student Where sname LIKE 张张_ _q 转义符转义符 escape例:例:列出课程名称中带有列出课程名称
10、中带有_的课号及课的课号及课名。名。Select cno,cnameFrom CourseWhere cname LIKE%_%escape 3.2.4 from子句子句 From子句对应与关系代数中的笛卡儿积(子句对应与关系代数中的笛卡儿积()列出将被扫描的关系(表)列出将被扫描的关系(表)例:例:列出所有学生的学号、姓名、课号、成绩。列出所有学生的学号、姓名、课号、成绩。Select Sudent.sno,sname,SC.cno,grade From Student,SC Where Student.sno=SC.snoq 元组变量元组变量 为为 From 子句中的关系定义元组变量子句中
11、的关系定义元组变量 方便关系名的引用方便关系名的引用 在同一关系的笛卡儿积中进行辨别在同一关系的笛卡儿积中进行辨别例:例:列出与列出与95001同岁的同学的学号,姓名,年龄。同岁的同学的学号,姓名,年龄。SelectT.sno,T.sname,T.sage FromStudent as T,Student as S WhereS.sno=95001 ANDT.sage=S.sage3.2.5 Order By子句子句 指定结果集中元组的排列次序指定结果集中元组的排列次序 耗时耗时 ASC(缺省)、(缺省)、DESC、未选中的属性、未选中的属性例:例:列出列出CS系中的男生的学号、姓名、年龄,系
12、中的男生的学号、姓名、年龄,并按年龄进行排列(升序)。并按年龄进行排列(升序)。Select sno,sname,sage From Student Where sdept=CS Order By sage ASC 3.3 数据定义语言数据定义语言 数据定义语言(数据定义语言(Data Definition Language)Create、Drop、Alter 定义一组关系(基本表)、说明各关系的信息定义一组关系(基本表)、说明各关系的信息 各关系的模式各关系的模式 各属性的值域各属性的值域 完整性约束完整性约束 索引索引 安全性和权限安全性和权限 3.3.1 SQL中的域类型中的域类型q 字
13、符型字符型 char(n)、varchar(n)q 数值型数值型 integer、smallint numeric(p,d)real、double、float(n)q 日期日期/时间型时间型 date time3.3.2 SQL中的域定义中的域定义q 域定义语句(域定义语句(SQL-92支持)支持)需重复使用的需重复使用的 Create Domain stu_name varchar(20)Create Domain zip_code char(6)q 域的删除域的删除 Drop Domain datelog 各各DBMS的方法是不同的的方法是不同的Restrict/Cascade 使用该域的
14、属性的处理使用该域的属性的处理 3.3.3 SQL中的模式定义中的模式定义 Create Table r (A1D1,A2D2,AnDn,)其中:其中:r 关系名(表名)、关系名(表名)、Ai 关系关系 r 的一个属性名的一个属性名Dn 属性属性Ai域值的域类型域值的域类型主键声明:主键声明:primary key(Aj1,Aj2,Ajvm)Create Domain stu_name varchar(20)Create Table Student(sno char(10)primary key(sno),sname stu_name,sage smallint,ssex char(1),sd
15、ept char(2)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:/ 删除表结构删除表结构 用用SQL删除关系(表)删除关系(表)将整个关系模
16、式(表结构)彻底删除将整个关系模式(表结构)彻底删除 表中的数据也将被删除表中的数据也将被删除Drop Table rDrop Table student3.3.5 修改表结构修改表结构q 删除表中的某属性删除表中的某属性 去除属性及相应的数据去除属性及相应的数据Alter Table r Drop A q 增加表中的属性增加表中的属性 向已经存在的表中添加属性向已经存在的表中添加属性 allow null 已有的元组中该属性的值被置为已有的元组中该属性的值被置为NullAlter Table r Add A DAlter Table student phone char(16)3.3.6 D
17、efault Value 属性的默认值属性的默认值 用户不提供某属性的值时,默认值被使用用户不提供某属性的值时,默认值被使用 初始值初始值 DDL中:中:ModifyDate char(30)Default TimeStampAlter Table student Add ID integer Default 10013.3.7 索引索引Index 索引是一种数据结构,是对照表、指针表索引是一种数据结构,是对照表、指针表 索引是为了加速对表中元组的检索而创建索引是为了加速对表中元组的检索而创建的一种分散存储结构(的一种分散存储结构(B树)树)索引是对表而建立的,由除存放表的数据索引是对表而建立
18、的,由除存放表的数据页面以外的索引页面组成页面以外的索引页面组成 索引是把双刃剑,减慢更新的速度索引是把双刃剑,减慢更新的速度 索引不是索引不是SQL标准的要求标准的要求q 索引的种类索引的种类 聚簇索引(聚簇索引(Clustered Index)非聚簇索引(非聚簇索引(Non-Clustered Index)q 聚簇索引(聚簇索引(Clustered Index)表中的元组按聚簇索引的顺序物理地存放表中的元组按聚簇索引的顺序物理地存放 根级页面根级页面-中间层页面中间层页面-叶级页面(数据页面)叶级页面(数据页面)一个表中只能有一个聚簇索引一个表中只能有一个聚簇索引 更新的复杂性,需要大量的
19、临时空间更新的复杂性,需要大量的临时空间q 非聚簇索引(非聚簇索引(Non-Clustered Index)表中的元组按聚簇索引的顺序物理地存放表中的元组按聚簇索引的顺序物理地存放 根级页面根级页面-中间层页面中间层页面-叶级页面(数据页面)叶级页面(数据页面)一个表中只能有一个聚簇索引一个表中只能有一个聚簇索引 更新的复杂性,需要大量的临时空间更新的复杂性,需要大量的临时空间CREATE UNIQUE CLUSTERED|NONCLUSTEREDINDEX index-name On TableName(Column,Column,)Create Index YearIndex On Mov
20、ie(year)Create Clustered Index SnoIndex On student(sno)Drop Index YearIndex3.4 数据添加数据添加v 用用SQL的插入语句,向数据库表中添加数据的插入语句,向数据库表中添加数据 按关系模式的属性顺序按关系模式的属性顺序Insert Into Student Values(0095001,张三张三,27,M,CS)按指定的属性顺序,也可以只添加部分属性(非按指定的属性顺序,也可以只添加部分属性(非Null属性为必需)属性为必需)Insert Into Student(sno,sname,sage)Values(00950
21、02,李四李四,26)3.5 聚合函数聚合函数 把一列中的值进行聚合运算,返回单值的函数。把一列中的值进行聚合运算,返回单值的函数。v五个预定义的聚合函数五个预定义的聚合函数:平均值:平均值:Avg 总和:总和:Sum 最小值:最小值:Min 最大值:最大值:Max 计数:计数:CountCount(*)、Count(Distinct)数值数值3.5.1 Group By 将查询结果集按某一列或多列的值分组,值相将查询结果集按某一列或多列的值分组,值相等的为一组,一个分组以一个元组的形式出现。等的为一组,一个分组以一个元组的形式出现。只有出现在只有出现在Group By子句中的属性,才可出现子
22、句中的属性,才可出现在在Select子句中。子句中。例:例:统计各系学生的人数。统计各系学生的人数。Select sdept,count(*)as stu_count From Student Group By sdept 3.5.2 Having 针对聚合函数的结果值进行筛选(选择),针对聚合函数的结果值进行筛选(选择),它作用于分组计算结果集。它作用于分组计算结果集。跟在跟在Group By子句的后面,没有子句的后面,没有Group By则则针对全表。针对全表。例:例:列出具有两门(含)以上不及格的学生列出具有两门(含)以上不及格的学生的学号、不及格的课目数。的学号、不及格的课目数。Sel
23、ect sno,count(sno)From SC Where grade=2 3.5.3 Having与与Where的区别的区别 Where 决定哪些元组被选择参加运算,决定哪些元组被选择参加运算,作用于关系中的元组。作用于关系中的元组。Having 决定哪些分组符合要求,作用决定哪些分组符合要求,作用于分组。于分组。聚合函数的条件关系必须用聚合函数的条件关系必须用Having,Where中不应出现聚合函数。中不应出现聚合函数。3.5.4 聚合函数忽略聚合函数忽略Null Count:不计不计 Sum:不将其计入不将其计入 Avg:具有具有 Null 的元组不参与的元组不参与 Max/Min
24、:不参与不参与例:例:Select count(sdept)From Student Select Avg(sage)From Student 3.6 子查询子查询 子查询是嵌套在另一查询中的子查询是嵌套在另一查询中的 Select-From-Where 表达式(表达式(Where/Having)。)。SQL允许多层嵌套,由内而外地进行分析,允许多层嵌套,由内而外地进行分析,子查询的结果作为父查询的查找条件。子查询的结果作为父查询的查找条件。可以用多个简单查询来构成复杂查询,以增可以用多个简单查询来构成复杂查询,以增强强SQL的查询能力。的查询能力。子查询中不使用子查询中不使用 Order B
25、y 子句,子句,Order By子句只能对最终查询结果进行排序。子句只能对最终查询结果进行排序。3.6.1 单值比较单值比较 返回单值的子查询,只返回一行一列返回单值的子查询,只返回一行一列 父查询与单值子查询之间用比较运算符进行连接父查询与单值子查询之间用比较运算符进行连接 运算符:运算符:、=、=、=、例:例:找出与找出与95001同龄的学生同龄的学生 Select*From Student Where sage=(Select sage From Student Where sno=95001)3.6.2 多值多值 子查询返回多行一列子查询返回多行一列 运算符:运算符:In、All、So
26、me(Any)、Exists q in 标量值与子查询返回集中的某一个相等,标量值与子查询返回集中的某一个相等,true in 被用来测试多值中的成员。被用来测试多值中的成员。例:例:查询选修查询选修C01课程的学生的学号、姓名。课程的学生的学号、姓名。Select sno,sname From Student Where sno IN (Select sno From SC Where cno=C01)子查询子查询多行一列多行一列例:例:查询选修了查询选修了 数据库数据库的学生的学号和姓名的学生的学号和姓名 Select sno,sname From Student Where sno IN
27、(Select sno From SC Where cno IN(Select cno From Course Where cname=数据库数据库)q all 多值比较:多值比较:多行一列多行一列 父查询与多值子查询之间的比较需用父查询与多值子查询之间的比较需用All来连接来连接 标量值标量值s比子查询返回集比子查询返回集R中的每个都大时,中的每个都大时,sAll R 为为 True All 表示所有表示所有 all、all、=all、all all 等价于等价于 not in 例:例:找出年龄最小的学生找出年龄最小的学生 Select*From Student Where sage Som
28、e R为为True 或或 s Any R为为True Some(早期用早期用Any)表示某一个,只要有一个即返回真表示某一个,只要有一个即返回真 some、some、=some、some=some 等价于等价于 in、some 不等价于不等价于 not in 例:例:找出不是最小年龄的学生找出不是最小年龄的学生 Select*From student Where sage some (Select sage From Student)例:例:找出具有最高平均成绩的学号及平均成绩找出具有最高平均成绩的学号及平均成绩 Select sno,avg(grade)From SC Group By sn
29、o Having avg(grade)=all (Select avg(grade)From SC Group By sno)q exists Exists+子查询用来判断该子查询是否返回元组子查询用来判断该子查询是否返回元组 当子查询的结果集非空时,当子查询的结果集非空时,Exists为为True 当子查询的结果集为空时,当子查询的结果集为空时,Exists为为False 不关心子查询的具体内容,因此用不关心子查询的具体内容,因此用 Select*例:例:列出选修了列出选修了C01课程的学生的学号、姓名课程的学生的学号、姓名 Select sno,sname From Student Whe
30、re Exists(Select*From SC Where SC.sno=Student.sno And cno=C01)例:例:列出得过列出得过100分的学生的学号、姓名分的学生的学号、姓名 Select sno,sname From Student Where Exists (Select*From SC Where SC.sno=Student.sno And grade=100)例:例:查询选修了查询选修了C01课程的学生的系主任课程的学生的系主任 Select manager From department Where Exists(Select*From student Wher
31、e sdept=department.depid And Exists(Select*From SC Where SC.sno =student.sno And cno=C01)例:例:列出没有选列出没有选C01课程的学生的学号、姓名课程的学生的学号、姓名 Select sno,sname From Student Where Not Exists (Select*From SC Where SC.sno=Student.sno And cno=C01)Elelen Enmi胶原蛋白口服液买四赠一胶原蛋白口服液买四赠一 品牌正品情侣装品牌正品情侣装 亲子装全场包邮亲子装全场包邮 淘宝:淘宝:h
32、ttp:/ sname From Student Where Not Exists (Select*From Course Where Not Exists (Select*From SC Where Student.sno=SC.sno And SC.cno=Co)这门课他没选这门课他没选这样的课是不存在的这样的课是不存在的 SQL-92支持多列的成员资格测试(支持多列的成员资格测试(ASA7.0不支持)不支持)例:例:找出同系、同年龄、同性别的学生找出同系、同年龄、同性别的学生 Select*from Student as T Where(T.sdept,T.sage,T.ssex)IN
33、(Select sdept,sage,ssex From student as S Where S.sno T.sno)3.6.3 多列元组的比较多列元组的比较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)Wher
34、e Student.sno=S.stu_no And avg_grade 753.7 空值与连接空值与连接3.7.1 NULL 表示数据的缺失表示数据的缺失 一个确实存在,但我们不知道的值一个确实存在,但我们不知道的值 对本实体此数值无意义,可能是设计上的失误对本实体此数值无意义,可能是设计上的失误 是是SQL的关键字,用于任何类型描述缺失的值的关键字,用于任何类型描述缺失的值 3.7.3 NULL的运算法则的运算法则 对对NULL值和其他任何值作算术运算时,值和其他任何值作算术运算时,结果为结果为NULL 对对NULL值和其他任何值作比较时,结值和其他任何值作比较时,结果为果为UNKOWN
35、Is Null/Is Not Null3.7.4 Unkown的运算规则的运算规则 视视True为为1,False为为0,Unkown为为1/2 AND:取小:取小 OR:取大:取大 NOT:取:取1的补的补 真值表不必死记硬背真值表不必死记硬背3.8 数据库的修改数据库的修改 v数据库修改包括插入数据、修改数据库修改包括插入数据、修改数据、删除数据。数据、删除数据。3.8.1 数据删除数据删除 只能对整个元组操作,不能只删除某些属性上只能对整个元组操作,不能只删除某些属性上的值。的值。只能对一个关系起作用,若要从多个关系中删只能对一个关系起作用,若要从多个关系中删除元组,则必须对每个关系分别
36、执行删除命令。除元组,则必须对每个关系分别执行删除命令。Delete From r Where P 从关系从关系 r 中删除满足中删除满足P的元组,只是删除数据,的元组,只是删除数据,而不是定义。而不是定义。删除单个元组删除单个元组例:例:删除学号为删除学号为95001的学生的选课信息的学生的选课信息 Delete From SCWhere sno=95001 删除多个元组删除多个元组例:例:删除选课而未参加考试的学生的选课信息删除选课而未参加考试的学生的选课信息 Delete From SCWhere grade is null 删除整个关系中的所有数据删除整个关系中的所有数据例:例:删除所
37、有学生的选课信息删除所有学生的选课信息 Delete From SC3.8.2 数据插入数据插入q 单行插入:一次只插入一个元组单行插入:一次只插入一个元组例:例:新增一个学生信息新增一个学生信息 Insert Into Student Values(98001,Gloria,25,F,CS)q 多行插入:插入一个集合多行插入:插入一个集合例:例:给给CS系的学生开设必修课系的学生开设必修课C05,建立选课信息,建立选课信息 Insert Into SC Select sno,cno,null From Student,Course Where sdept=CS and cno=C053.8.
38、3 数据更新数据更新 改变符合条件的某个(某些)元组的属性值改变符合条件的某个(某些)元组的属性值例:例:将将95001学生转入学生转入MA系系 Update Student Set sdept=MA Where sno=95001 例:例:所有学生年龄加所有学生年龄加1 Update Student Set sage=sage+1 例:例:将选修将选修C05课程的学生的成绩改为该课的平均成绩课程的学生的成绩改为该课的平均成绩 Update SC Set grade=(Select avg(grade)From SC Where cno=C05)Where cno=C05先计算先计算avg,再
39、做,再做Update3.9 视图视图 是从一个或几个基本表(或视图)中导出的虚表是从一个或几个基本表(或视图)中导出的虚表 数据库中只保存它的定义数据库中只保存它的定义 是是RDBMS提供给用户以多种角度观察数据库中提供给用户以多种角度观察数据库中数据的重要机制数据的重要机制 创建视图、删除创建视图、删除 Create View v as Drop View v 例:例:计算机系的花名册计算机系的花名册 Create View CS_Stu as Select sno,sname,ssex From Student Where sdept=CS3.9.1 视图(视图(View)视图名可以出现在
40、任何关系名可以出现的地方视图名可以出现在任何关系名可以出现的地方例:例:列出计算机系的男生列出计算机系的男生 Select sno,sname From CS_Stu Where ssex=M 例:例:建立学生平均成绩视图建立学生平均成绩视图 Create View avg_grade(sno,avg)as Select sno,avg(grade)From SC Group By sno例:例:找出平均成绩大于等找出平均成绩大于等75的学生的学生 Select*From avg_grade Where avg=75 注意:注意:此例的使用方法是非标准的。此例的使用方法是非标准的。avg不是不
41、是原始属性原始属性 视图的更新:单表、原始属性构成的视图的更新:单表、原始属性构成的视图可以更新(像基本表那样更新)视图可以更新(像基本表那样更新)由多表构成的视图由很大的限制由多表构成的视图由很大的限制 视图中的非原始属性也不能更新视图中的非原始属性也不能更新例:例:Update avg_grade Set avg=100 Where sno=95001 3.9.2 视图的作用视图的作用 简化用户的操作简化用户的操作 不同的用户可从不同的角度看待同一数据不同的用户可从不同的角度看待同一数据 支持一定的逻辑数据独立性支持一定的逻辑数据独立性 数据的安全性数据的安全性3.9.3 综合示例综合示例
42、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)Create Table Course(cno char(10)not null,cname varchar(20),credit smallint,primary key(cno)Create Table SC(sno char(10)not null,cno c
43、har(10)not null,grade smallint,primary key(sno,cno),check(grade=0 and grade=100)3.10 嵌入式嵌入式SQL 前面所介绍的前面所介绍的SQL语言作为一种独语言作为一种独立的自含式语言,是联机终端用户在交立的自含式语言,是联机终端用户在交互环境下使用的,称为交互式互环境下使用的,称为交互式SQL(INTERACTIVE SQL),简称),简称ISQL。v在实际应用当中,常常还需要解决这样在实际应用当中,常常还需要解决这样两个问题:两个问题:有许多应用是过程化的,要求根据不同的有许多应用是过程化的,要求根据不同的条件来
44、完成不同的任务;条件来完成不同的任务;有许多应用不仅需要读出数据,还必须读有许多应用不仅需要读出数据,还必须读查询得到的数据进行处理。查询得到的数据进行处理。对于上述问题,单独使用对于上述问题,单独使用SQL语言是很难满语言是很难满足实际需求的。为了解决这些问题,足实际需求的。为了解决这些问题,SQL还提出还提出了另外一种使用方式,即可以作为一种数据子语了另外一种使用方式,即可以作为一种数据子语言嵌入某些主语言中,利用高级语言的过程性结言嵌入某些主语言中,利用高级语言的过程性结构来弥补构来弥补SQL语言实现复杂应用方面的不足。这语言实现复杂应用方面的不足。这种将种将SQL嵌入嵌入COBOL,C
45、,C+,FORTRAN,中使中使用,称为嵌入式用,称为嵌入式SQL(EMBEDDED SQL),简称,简称ESQL;而接受;而接受SQL嵌入的高级语言,称为主语嵌入的高级语言,称为主语言或者宿主语言。言或者宿主语言。v对于宿主语言中的嵌入式对于宿主语言中的嵌入式SQl,DBMS通常采用两种方法处理。通常采用两种方法处理。一是预编译方法;一是预编译方法;一是修改和扩充主语言方法,使之能够一是修改和扩充主语言方法,使之能够处理处理SQL。当前主要采用第一种方法。其过程当前主要采用第一种方法。其过程是,有是,有DBMS的预处理程序对源程序进的预处理程序对源程序进行扫描,识别出行扫描,识别出SQL语句
46、,然后将它们语句,然后将它们转换为主语言调用语句,从而使得主语转换为主语言调用语句,从而使得主语言能过识别它们,最后由主语言的编译言能过识别它们,最后由主语言的编译程序将整个源程序编译成目标代码。程序将整个源程序编译成目标代码。v 所有在终端交互方式下使用的所有在终端交互方式下使用的SQL均能在嵌入方均能在嵌入方式下使用。由于使用方式的差异,存在着具体操式下使用。由于使用方式的差异,存在着具体操作方式上的不同。但无论是怎样的使用方式,都作方式上的不同。但无论是怎样的使用方式,都需要解决下面三个主要问题:需要解决下面三个主要问题:应用程序中主语言的语句和应用程序中主语言的语句和SQL的语句,这两
47、种的语句,这两种语句;语句;应用程序中既有主语言变量又有应用程序中既有主语言变量又有SQL列变量,如列变量,如何区分这两种变量;何区分这两种变量;主语言变量一般均为标量,而主语言变量一般均为标量,而SQL中的列变量一中的列变量一般均为集合量般均为集合量,如何建立由集合量到标量的转换。如何建立由集合量到标量的转换。3.10.1 主语言语句和主语言语句和SQL语句的区分语句的区分 在嵌入方式下,所有在嵌入方式下,所有SQL语句在嵌入主语句的程语句在嵌入主语句的程序时几乎都必须在其前缀加序时几乎都必须在其前缀加EXEC SQL,而结束,而结束标志可以因主语言不同而不同,一般是在语句结标志可以因主语言
48、不同而不同,一般是在语句结束处用束处用END-EXEC 或用分号或用分号“;”。在程序中所使用的在程序中所使用的SQL中的表,包括基表和视图中的表,包括基表和视图都要用都要用EXEC SQL DECLEAR语句加以说明。语句加以说明。SQL语句执行后,系统要反馈给程序以信息,这语句执行后,系统要反馈给程序以信息,这些信息均送入些信息均送入SQL通讯区(通讯区(SQL Communication Area)SQLCA。SQLCA是一个数据结构,在应用程序中用是一个数据结构,在应用程序中用EXEC SQL INCLUDE SQLCA 语句加以定义。语句加以定义。SQLCA中有一个存放每次执行中有一
49、个存放每次执行SQL语句后返回语句后返回代码的变量代码的变量SQLCODE,这是一个整型变量,这是一个整型变量,反映反映SQL语句执行后的结果状态。语句执行后的结果状态。应用程序每执行一条应用程序每执行一条SQl语句之后都应测试一次语句之后都应测试一次SQLCODE的值。的值。当它为当它为0时表示正常结束,即时表示正常结束,即SQL语句成功;语句成功;非非0时为非正常结束,时为非正常结束,SQL语句不成功。语句不成功。即使说,即使说,SQLCODE的基本功用是的基本功用是DBMS向宿向宿主程序报告执行主程序报告执行SQL语句的情况。语句的情况。Elelen Enmi胶原蛋白口服液买四赠一胶原蛋
50、白口服液买四赠一 品牌正品情侣装品牌正品情侣装 亲子装全场包邮亲子装全场包邮 淘宝:淘宝:http:/ SQL开始,开始,以分号以分号“;”结束,其格式为:结束,其格式为:EXEC SQL;删除关系删除关系S的命令为:的命令为:EXEC SQL DROP TABLE S;v在在COBLE 中以中以EXEC SQL开始,以开始,以END_EXEC结束,格式为:结束,格式为:EXEC SQLEND_EXEC 删除删除S的语句为:的语句为:EXEC SQL DROP TABLE S END_EXECv在在Power Builder中使用中使用SQL与通常与通常SQL没没有任何区别,语句前不需要加任何