第五章 SQL语言(二)

5.3.5 嵌套查询的改进方法

1.导出表

SQL2允许在FROM子句中使用子查询。如果在FROM子句中使用了子查询,那么要给子查询的结果起个表名和相应的列名。

2.WITH子句和临时视图

SQL3允许用户用WITH子句定义一个临时视图(即子查询),至于SELECT语句的开始出。而临时视图本身是用SELECT语句定义的。

5.3.6 基本表的连接操作

下面是与连接操作有关的解释和说明:

(1)连接类型分成内连接和外连接两种。内连接(INNER JOIN)是等值连接,外连接又分成左(LEFT OUTER JOIN)、右(RIGHT OUTER JOIN)、完全连接(FULL OUTER JOIN)三种。连接类型中INNER、OUTER字样可不写。

(2)连接条件分成三种:

① NATURAl:表示两个关系执行自然连接操作,即在两个关系的公共属性上作等值连接,运算结果中公共属性只出现一次。

② ON等值连接条件:具体列出两个关系在哪些相应属性上做等值连接。

③ USING(A1,A2,...,An):类似于NATURAL形式,这里A1,A2,...,An是两个关系上的公共属性,但可以不是全部公共属性。在连接的结果中,公共属性A1,A2,...,An只出现一次。

(3)若连接操作是“INNER JOIN”,未提及连接条件,那么这个操作等价与笛卡尔积,SQL2把此操作定义为“CROSS JOIN”。

(4)若连接操作是“FULL OUTER JOIN ON false”,这里的连接条件总是false,那么这个操作类十余“外部并”操作,但也有区别。这里操作结果要把两个关系的属性全部包括进去。SQL2把此操作定义为“UNION JOIN”。

5.4 数据更新

5.4.1 数据插入

往SQL基本表中插入数据的语句是INSERT语句,在SQL3中,有以下四种方式:

(1)单元组的插入

INSERT INTO<基本表名>[(<列名序列>)]

VALUES(<元组值>)

(2)多元组插入

INSERT INTO<基本表名>[(<列名序列>)]

VALUES(<元组值>),(<元组值>),(<元组值>)……,(<元组值>)

(3)查询结果的插入

INSERT INTO<基本表名>[(<列名序列>)]

<SELECT 查询语句>

这个语句可把一个SELECT语句的查询结果插到某个基本表中。

(4)表的插入

INSERT INTO<基本表名>[(<列名序列>)]

TABLE<基本表名2>

上述各种插入语句中,如果插入的值在属性个数、顺序与基本表的结构完全一致,那么基本表后的(<列名序列>)可省略,否则必须详细列出。

5.4.2 数据删除

SQL的删除操作是指从基本表中删除元组,其句法如下:

DELETE FROM <基本表名>

[WHERE <条件表达式>]

DELETE语句只能从一个基本表中删除元组。如果想从多个基本表中删除元组,就必须为每一个基本表写一条DELETE语句。WHERE子句中的添加可以和SELECT语句的WHERE子句中条件一样复杂,可以嵌套,也可以是来自几个基本表的复合条件。

5.4.3 数据修改

当需要修改基本表中元组的某些列值时,可以用UPDATE语句实现,其句法如下:

UPDATE <基本表名>

SET<列名>=<值表达式>[,<列名>=<值表达式>…]|ROW=(<元组>)

[WHERE<条件表达式>]

其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在SET子句中指出。SET子句中第一种格式是对符合条件元组中的列值进行修改,第二种格式是可对符合条件的元组中每个列值进行修改。

5.5 视图

5.5.1 视图的创建和撤销

在SQL中,外模式一级数据结构的基本单位是视图(view),视图是从若干个基本表和(或)其他视图构造出来的表。

1.视图的创建

创建视图可用“CREATE VIEW”语句实现。其句法如下:

CREATE VIEW<视图名>(<列表序列>)

AS <SELECT查询语句>

2.视图的撤销

在视图不需要时,可以用“DROP VIEW”语句把其从系统中撤销。其句法如下:

DROP VIEW <视图名>

5.5.2 对视图的操作

定义5.1 如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。允许用户更新的视图在定义时必须加上“WITH CHECK OPTION”短语。

5.6 嵌入式SQL

在主语言中使用的SQL结构称为嵌入式SQL。

5.6.1 嵌入式SQL的实现方式

SQL语言有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL;另一种是嵌入在主语言的程序中使用,称为嵌入式SQL。

存储设备上的数据库是用SQL存取的,数据库和主语言程序间信息的传递是通过共享变量实现的。这些共享变量要用SQL的DECLARE语句说明,随后SQL语句就可引用这些变量。共享变量也就成了SQL和主语言的接口。

SQL2规定,SQL_STATE是一个特殊的共享变量,起着解释SQL语句执行状况的作用,它是一个由5个字符组成的字符数组。当一样SQL语句执行成功时,系统自动给SQL_STATE赋上全零值(即“00000”),表示未发生错误;否则其值为非全零,表示执行语句时发生的各种错误情况。

5.6.2 嵌入式SQL的使用规定

在主语言的程序中使用SQL语句有以下规定:

1.在程序中要区分SQL语句和主语言语句

所有SQL语句钱必须加上前缀标识“EXEC SQL”,并以“END_EXEC”作为语句结束标志。嵌入的SQL语句的格式如下:

EXEC SQL <SQL语句> END_EXEC

结束标识在不同的主语言中是不同的。

2.允许嵌入的SQL语句引用主语言的程序变量(称为共享变量)

允许嵌入的SQL语句引用主语言的程序变量。但有两条规定:

(1)引用时,这些变量前必须加冒号“:”作为前缀标识,以示与数据库中变量有区别。

(2)这些变量要用SQL的DECLARE语句说明。

3.SQL的集合处理方式与主语言单记录处理方式之间的协调

与游标(cursor)有关的SQL语句有下列四个:

(1)游标定义语句(DECLARE)。游标是与某一查询结果相联系的符号名,游标用SQL的DECLARE语句定义,句法如下:

EXEC SQL DECLARE <游标名> CURSOR FOR

<SELECT语句>

END_EXEC

游标定义语句是一个说明语句,定义中的SELECT语句并不立即执行。

(2)游标打开语句(OPEN)。该语句执行游标定义中的SELECT语句,同事游标处于活动状态。游标是一个指针,此时指向查询结果的第一行之前。OPEN的句法如下:

EXEC SQL OPEN <游标名> END_EXEC

(3)游标推进语句(FETCH)。此时游标推进一行,并把游标指向的行(称为当前行)的值取出,送到共享变量。其句法如下:

EXEC SQL FETCH FROM<游标名> INTO<变量表> END_EXEC

变量表是由逗号分开的共享变量注册。FETCH语句常置于主语言程序的循环结果中,并借助主语言的处理语句逐一处理查询结果中的一个个元组。

(4)游标关闭语句(CLOSE)。关闭游标,使它不再和查询结果相联系。关闭了的游标,可以再次打开,与新的查询结果相联系。该语句的句法如下:

EXEC SQL CLOSE<游标名> END_EXEC

在游标处于活动状态时,可以修改和删除游标指向的元组。

5.6.3 嵌入式SQL的使用技术

SQL DDL语句,只要加上前缀标识“EXEC SQL”和结束标志“END_EXEC”,就能嵌入在主语言程序中使用。SQL DML语句在嵌入使用时,要注意是否使用了游标机制。

1.不涉及游标的SQL DML语句

SELECT语句的使用方式

由于INSERT、DELETE、和UPDATE语句不反悔数据结果,只是对数据库进行操作,隐藏只要加上前缀标识“EXEC SQL”和结束标志“END_EXEC”,就能嵌入在主语言程序中使用。对于SELECT语句,如果已知查询结果肯定是单元组时,在加上前缀合结束标志后,也可直接嵌入在主程序中使用,此时应在SELECT语句中再增加一个INTO子句,指出找到的值应送到相应的共享变量中去。

2.涉及游标的SQL DML语句

(1)SELECT语句的使用方式

(2)对游标指向元组的修改或删除操作

在游标处于活动状况时,可以修改或删除游标指向的元组。

3.卷游标的定义和推进

SQL2提供了卷游标(scroll cursor)技术解决这个问题,在推进游标时可以进退自如。

(1)卷游标的定义句法如下:

EXEC SQL DECLARE<游标名> SCROLL CURSOR FOR

<SELECT语句>

END_EXEC

(2)卷游标的推进句法如下:

EXEC SQL FETCH 

[NEXT|PRIOR|FIRST|LAST|RELATIVE<整数>|ABSOLUTE<整数>] 

FROM <游标名> INTO <变量表> END_EXEC

这里,NEXT 表示把游标从当前位置推进一行;

  PRIOR 表示把游标从当前位置返回一行;

  FIRST 表示把游标移向查询结果的第一行;

  LAST 表示把游标移向查询结果的最后一行;

后两种句法举例说明:

  RELATIVE 3 表示把游标从当前位置推进3行;

  RELATIVE -5 表示把游标从当前位置返回5行;

  ABSOLUTE 4 表示把游标移向查询结果的第4行;

  ABSOLUTE -6 表示把游标移向查询结果的倒数第6行。

5.6.4 动态SQL语句

动态SQL技术主要有两个SQL语句:

1.动态SQL预备语句

EXEC SQL PREPARE<动态SQL语句名> FROM <共享变量或字符串>

这里的共享变量或字符串的值应是一个完整的SQL语句。这个语句可以在程序运行时根据用户输入组合起来。此时,这个语句并不执行。

2.动态SQL执行语句

ESEC SQL EXECUTE<动态语句名>

动态SQL语句使用时,还可以有两点改进:

(1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可以合并成一个语句:

EXEC SQL EXECUTE IMMEDIATE<共享变量或字符串>

(2)当预备语句中组合而成的SQL语句中条件值尚缺时,可以在执行语句中用USING短语补上:

EXEC SQL EXECUTE <动态SQL语句名> USING <共享变量>

5.7 存储过程与SQL/PSM

存储过程(Stored Procedure)和SQL/PSM(Persistent Stored Module,持久化存储模块)

5.7.1 数据库存储过程与函数

定义5.2 存储过程是使用SQL语句和控制流程控制语句编写的模块,存储过程经编译和优化后存储在数据库服务器端的数据库中,使用时调用即可。

使用存储过程具有以下优点:

(1)提高运行速度。

(2)增强了SQL的功能和灵活性。

(3)可以降低网络的通信量。

(4)减轻了程序编写的工作量。

(5)间接实现了安全控制功能。

由于存储过程只是用来完成数据查询和数据处理操作,因此在存储过程中不可以使用创建数据库对象的语句。

声明存储过程的一般形式如下:

CREATE PROCEDURE <过程名> (<参数>)

<局部声明>

<过程体>;

这里的声明和参数都是可选的,只在需要时才指定。

函数的声明形式:

CREATE FUNCTION <函数名>(<参数>)

RETURN <返回类型>

<局部声明>

<函数体>;

如果过程(或函数)用通用程序设计语言编写,则要指定语言和存储程序代码的文件名。

CREATE PROCEDURE <函数名> (<参数>)

LANGUAGE <程序设计语言名>

EXTERNAL NAME<文件路径名>;

通常情况下,每个参数都应当有一个参数类型,该参数类型应是一种SQL数据类型。每个参数还应有一个参数模式,可以为IN、OUT或INOUT。这些模式是指只能输入值、只能输出(返回)值、即可输入又可输出值。

可使用SQL标准中的CALL语句来调用存储过程,可以从交互式界面调用,也可以由嵌入式SQL调用。该调用语句的形式如下:

CALL<过程名>(<参数列表>);

5.7.2 SQL/PSM

SQL/PSM是SQL标准的一部分,它指定了如何编写持久存储模块,提供流程控制语句来表示过程处理的应用逻辑。

1.顺序执行

2.条件分支语句

条件分支是在存储过程中进行流程控制的基本依据之一。它根据条件表达式的执行结果来确定后续执行的语句分支。其形式如下:

IF <条件> THEN <语句列表>

ELSEIF <条件> THEN <语句列表>

……

ELSEIF <条件> THEN <语句列表>

ELSE <语句列表>

END IF;

3.循环语句

SQL/PSM中有多种循环构造,下面介绍三种形式

(1)标准的WHILE循环结构:

WHILE <条件> DO

<语句列表>

END WHILE;

(2)标准的REPEAT循环结构:

REPEAT

<语句列表>

UNTIL <条件>

END REPEAT;

(3)基于游标的循环结构:

FOR <循环名>  AS <游标名> CURSOR FOR <查询> DO

<语句列表>

END FOR;

此循环中的语句列表会对查询结果中的每个元组执行一次。循环也可以起一个名字。

另外,如果条件得到了满足,还可以用一个“LEAVE<循环名>”语句来中断循环。

<!--EndFragment-->
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值