第 4 章 数据库的查询和视图

94
第4第 第第第第第第第第第 4.1 第第 第第第第第 Oracle 是 是是是是是是是是是 是是是是是是是是是是是是是是是是是 是是是是是是是是是是是是 是是 ,,。 是是是是是是是是是是是是是是是是是是是 是是是是是是是 是是是是是 是是是是是是是是是 是是是 是是是是是是 是是是 、,一:、, 是是是是是是是是是是是是是是是是4.1.1 第第 是是Selection 是是是是是是是是是 是是是是是是是是是是是是是是是是 ),一 是是是是是是是是 是是是是是是是 是是是 是是是是是是是是是是 是是是是是 。,一。, 是是是是是是是是 是是是是 是是是是是是是 一,。

Upload: lynda

Post on 15-Mar-2016

226 views

Category:

Documents


7 download

DESCRIPTION

第 4 章 数据库的查询和视图. 4.1 连接、选择和投影 Oracle 是一个关系数据库管理系统,关系数据库建立在关系模型基础之上,具有严格的数学理论基础。关系数据库对数据的操作除了包括集合代数的并、差等运算之外,还定义了一组专门的关系运算:连接、选择和投影,关系运算的特点是运算的对象和结果都是表。 4.1.1 选择 选择( Selection ),简单的说就是通过一定的条件把自己所需要的数据检索出 来。选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出 满足条件的行形成一个新表,作为运算结果。. 4.1.1 选择. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 4 章  数据库的查询和视图

第 4 章 数据库的查询和视图 4.1 连接、选择和投影 Oracle 是一个关系数据库管理系统,关系数据库建立在关系模型基础之上,具有严格的数学理论基础。关系数据库对数据的操作除了包括集合代数的并、差等运算之外,还定义了一组专门的关系运算:连接、选择和投影,关系运算的特点是运算的对象和结果都是表。 4.1.1 选择 选择( Selection ),简单的说就是通过一定的条件把自己所需要的数据检索出来。选择是单目运算,其运算对象是一个表。该运算按给定的条件,从表中选出满足条件的行形成一个新表,作为运算结果。

Page 2: 第 4 章  数据库的查询和视图

4.1.1 选择 【例 4.1 】学生情况表如表 4.1 所示。 若要在学生情况表中找出学生表中性别为女且平均成绩在 80 分以上的行形成一个新表, 该选择运算的结果如表 4.2 所示。表 4.1 学生

表 4.2 查询后的结果

Page 3: 第 4 章  数据库的查询和视图

4.1.2 投影 投影( Projection )也是单目运算。投影就是选择表中指定的列,这样在查询结果中只显示指定数据列,减少了显示的数据量也提高查询的性能。 【例 4.2 】若在表 4.1 中对“姓名”和“平均成绩”投影,该查询得到如表 4.

3 所示的新表。 表 4.3 投影后的新表

Page 4: 第 4 章  数据库的查询和视图

4.1.3 连接连接( JOIN )是把两个表中的行按照给定的条件进行拼接而形成新表。【例 4.3 】若表 A 和 B 分别如表 4.4 和表 4.5 所示,则连接后结果如表 4.6 所示。

表 4.4 A 表

表 4.5 B 表

表 4.6 连接后的表

Page 5: 第 4 章  数据库的查询和视图

4.1.3 连接 【例 4.4 】若表 A 和表 B 分别如表 4.7 和表 4.8 所示,自然连接后的新表 C如表 4.9所示。 表 4.7 A 表

表 4.8 B 表

表 4.9 C 表

Page 6: 第 4 章  数据库的查询和视图

4.2 数据库的查询 使用数据库和表的主要目的是存储数据以便在需要时进行检索、统计或组织输出,通过 PL/SQL 的查询可以从表或视图中迅速方便地检索数据。 PL/SQL 的SELECT 语句可以实现对表的选择、投影及连接操作,其功能十分强大。 下面介绍 SELECT 语句,它是 PL/SQL 的核心。 SELECT 语句很复杂,主要的子句如下: 语法格式: SELECT select_list /* 指定要选择的列或行及其限定 */ FROM table_source /*FROM 子句,指定表或视图 */ [ WHERE search_condition ] /*WHERE 子句,指定查询条件 */ [ GROUP BY group_by_expression ] /*GROUP BY 子句,指定分组表达式 */ [ HAVING search_condition ] /*HAVING 子句,指定分组统计条件 */ [ ORDER BY order_expression [ ASC | DESC ]] /*ORDER 子句,指定排序表达式和顺序 */

Page 7: 第 4 章  数据库的查询和视图

4.2.1 选择列选择表中的列组成结果表,通过 SELECT 语句的 SELECT 子句来表示。语法格式: SELECT [ ALL | DISTINCT ] <select_list>其中 select_list 指出了结果的形式, select_list 的主要格式为: { * /* 选择当前表或视图的所有列 */ | { table_name | view_name | table_alias } . * /* 选择指定的表或视图的所有列 */ | { colume_name | expression } [ [ AS ] column_alias ] /* 选择指定的列 */ | column_alias = expression /* 选择指定列并更改列标题 */ } [ , … n ]1. 选择一个表中指定的列使用 SELECT 语句选择一个表中的某些列,各列名之间要以逗号分隔。语法格式: SELECT column_name [ , column_name…] FROM table_name WHERE search_condition其功能是在 FROM 子句指定的表中检索符合 search_condition 条件的列。

Page 8: 第 4 章  数据库的查询和视图

4.2.1 选择列【例 4.5 】查询 XSCJ 数据库的 XS 表中各个同学的 XM 、 XH 和 ZXF 。 SELECT XH, XM,ZXF FROM XS;执行结果如图 4.1 所示。

图 4.1 在 XS 表中选择列

Page 9: 第 4 章  数据库的查询和视图

4.2.1 选择列【例 4.6 】查询 XS 表中 ZXF 大于 45 同学的 XH 、 XM 和 ZXF 。 SELECT XH,XM,ZXF FROM XS WHERE ZXF>45;当在 SELECT 语句指定列的位置上使用 * 号时,表示选择表的所有列。【例 4.7 】查询 XS 表中的所有列。

SELECT * FROM XS;该语句等价于语句:

SELECT XH,XM,ZYM,XB,CSSJ,ZXF,BZ FROM XS;其执行后将列出 XS 表中的所有数据。

Page 10: 第 4 章  数据库的查询和视图

4.2.1 选择列  2.  修改查询结果中的列标题 当希望查询结果中的某些列或所有列显示时使用自己选择的列标题时,可以在列名之后使用 AS 子句来更改查询结果的列标题名,其中 column_alias 是指定的列标题。 【例 4.8 】查询 XS 表中计算机同学的 XH 、 XM 和 ZXF ,结果中各列的标题分别指定为学号、姓名和总学分。    SELECT XH AS 学号 ,XM AS 姓名 ,ZXF AS 总学分      FROM XS      WHERE ZYM=’ 计算机’ ; 该语句的执行结果如图 4.2 所示。 更改查询结果中的列标题可以省略 AS 关键字。例如:    SELECT XH 学号 , XM 姓名 , ZXF 总学分       FROM XS       WHERE ZYM=’ 计算机’ ;

Page 11: 第 4 章  数据库的查询和视图

4.2.1 选择列

图 4.2 更改查询结果中的列标题

Page 12: 第 4 章  数据库的查询和视图

4.2.1 选择列  3. 计算列值 使用 SELECT 对列进行查询时,在结果中可以输出对列值计算后的值,即SELECT 子句可使用表达式作为结果,格式为:       SELECT expression [ , expression ] 【例 4.9 】创建产品销售数据库 XSH ,并在其中创建产品表 CP ,其表结构如表4.10 所 表 4.10 CP 表结构

Page 13: 第 4 章  数据库的查询和视图

4.2.1 选择列设 CP 表中已有如表 4.11 所示的数据。

表 4.11 CP 表

Page 14: 第 4 章  数据库的查询和视图

4.2.1 选择列下列语句将列出产品名称和产品总值:   SELECT CPMC AS 产品名称 ,       JG * KCL AS 产品总值      FROM CP;该语句的执行结果如图 4.3 所示。

图 4.3 计算列值

Page 15: 第 4 章  数据库的查询和视图

4.2.1 选择列4. 消除结果集中的重复行【例 4.10 】对 XSCJ 数据库的 XS 表只选择 ZYM 和 ZXF ,消除结果集中的重复行。   SELECT DISTINCT ZYM AS 专业名 ,ZXF AS 总学分      FROM XS;该语句执行的结果为: 专业名    总学分 计算机   48 计算机   50 计算机   52 计算机   54 通信工程   40 通信工程   42 通信工程   44 通信工程   50 与 DISTINCT 相反,当使用关键字 ALL 时,将保留结果集的所有行。

Page 16: 第 4 章  数据库的查询和视图

4.2.1 选择列【例 4.11 】以下的 SELECT 语句对 XSCJ 数据库的 XS 表选择 ZYM 和 ZXF ,不消除结果集中的重复行。    SELECT ALL ZYM AS 专业名 ,ZXF AS 总学分       FROM XS; 该语句执行后结果为: 专业名      总学分 计算机   50 计算机   50 计算机       50 计算机   50 计算机   54 计算机   52 计算机   50 计算机   50 计算机   50 计算机   48 计算机       50 通信工程 42 通信工程 40 通信工程 42 通信工程 42 通信工程 44 通信工程 42 通信工程 42 通信工程 42 通信工程 42 通信工程 42 通信工程 50

Page 17: 第 4 章  数据库的查询和视图

4.2.2 选择行  1.  表达式比较 比较运算符用于比较两个表达式值,共有 7 个,分别是: = (等于)、 < (小于)、 <= (小于等于)、 > (大于)、 >= (大于等于)、 <> (不等于)、 !=(不等于)。比较运算的格式为:    expression { = | < | <= | > | >= | <> | != } expression 当两个表达式值均不为空值( NULL )时,比较运算返回逻辑值 TRUE (真)或 FALSE (假);而当两个表达式值中有一个为空值或都为空值时,比较运算将返回 UNKNOWN 。 【例 4.12 】 (1) 查询 XSH 数据库 CP 表中库存量在 500 以上的产品情况。     SELECT *       FROM CP        WHERE KCL >500;(2) 查询 XSCJ 数据库 XS 表中通信工程专业总学分大于等于 42 的同学的情况。     SELECT *     FROM XS     WHERE ZYM=’ 通信工程’ and ZXF>=42;

Page 18: 第 4 章  数据库的查询和视图

4.2.2 选择行  2.  模式匹配  LIKE谓词用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char 、 varchar2 和 date类型的数据,返回逻辑值 TRUE 或 FALSE 。 LIKE谓词表达式的格式为:    string_expression [ NOT ] LIKE string_expression 【例 4.13 】查询 XSH 数据库 CP 表中产品名含有“冰箱”的产品情况。    SELECT *    FROM CP    WHERE CPMC LIKE ‘%冰箱%’; 执行结果为:  CPBH     CPMC     JG   KCL  10001100 冰箱 A_100 1500.0   500  10002120 冰箱 A_200 1850.0   200    10001200 冰箱 B_200 1600.0   1200  10001102    冰箱 C_210    1890.0    600

Page 19: 第 4 章  数据库的查询和视图

4.2.2 选择行 【例 4.14 】查询 XSCJ 数据库 XS 表中姓“王”且单名的学生情况。   SELECT * FROM XS WHERE XM LIKE ‘王 _’; 执行结果为:  XH    XM   ZYM    XB    CSSJ   ZXF   BZ  061101  王林  计算机  男 10-二月 -86    50  061103  王燕  计算机  女 06- 十月 -85    50  061201  王敏  通信工程  男 10-六月 -84    42  061202  王林  通信工程  男 29- 一月 -85    40   有一门课不及格,待补考  3.  范围比较 用于范围比较的关键字有两个: BETWEEN 和 IN 。 当要查询的条件是某个值的范围时,可以使用 BETWEEN 关键字。 BETWEEN 关键字指出查询范围,格式为:     expression [ NOT ] BETWEEN expression1 AND expression2 当不使用 NOT 时,若表达式 expression 的值在表达式 expression1 与 expression2 之间(包括这两个值),则返回 TRUE ,否则返回 FALSE;使用 NOT 时,返回值刚好相反。 注意: expression1 的值不能大于 expression2 的值。

Page 20: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.15 】 (1) 查询 XSH 数据库 CP 表中价格在 2000元与 4000元之间的产品情况。 SELECT * FROM CP WHERE JG BETWEEN 2000 AND 4000;(2) 查询 XSCJ 数据库 XS 表中不在 1985年出生的学生情况。 SELECT * FROM XS WHERE CSSJ NOT BETWEEN TO_DATE(‘19850101’,’YYYYMMDD’) and TO_DATE(‘19851231’,’YYYYMMDD’);使用 IN 关键字可以指定一个值表,值表中列出所有可能的值,当表达式与值表中的任一个匹配时,即返回 TRUE ,否则返回 FALSE 。使用 IN 关键字指定值表的格式为:expression IN ( expression [,…n])【例 4.16 】查询 XSH 数据库 CP 表中库存量为“ 200” 、“ 300” 和“ 500” 的情况。 SELECT * FROM CP WHERE KCL IN (200,300,500);该语句与下列语句等价: SELECT * FROM CP WHERE KCL=200 OR KCL=300 OR KCL=500;

Page 21: 第 4 章  数据库的查询和视图

4.2.2 选择行4. 空值比较当需要判定一个表达式的值是否为空值时,使用 IS NULL 关键字,格式为:expression IS [ NOT ] NULL当不使用 NOT 时,若表达式 expression 的值为空值,返回 TRUE ,否则返回FALSE;当使用 NOT 时,结果刚好相反。【例 4.17 】查询 XSCJ 数据库中总学分尚不定的学生情况。 SELECT * FROM XS WHERE ZXF IS NULL;

Page 22: 第 4 章  数据库的查询和视图

4.2.2 选择行5. 子查询在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询。PL/SQL允许 SELECT多层嵌套使用,用来表示复杂的查询。子查询除了可以用在 SELECT 语句中,还可以用在 INSERT 、 UPDATE 及 DELETE 语句中。子查询通常与 IN 、 EXIST谓词及比较运算符结合使用。(1) IN 子查询IN 子查询用于进行一个给定值是否在子查询结果集中的判断,格式为:

expression [ NOT ] IN ( subquery )其中 subquery 是子查询。当表达式 expression 与子查询 subquery 的结果表中的某个值相等时, IN谓词返回 TRUE ,否则返回 FALSE;若使用了 NOT ,则返回的值刚好相反。

Page 23: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.18 】在 XSCJ 数据库中有描述课程情况的表 KC 和描述学生成绩表的表XS_KC( 表的结构和样本数据见附录 A) 。查找选修了课程号为 101 的课程的学生的情况:

SELECT * FROM XSWHERE XH IN

( SELECT XH FROM XS_KC WHERE KCH = ‘101’ );在执行包含子查询的 SELECT 语句时,系统先执行子查询,产生一个结果表,再执行查询。本例中,先执行子查询: SELECT XH

FROM XS_KC WHERE KCH = ‘101’;得到一个只含有学号列的表, XS_KC 中课程名列值为‘ 101’ 的行在结果表中都有一行。再执行外查询,若 XS 表中某行的学号列值等于子查询结果表中的任一个值,则该行就被选择。

Page 24: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.19 】查找未选修离散数学的学生的情况。 SELECT XH,XM,ZYM,ZXF

FROM XS WHERE XH NOT IN

( SELECT XH FROM XS_KC WHERE KCH IN

( SELECT KCH FROM KC WHERE KCM = '离散数学 '

) );

Page 25: 第 4 章  数据库的查询和视图

执行结果为:XH XM ZYM ZXF061201 王敏 通信工程 42061202 王林 通信工程 40061203 王玉民 通信工程 42061204 马琳琳 通信工程 42061206 李计 通信工程 42061210 李红庆 通信工程 44061216 孙祥欣 通信工程 42061218 孙研 通信工程 42061220 吴薇华 通信工程 42061221 刘燕敏 通信工程 42061241 罗林琳 通信工程 50

Page 26: 第 4 章  数据库的查询和视图

4.2.2 选择行2) 比较子查询这种子查询可以认为是 IN 子查询的扩展,它使表达式的值与子查询的结果进行比较运算,格式为:

expression { < | <= | = | > | >= | != | <> } { ALL | SOME | ANY } ( subquery )其中 expression 为要进行比较的表达式, subquery 是子查询。 ALL 、 SOME 和ANY说明对比较运算的限制。

ALL 指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回 TRUE ,否则返回 FALSE; SOME 或 ANY 表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回 TRUE ,否则返回 FALSE 。

Page 27: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.20】查找比所有计算机系学生年龄都大的学生。

SELECT * FROM XSWHERE CSSJ <ALL( SELECT CSSJ

FROM XS WHERE ZYM= ' 计算机 '

);执行结果如图 4.4 所示。

Page 28: 第 4 章  数据库的查询和视图

图 4.4 查找结果

Page 29: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.21】查找课程号 206 的成绩不低于课程号 101 的最低成绩的学生的学号。

SELECT XH FROM XS_KCWHERE KCH = '206' AND CJ>= ANY ( SELECT CJ

FROM XS_KC WHERE KCH = '101'

);(3) EXISTS 子查询EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS 返回 TRUE ,否则返回 FALSE 。 EXISTS 还可与 NOT 结合使用,即

NOT EXISTS ,其返回值与 EXIST刚好相反。格式为: [ NOT ] EXISTS ( subquery )

Page 30: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.22】查找选修 206 号课程的学生姓名。 SELECT XM FROM XS WHERE EXISTS ( SELECT * FROM XS_KC WHERE XH=XS.XH AND KCH=‘206’

);本例在子查询的条件中使用了限定形式的列名引用 XS.XH ,表示这里的学号列出自表 XS 。

Page 31: 第 4 章  数据库的查询和视图

4.2.2 选择行【例 4.23】查找选修了全部课程的同学的姓名。

SELECT XM FROM XS WHERE NOT EXISTS ( SELECT * FROM KC WHERE NOT EXISTS ( SELECT * FROM XS_KC WHERE XH=XS.XH AND KCH=KC.KCH

) );本例即查找没有一门功课不选修的学生。

Page 32: 第 4 章  数据库的查询和视图

4.2.3 查询对象前面介绍了 SELECT 的选择列和行,这里介绍 SELECT 查询的对象(即数据源)的构成形式。【例 4.24 】查找 001102 号同学所选修的全部课程的同学的学号。本例即要查找这样的学号 y ,对所有的课程号 x ,若 001102 号同学选修了该课,那么 y 也选修了该课。 SELECT DISTINCT XH FROM XS_KC CJ1 WHERE NOT EXISTS ( SELECT * FROM XS_KC CJ2 WHERE CJ2.XH = ‘001102’ AND NOT EXISTS ( SELECT * FROM XS_KC CJ3 WHERE CJ3.XH= CJ1.XH AND CJ3.KCH = CJ2. KCH ) );本例子指定 SELECT 语句查询的对象是表。

Page 33: 第 4 章  数据库的查询和视图

4.2.3 查询对象【例 4.25 】在 XS 表中查找 1986年 1月 1日以前出生的学生的姓名和专业名。 SELECT XM,ZYM FROM (SELECT * FROM XS WHERE CSSJ<TO_DATE(‘19860101’,’YYYYMMDD'));执行结果为:XM ZYM王燕 计算机 林一帆 计算机 张强民 计算机 严红 计算机 王敏 通信工程 王林 通信工程 马琳琳 通信工程 李计 通信工程 李红庆 通信工程 孙祥欣 通信工程 刘燕敏 通信工程

Page 34: 第 4 章  数据库的查询和视图

4.2.4 连接1. 连接谓词可以在 SELECT 语句的 WHERE 子句中使用比较运算符给出连接条件对表进行连接,将这种表示形式称为连接谓词表示形式。【例 4.26 】查找 XSCJ 数据库每个学生的情况以及选修的课程情况。 SELECT XS.* ,XS_KC.* FROM XS , XS_KC WHERE XS.XH=XS_KC.XH;结果表将包含 XS 表和 XS_KC 表的所有列,结果如图 4.5 所示。

Page 35: 第 4 章  数据库的查询和视图

图 4.5 连接后的部分数据

Page 36: 第 4 章  数据库的查询和视图

4.2.4 连接【例 4.27 】自然连接查询。 SELECT XS.* , XS_KC.KCH, XS_KC.CJ FROM XS , XS_KC WHERE XS.XH=XS_KC.XH;本例所得的结果表包含以下字段:学号、姓名、专业名、性别、出生时间、总学分、备注、课程号、成绩。若选择的字段名在各个表中是唯一的,则可以省略字段名前的表名。如本例的 SELECT 子句也可写为: SELECT XS.* , KCH , CJ FROM XS , XS_KC WHERE XS.XH = XS_KC.XH;

Page 37: 第 4 章  数据库的查询和视图

4.2.4 连接【例 4.28 】查找选修了 206课程且成绩在 80 分以上的学生姓名及成绩。 SELECT XM AS 姓名 ,CJ AS 成绩 FROM XS , XS_KC WHERE XS.XH = XS_KC.XH AND KCH = ‘206’ AND CJ >= 80;执行结果为: 姓名 成绩 王燕 81 李方方 80 林一帆 87 张蔚 89有时用户所需要的字段来自两个以上的表,那么就要对两个以上的表进行连接,称之为多表连接。

Page 38: 第 4 章  数据库的查询和视图

4.2.4 连接【例 4.29 】查找选修了“计算机基础”课程且成绩在 80 分以上的学生学号、姓名、课程名及成绩。 SELECT XS.XH, XM, KCM, CJ FROM XS , KC , XS_KC WHERE XS.XH = XS_KC.XH AND KC.KCH = XS_KC. KCH AND KCM = ‘ 计算机基础’ AND CJ >= 80;执行结果为:XH XM KCM CJ001101 王林 计算机基础 80001104 韦严平 计算机基础 90001108 林一帆 计算机基础 85001110 张蔚 计算机基础 95001111 赵琳 计算机基础 91001201 王敏 计算机基础 80001203 王玉民 计算机基础 87001204 马琳琳 计算机基础 91001216 孙祥欣 计算机基础 81001220 吴薇华 计算机基础 82001241 罗林琳 计算机基础 90

Page 39: 第 4 章  数据库的查询和视图

4.2.4 连接2. 以 JOIN 关键字指定的连接PL/SQL扩展了以 JOIN 关键字指定连接的表示方式,使表的连接运算能力有了增强。连接表的格式为: <table_source> <join_type> <table_source> ON <search_condition> | <table_source> CROSS JOIN <table_source> | <joined_table>其中 table_source 为需连接的表, join_type 表示连接类型, ON 用于指定连接条件。 join_type 的格式为: [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] [ <join_hint> ] JOIN其中 INNER 表示内连接, OUTER 表示外连接, join_hint 是连接提示。 CROS

S JOIN 表示交叉连接。因此,以 JOIN 关键字指定的连接有三种类型。

Page 40: 第 4 章  数据库的查询和视图

4.2.4 连接2. 以 JOIN 关键字指定的连接(1) 内连接内连接按照 ON 所指定的连接条件合并两个表,返回满足条件的行。【例 4.30 】查找 XSCJ 数据库每个学生的情况以及选修的课程情况。 SELECT * FROM XS INNER JOIN XS_KC ON XS.XH = XS_KC.XH; 结果表将包含 XS 表和 XS_KC 表的所有字段(不去除重复字段—学号)。若要去除重复的学号字段,可将 SELECT 子句改为: SELECT XS.* , KCH , CJ【例 4.31 】用 FROM 的 JOIN 关键字表达下列查询:查找选修了 206课程且成绩在80 分以上的学生姓名及成绩。 SELECT XM , CJ FROM XS JOIN XS_KC ON XS.XH = XS_KC.XH WHERE KCH = '206' AND CJ>=80;内连接还可以用于多个表的连接。

Page 41: 第 4 章  数据库的查询和视图

4.2.4 连接【例 4.32 】用 FROM 的 JOIN 关键字表达下列查询:查找选修了“计算机基础”课程且成绩在 80 分以上的学生学号、姓名、课程名及成绩。 SELECT XS.XH , XM , KCM , CJ FROM XS JOIN XS_KC JOIN KC ON XS_KC.KCH = KC.KCH ON XS.XH = XS_KC.XH WHERE KCM = ' 计算机基础 ' AND CJ>=80;作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。【例 4.33 】查找不同课程成绩相同的学生的学号、课程号和成绩。 SELECT a.XH,a.KCH,b.KCH,a.CJ FROM XS_KC a JOIN XS_KC b ON a.CJ=b.CJ AND a.XH=b.XH AND a.KCH!=b.KCH;执行结果为: XH KCH KCH CJ001102 102 206 78001102 206 102 78

Page 42: 第 4 章  数据库的查询和视图

4.2.4 连接2. 以 JOIN 关键字指定的连接(2) 外连接外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接包括三种:左外连接( LEFT OUTER JOIN ):结果表中除了包括满足连接条件的行外,还包括左表的所有行;右外连接( RIGHT OUTER JOIN ):结果表中除了包括满足连接条件的行外,还包括右表的所有行;完全外连接( FULL OUTER JOIN ):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。其中的 OUTER 关键字均可省略。

Page 43: 第 4 章  数据库的查询和视图

4.2.4 连接【例 4.34 】查找所有学生情况及他们选修的课程号,若学生未选修任何课,也要包括其情况。 SELECT XS.* , KCH FROM XS LEFT OUTER JOIN XS_KC ON XS.XH = XS_KC.XH;本例执行时,若有学生未选任何课程,则结果表中相应行的课程号字段值为 NULL 。【例 4.35 】查找被选修了的课程的选修情况和所有开设的课程名。 SELECT XS_KC.* , KCM FROM XS_KC RIGHT JOIN KC ON XS_KC.KCH= KC.KCH;本例执行时,若某课程未被选修,则结果表中相应行的学号、课程号和成绩字段值均为 NULL 。注意:外连接只能对两个表进行。

Page 44: 第 4 章  数据库的查询和视图

4.2.4 连接2. 以 JOIN 关键字指定的连接(3) 交叉连接交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每行与第二个表的每一行拼接后形成的表,因此结果表的行数等于两个表行数之积。【例 4.36】列出学生所有可能的选课情况。 SELECT XH, XM, KCH, KCM FROM XS CROSS JOIN KC;注意 : 交叉连接不能有条件,且不能带WHERE 子句。

Page 45: 第 4 章  数据库的查询和视图

4.2.5 汇总1. 统计函数统计函数用于计算表中的数据,返回单个计算结果。下面对常用的几个统计函数加以介绍。( 1 ) SUM 和 AVG函数。 SUM 和 AVG函数分别用于求表达式中所有值项的总和与平均值,语法格式为: SUM / AVG ( [ ALL | DISTINCT ] expression )其中 expression 是常量、列、函数或表达式。 SUM 和 AVG函数只能对数值型数据进行计算。 ALL 表示对所有值进行运算, DISTINCT 表示去除重复值,缺省为ALL 。 SUM / AVG忽略 NULL 值。 【例 4.37 】求选修 101课程的学生的平均成绩。 SELECT AVG(CJ) AS 课程 101 平均成绩 FROM XS_KC WHERE KCH='101';执行结果为:课程 101 平均成绩78

Page 46: 第 4 章  数据库的查询和视图

4.2.5 汇总1. 统计函数( 2 ) MAX 和 MIN函数。 MAX 和 MIN函数分别用于求表达式中所有值项的最大值与最小值,语法格式为:MAX / MIN ( [ ALL | DISTINCT ] expression )其中 expression 是常量、列、函数或表达式,其数据类型可以是数字、字符和时间日期类型。 ALL 表示对所有值进行运算, DISTINCT 表示去除重复值,缺省为ALL 。 MAX/MIN忽略 NULL 值。【例 4.38 】求选修 101课程的学生的最高分和最低分。 SELECT MAX(CJ) AS 课程 101 的最高分 , MIN(CJ) AS 课程 101 的最低分 FROM XS_KC WHERE KCH='101';执行结果为:课程 101 的最高分 课程 101 的最低分 95 62

Page 47: 第 4 章  数据库的查询和视图

4.2.5 汇总1. 统计函数( 3 ) COUNT函数。 COUNT函数用于统计组中满足条件的行数或总行数,格式为: COUNT ( { [ ALL | DISTINCT ] expression } | * )其中 expression 是一个表达式。 ALL 表示对所有值进行运算, DISTINCT 表示去除重复值,缺省为 ALL 。选择 * 时将统计总行数。 COUNT忽略 NULL 值。【例 4.39 】 (1) 求学生的总人数。 SELECT COUNT(*) AS 学生总数 FROM XS;COUNT(*) 不需要任何参数。(2) 求选修了课程的学生总人数。 SELECT COUNT(DISTINCT XH) FROM XS_KC;(3) 统计离散数学课程成绩在 85 分以上的人数。 SELECT COUNT(CJ) AS 离散数学 85 分以上的人数 FROM XS_KC WHERE CJ>=85 AND KCH= ( SELECT KCH FROM KC WHERE KCM= '离散数学 ' );执行结果为:离散数学 85 分以上的人数 2

Page 48: 第 4 章  数据库的查询和视图

4.2.5 汇总2. GROUP BY 子句GROUP BY 子句用于对表或视图中的数据按字段分组,格式为: [ GROUP BY [ ALL ] group_by_expression [,…n]group_by_expression :用于分组的表达式,其中通常包含字段名。指定 ALL将显示所有组。使用 GROUP BY 子句后, SELECT 子句中的列表中只能包含在GROUP BY 中指出的列或在统计函数中指定的列。【例 4.40 】将 XSCJ 数据库中各专业名输出。 SELECT ZYM AS 专业名 FROM XS GROUP BY ZYM;执行结果为:专业名计算机 通信工程

Page 49: 第 4 章  数据库的查询和视图

4.2.5 汇总【例 4.41 】求 XSCJ 数据库中各专业的学生数。 SELECT ZYM AS 专业名 ,COUNT(*) AS 学生数 FROM XS GROUP BY ZYM;执行结果为:专业名 学生数计算机 11通信工程 11【例 4.42 】求被选修的各门课程的平均成绩和选修该课程的人数。 SELECT KCH AS课程号 , AVG(CJ) AS 平均成绩 ,COUNT(XH) AS 选修人数 FROM XS_KC GROUP BY KCH;执行结果为:课程号 平均成绩 选修人数101 78 20102 77 11206 75 11

Page 50: 第 4 章  数据库的查询和视图

4.2.5 汇总3. HAVING 子句使用 GROUP BY 子句和统计函数对数据进行分组后,还可以使用 HAVING 子句对分组数据进行进一步的筛选。例如查找 XSCJ 数据库中平均成绩在 85 分以上的学生,就是在 XS_KC 数据库上按学号分组后筛选出符合平均成绩大于等于 85 的学生。 HAVING 子句的格式为: [ HAVING <search_condition> ] 其中 search_condition 为查询条件,与 WHERE 子句的查询条件类似,并且可以使用统计函数。【例 4.43 】查找 XSCJ 数据库中平均成绩在 85 分以上的学生的学号和平均成绩。 SELECT XH AS 学号 , AVG(CJ) AS 平均成绩 FROM XS_KC GROUP BY XH HAVING AVG(CJ)>=85;执行结果为:学号 平均成绩001110 91001203 87001204 91001241 90

Page 51: 第 4 章  数据库的查询和视图

4.2.5 汇总【例 4.44 】查找选修课程超过 2 门且成绩都在 80 分以上的学生的学号。 SELECT XH AS 学号 FROM XS_KC WHERE CJ>=80 GROUP BY XH HAVING COUNT(*) > 2;查询将 XS_KC 表中成绩大于或等于 80 的记录按学号分组,对每组记录计数,选出记录数大于 2 的各组的学号值形成结果表。【例 4.45 】查找通信工程专业平均成绩在 85 分以上的学生的学号和平均成绩。 SELECT XH AS 学号 ,AVG(CJ) AS 平均成绩 FROM XS_KC WHERE XH IN ( SELECT XH FROM XS WHERE ZYM= ' 通信工程 ' ) GROUP BY XH HAVING AVG(CJ) > =85;

Page 52: 第 4 章  数据库的查询和视图

4.2.6 排序在应用中经常要对查询的结果排序输出,例如学生成绩由高到低排序。在SELECT 语句中,使用 ORDER BY 子句对查询结果进行排序。 ORDER BY子句的格式为: [ ORDER BY { order_by_expression [ ASC | DESC ] } [ ,…n ]其中 order_by_expression 是排序表达式,可以是列名、表达式或一个正整数,当 expression 是一个正整数时,表示按表中的该位置上列排序。关键字 ASC表示升序排列, DESC 表示降序排列,系统默认值为 ASC 。【例 4.46 】将通信工程专业的学生按出生时间先后排序。 SELECT * FROM XS WHERE ZYM= ' 通信工程 ' ORDER BY CSSJ;

Page 53: 第 4 章  数据库的查询和视图

4.2.6 排序【例 4.47 】将计算机专业学生的“计算机基础”课程成绩按降序排列。 SELECT XM AS 姓名 , KCM AS 课程名 , CJ AS 成绩 FROM XS,KC,XS_KC WHERE XS.XH=XS_KC.XH AND XS_KC.KCH= KC.KCH AND KCM= ' 计算机基础 ' AND ZYM= ' 计算机 ' ORDER BY CJ DESC;执行的结果为:姓名 课程名 成绩张蔚 计算机基础 95赵琳 计算机基础 91韦严平 计算机基础 90林一帆 计算机基础 85王林 计算机基础 80李明 计算机基础 78张强民 计算机基础 66李方方 计算机基础 65严红 计算机基础 63王燕 计算机基础 62

Page 54: 第 4 章  数据库的查询和视图

4.2.7 SELECT 语句的 UNION 子句使用 UNION 子句可以将两个或多个 SELECT 查询的结果合并成一个结果集,其格式为:

{ <query specification> | (<query expression> ) } UNION [ A LL ] <query specification> | (<query expression> ) [ UNION [ A LL ] <query specification> | (<query expression> ) […n] ]其中 query specification 和 query expression 都是 SELECT 查询语句。使用 UNION 组合两个查询的结果集的基本规则是: (1) 所有查询中的列数和列的顺序必须相同。(2) 数据类型必须兼容。 关键字 ALL 表示合并的结果中包括所有行,不去除重复行。不使用 ALL 则在合并的结果去除重复行。含有 UNION 的 SELECT 查询也称为联合查询。

Page 55: 第 4 章  数据库的查询和视图

4.2.7 SELECT 语句的 UNION 子句【例 4.48 】设在 XSCJ 数据库中建两个表:数学系学生、外语系学生,表结构与XS 表相同,两个表分别存储数学系和外语系的学生情况,下列语句将这两个表的数据合并到 XS 表中。 SELECT * FROM XS UNION ALL

SELECT * FROM 数学系学生 UNION ALL SELECT * FROM 外语系学生 ;UNION 操作常用于归并数据,例如归并月报表形成年报表,归并各部门数据等。注意 UNION 还可以与 GROUP BY 及 ORDER BY 一起使用,用来对合并所得的结果表进行分组或排序。

Page 56: 第 4 章  数据库的查询和视图

4.3 数据库的视图4.3.1 视图的概念视图是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基表—— Base Table )不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基表。视图可以由以下任意一项组成:(1) 一个基表的任意子集(2) 两个或者两个以上基表的合集(3) 两个或者两个以上基表的交集(4) 对一个或者多个基表运算的结果集合另一个视图的子集

Page 57: 第 4 章  数据库的查询和视图

4.3.1 视图的概念视图一经定义以后,就可以象表一样被查询、修改、删除和更新。使用视图有下列优点:(1) 为用户集中数据,简化用户的数据查询和处理。(2)屏蔽数据库的复杂性。 (3) 简化用户权限的管理。 (4) 便于数据共享。 (5) 可以重新组织数据以便输出到其它应用程序中。

Page 58: 第 4 章  数据库的查询和视图

4.3.2 创建视图1. 用 OEM 创建视图以在 XSCJ 数据库中创建 CS_XS (描述计算机专业学生情况)视图说明创建视图的过程。(1) 在如图 4.6 所示的界面中,选择单击视图进入“视图搜索”界面,如图 4.7 所示。在该界面选择对象类型 , 并可以选择输入方案名称和对象名称 , 单击“开始”按钮,查找满足条件的对象类型,若存在满足条件的对象类型,在结果项可以查找到的对象类型。

图 4.6 Oracle 企业管理器 图 4.7 视图搜索界面

Page 59: 第 4 章  数据库的查询和视图

4.3.2 创建视图1. 用 OEM 创建视图(2) 单击“创建”按钮,进入视图创建界面,如图 4.8 所示。

图 4.8 一般信息选项界面

Page 60: 第 4 章  数据库的查询和视图

4.3.2 创建视图创建界面有三个选项页面:一般信息、选项和对象选项页面。一般信息页面如图4.8 所示,主要定义视图的基本信息,如名称、所属用户方案等。选项(如图 4.

9所示)和对象选项卡(如图 4.10 所示),定义视图的一些高级选项,如视图是否只读、约束条件等。

图 4.9 选项选项界面 图 4.10 对象选项界面

Page 61: 第 4 章  数据库的查询和视图

4.3.2 创建视图1. 用 OEM 创建视图• 一般信息页面:在“名称”文本框输入视图名称 CS_XS;用户方案选 ADMIN;在“查询文本”中输入创建视图的 SQL 语句,如图 4.8 所示的 SQL 语句。如果有同名视图存在,若选中“若存在则替换”复选框,那么将用现在定义的视图代替原有同名的视图;否则系统将提示错误信息“视图已存在”,要求重新命名。在别名文本框可以为视图定义别名。 (4) 选项选项页面:若选中“强制”选项,则指定创建视图而无须考虑视图基表是否存在或包含该视图的方案所有者是否具有权限。只有选中“限制”复选框后才能设置只读或是否具有约束条件。“只读”单选项规定视图中不能执行删除、插入、更新操作,只能检索数据。“带有复选选项”指定在视图中执行插入和更新操作时,必须能使该视图查询可以选择这些数据,但如果视图的查询中包含子查询或该视图是基于其它视图的,这项指定不一定生效。“约束条件”是指定分配给“复选选项”约束条件的名称。 (5) 对象选项页面:该选项页面仅用于对象视图。如果您处理的不是对象视图 , 则可跳过此选项卡。如果想创建对象视图,则要选中“作为对象视图”复选框,选择对象类型,然后选择默认属性或是选择可用属性列表列出的对象属性。(6) 单击“确定”,系统执行创建视图操作完成后返回如图 4.7 所示界面。

Page 62: 第 4 章  数据库的查询和视图

4.3.2 创建视图2. 使用 CREATE VIEW 语句创建视图PL/SQL 中用于创建视图的语句是 CREATE OR REPLACE VIEW 语句。语法格式:

CREATE [ OR REPLACE ] [FORCE | NOFORCE] VIEW [schema.]view_name [ ( column_name [ ,…n ] ) ]

AS select_statement

[WITH CHECK OPTION[CONSTRAINT constraint_name]][WITH READ ONLY]【例 4.49 】创建 CS_KC 视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都要符合专业名为计算机这个条件。

CREATE OR REPLACE VIEW CS_KC AS SELECT XS.XH,KCH,CJ FROM XS,XS_KC WHERE XS.XH=XS_KC.XH AND ZYM= ' 计算机 '

WITH CHECK OPTION;

Page 63: 第 4 章  数据库的查询和视图

4.3.2 创建视图【例 4.50 】创建计算机专业学生的平均成绩视图 CS_KC_AVG ,包括学号(在视图中列名为 num )和平均成绩(在视图中列名为 score_avg )。 CREATE OR REPLACE VIEW CS_KC_AVG(num,score_avg) AS SELECT XH,AVG(CJ) FROM XS_KC GROUP BY XH;

Page 64: 第 4 章  数据库的查询和视图

4.3.3 查询视图1. SELECT 语句查询视图【例 4.51 】查找计算机专业的学生学号和选修的课程号。 SELECT XH,KCH FROM CS_KC;【例 4.52 】查找平均成绩在 80 分以上的学生的学号和平均成绩。本例首先创建学生平均成绩视图 XS_KC_AVG ,包括学号(在视图中列名为num )和平均成绩(在视图中列名为 score_avg )。 CREATE OR REPLACE VIEW XS_KC_AVG ( num,score_avg ) AS SELECT XH,AVG(CJ) FROM XS_KC GROUP BY XH;再对 XS_KC_AVG 视图进行查询。 SELECT * FROM XS_KC_AVG WHERE score_avg>=80;

Page 65: 第 4 章  数据库的查询和视图

4.3.3 查询视图【例 4.52 】查找平均成绩在 80 分以上的学生的学号和平均成绩。执行结果为:num score_avg061110 91061201 80061203 87061204 91061216 81061220 82061241 90

Page 66: 第 4 章  数据库的查询和视图

4.3.4 更新视图通过更新视图(包括插入、修改和删除)数据可以修改基表数据。但并不是所有的视图都可以更新,只有对满足可更新条件的视图,才能进行更新。1. 可更新视图要通过视图更新基表数据,必须保证视图是可更新视图。一个可更新视图满足以下条件:(1)没有使用连接函数、集合运算函数和组函数;(2) 创建视图的 SELECT 语句中没有聚合函数且没有 GROUP BY 、 ONNECT BY 、 START WITH 子句及 DISTINCT 关键字;(3) 创建视图的 SELECT 语句中不包含从基表列通过计算所得的列;(4) 创建视图没有包含只读属性。【例 4.53】在 XSCJ 数据库中使用以下语句创建可更新视图 CS_XS1 。 CREATE OR REPLACE VIEW CS_XS1 AS SELECT * FROM XS WHERE ZYM= ' 计算机 ';

Page 67: 第 4 章  数据库的查询和视图

4.3.4 更新视图2. 插入数据使用 INSERT 语句通过视图向基本表插入数据。【例 4.54 】向 CS_XS1 视图中插入一条记录:( ‘ 001115’ , ‘刘明仪’ , ‘ 计算机’ , 男 ,‘1984-3-2’, 50 , ‘三好学生’ ) INSERT INTO CS_XS1 VALUES('001115', '刘明仪 ',' 计算机 ',’男’ , TO_DATE(‘19840302’,’YYYYMMDD’),50, ‘三好学生’ );使用 SELECT 语句查询 CS_XS1依据的基本表 XS : SELECT * FROM XS;将会看到该表已添加了学号为 001115 的数据行。

Page 68: 第 4 章  数据库的查询和视图

4.3.4 更新视图3. 修改数据使用 UPDATE 语句可以通过视图修改基本表的数据。【例 4.55 】将 CS_XS 视图中所有学生的总学分增加 8 。 UPDATE CS_XS SET 总学分 = 总学分 + 8;该语句实际上是将 CS_XS 视图所依赖的基本表 XS 中所有专业名为“计算机”的记录的总学分字段值在原来基础上增加 8 。若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。【例 4.56 】将 CS_KC 视图中学号为 001101 的学生的 101课程成绩改为 90 。 UPDATE CS_KC SET CJ=90 WHERE XH='001101' AND KCH='101';

Page 69: 第 4 章  数据库的查询和视图

4.3.4 更新视图4. 删除数据使用 DELETE 语句可以通过视图删除基本表的数据。但要注意,对于依赖于多个基本表的视图,不能使用 DELETE 语句。例如,不能通过对 CS_KC 视图执行DELETE 语句而删除与之相关的基本表 XS 及 XS_KC 表的数据。【例 4.57 】删除 CS_XS 中女同学的记录。 DELETE FROM CS_XS WHERE XB=’ 女’ ;

Page 70: 第 4 章  数据库的查询和视图

4.3.5 修改视图的定义修改视图定义可以通过 OEM 的界面进行,也可使用 PL/SQL 语句。1. 通过 OEM 修改视图在如图 4.11 所示的窗口中,在一般信息选项卡中,对视图定义进行修改。在选项和对象选项卡中,修改指定选项或对视图的约束条件等。修改完毕后单击“应用”按钮即可。

图 4.11 修改视图定义

Page 71: 第 4 章  数据库的查询和视图

4.3.5 修改视图的定义2. 使用 SQL 命令修改视图Oracle 提供了 ALTER VIEW 语句,但它不是用于修改视图定义,只是用于重新编译或验证现有视图。 【例 4.58 】修改视图 CS_KC 的定义,包括学号、姓名、选修的课程号、课程名和成绩。

CREATE OR REPLACE FORCE VIEW CS_KCASSELECT XS.XH, XS.XM, XS_KC.KCH, KC.KCM, CJ FROM XS, XS_KC, KC WHERE XS.XH=XS_KC.XH AND XS_KC.KCH=KC.KCH

AND ZYM=’ 通信工程’ WITH CHECK OPTION;

Page 72: 第 4 章  数据库的查询和视图

4.3.6 删除视图如果不再需要视图了,可以通过 OEM 和 PL/SQL 语句两种方式,把视图的定义从数据库中删除。删除一个视图,就是删除其定义和赋予的全部权限。 在如图 4.12界面中,选中要删除的视图,单击“删除”,出现确认界面,单击“是”按钮即可删除所选择的视图。

图 4.12 删除视图

Page 73: 第 4 章  数据库的查询和视图

4.3.6 删除视图删除视图的 PL/SQL 语句是 DROP VIEW ,格式为:

DROP VIEW [schema.]view_name其中 schema 是所要删除视图的用户方案; view_name 是视图名。例如:DROP VIEW CS_KC;将删除视图 CS_KC 。

Page 74: 第 4 章  数据库的查询和视图

4.4 格式化输出结果4.4.1 替换变量在 SQL*Plus环境中,可以使用替换变量来临时存储有关的数据。 Oracle 使用 3种类型的替换变量。1. & 替换变量在 SELECT 语句中,如果某个变量前面使用了 & 符号,那么表示该变量是一个替换变量。在执行 SELECT 语句时,系统会提示用户为该变量提供一个具体的值。【例 4.59 】查询 XSCJ 数据库 XS 表计算机专业的同学情况。

SELECT XH AS 学号 , XM AS 姓名FROM XSWHERE ZYM=&specialty_name;

Page 75: 第 4 章  数据库的查询和视图

4.4.1 替换变量1. & 替换变量【例 4.60 】查找平均成绩在 80 分以上的学生的学号、姓名和平均成绩。 SET VERIFY ON SELECT *

FROM XS_KC_AVG WHERE score_avg>=score_avg;执行过程为:输入 score_avg 的值: 80原值 3 : WHERE score_avg>=score_avg新值 3 : WHERE score_avg>=80替换变量不仅仅可以用在 WHERE 子句中,而且还可以用在下列部分:(1) ORDER BY 子句。(2) 列表达式。(3) 表名。(4)整个 SELECT 语句

Page 76: 第 4 章  数据库的查询和视图

4.4.1 替换变量1. & 替换变量【例 4.61 】查找选修了“离散数学”课程的学生学号、姓名、课程名及成绩。

SELECT XS.XH, &name, KCM, &column FROM XS, &kc, XS_KC WHERE XS.XH=XS_KC.XH AND &condition AND KCM=&kcm

ORDER BY & column;执行过程及结果为:输入 name 的值: XM输入 column 的值: CJ原值 1 : SELECT XS.XH,&name,KCM,&column新值 1 : SELECT XS.XH,XM,KCM,CJ原值 2 : FROM XS,&kc,XS_KC新值 2 : FROM XS,kc,XS_KC输入 condition 的值: KC.KCH=XS_KC.KCH输入 kcm 的值: ‘离散数学’原值 3 : WHERE XS.XH=XS_KC.XH AND &condition AND KCM=&kcm新值 3 : WHERE XS.XH=XS_KC.XH AND KC.KCH=XS_KC.KCH AND KCM=’离散数学’

Page 77: 第 4 章  数据库的查询和视图

4.4.1 替换变量输入 column 的值 : CJ原值 4 : ORDER BY &column新值 4 : ORDER BY CJXH XM KCM CJ061113 严红 离散数学 60061104 韦严平 离散数学 65061107 李明 离散数学 68061109 张强民 离散数学 70061101 王林 离散数学 71061111 赵琳 离散数学 76061102 程明 离散数学 78061106 李方方 离散数学 80061103 王燕 离散数学 81061108 林一帆 离散数学 87061110 张蔚 离散数学 89

Page 78: 第 4 章  数据库的查询和视图

4.4.1 替换变量2. && 替换变量在 SELECT 语句中,如果希望重新使用某个变量并且不希望重新提示输入该值,可以使用 &&替换变量。在上述例子中,包含了一个变量 &column ,这个变量出现了两次,如果只是使用“&” 符号来定义替换变量,那么系统会提示用户输入两次该变量。在此,为该变量提供了列名 CJ 。【例 4.62 】查找选修了“离散数学”课程的学生学号、姓名、课程名及成绩。执行过程和结果为:输入 name 的值: XM输入 column 的值: CJ原值 1 : SELECT XS.XH,&name,KCM,&column新值 1 : SELECT XS.XH, XM, KCM, CJ原值 2 : FROM XS,&kc,XS_KC新值 2 : FROM XS,kc,XS_KC输入 condition 的值: KC.KCH=XS_KC.KCH输入 kcm 的值: '离散数学 '原值 3 : WHERE XS.XH=XS_KC.XH AND &condition AND KCM=&kcm新值 3 : WHERE XS.XH=XS_KC.XH AND KC.KCH=XS_KC.KCH AND KCM='离散数学 '

Page 79: 第 4 章  数据库的查询和视图

4.4.1 替换变量输入 column 的值 : NAME原值 4 : ORDER BY &column新值 4 : ORDER BY NAMEXH XM KCM CJ061102 程明 离散数学 78061106 李方方 离散数学 80061107 李明 离散数学 68061108 林一帆 离散数学 87061101 王林 离散数学 71061103 王燕 离散数学 81061104 韦严平 离散数学 65061113 严红 离散数学 60061109 张强民 离散数学 70061110 张蔚 离散数学 89061111 赵琳 离散数学 76

Page 80: 第 4 章  数据库的查询和视图

4.4.1 替换变量【例 4.63 】查询选修课程超过 2 门且成绩在 75 分以上的学生的学号。

SELECT &&column FROM XS_KC WHERE CJ>=75 GROUP BY &column

HAVING COUNT(*)>2;执行过程:输入 column 的值: XH原值 1 : SELECT &&column新值 1 : SELECT XH原值 4 : GROUP BY &column新值 4 : GROUP BY XH

Page 81: 第 4 章  数据库的查询和视图

4.4.1 替换变量3. DEFINE 和 ACCEPT 命令为了在 PL/SQL 语句中定义变量,可以使用 DEFINE 和 ACCEPT命令。DEFINE命令用来创建一个数据类型为 CHAR 用户定义的变量。相反地,使用UNDEFINE命令可以清除定义的变量。语法格式:

DEFINE [variable[=value]]其中,如果不带任何参数,直接使用 DEFINE命令,则显示所有用户定义的变量。 variable 是变量名, value 是变量的值。 DEFINE value 是显示指定变量的值和数据类型。 DEFINE variable=value 是创建一个 CHAR类型的用户变量,且为该变量赋初值。

Page 82: 第 4 章  数据库的查询和视图

4.4.1 替换变量【例 4.64 】定义一个变量 specialty ,并为它赋值“通信工程”。然后,显示该变量信息。

DEFINE specialty= 通信工程DEFINE specialty显示结果为:DEFINE SPECIALTY = " 通信工程 " (CHAR)【例 4.65 】查询专业为通信工程的学生情况,引用上例中定义的变量 specialty 。SELECT XH, XM, XB, CSSJ, ZXF FROM XS WHERE ZYM=’&specialty’;

Page 83: 第 4 章  数据库的查询和视图

4.4.1 替换变量3. DEFINE 和 ACCEPT 命令使用 ACCEPT命令可以定制一个用户提示,用来提示用户收入指定的数据。在使用 ACCEPT 定义变量时,可以明确地指定该变量是 NUMBER 数据类型还是 DAT

E数据类型。为了安全性,还可以把用户的输入隐藏。语法格式: ACCEPT variable [datatype] [FORMAT format][PROMPT text] [HIDE]其中:

variable :指定接收值的变量。如果该名称的变量不存在,那么 SQL*Plus 自动创建该变量。 datatype 为变量数据类型,可以是 NUMBER 、 CHAR 和 DATE 。默认的数据类型为 CHAR 。FORMAT :定义由 fromat 指定的格式模式。PROMPT :指定由 text确定的在用户输入数据之前显示的提示文本。HIDE 指定是否隐藏用户的输入。

Page 84: 第 4 章  数据库的查询和视图

4.4.1 替换变量【例 4.66 】使用 ACCEPT 定义一个变量 num ,且指定提示文本。根据这个变量的值查询选修该课程的学生学号、课程名和成绩情况。

ACCEPT num PROMPT ‘请输入课程号:’请输入课程号: 101

SELECT XH, KCM,CJFROM XS_KC, KC

WHERE XS_KC.KCH=KC.KCH AND KC.KCH=’&num’ORDER BY CJ;

原值 3 : WHERE XS_KC.KCH=KC.KCH AND KC.KCH=’&num’新值 3 : XS_KC.KCH=KC.KCH AND KC.KCH=’101’

Page 85: 第 4 章  数据库的查询和视图

XH KCM CJ061103 计算机基础 61061113 计算机基础 63061106 计算机基础 65061202 计算机基础 65061109 计算机基础 66061218 计算机基础 70061210 计算机基础 76061221 计算机基础 76061107 计算机基础 78061101 计算机基础 80061201 计算机基础 80061216 计算机基础 81061220 计算机基础 82061108 计算机基础 85061203 计算机基础 87061104 计算机基础 90061241 计算机基础 90061111 计算机基础 91061204 计算机基础 91061110 计算机基础 95

【例 4.66 】

Page 86: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境在 SQL*Plus 中,有许多参数可控制 SQL*PLus 的输出显示格式。利用 SQL*Plus命令 sh

ow all ,用户能知道当前显示格式的设置。该命令的输出格式大致如下:• appinfo 为 OFF 并且已设置为” SQL*Plus”• arraysize 15• autocommit OFF• autoprint OFF• autorecovery OFF• autotrace OFF• blockterminator “.” (hex 2e)• btitle OFF and 为下一条 SELECT 语句的前几个字符• cmdsep “ “OFF• closep “ “• compatibility version NATIVE• concat “.” (hex 2e)• copycommit 0• COPYTYPECHECK 为 ON• define "&" (hex 26)• describe DEPTH 1 LINENUM OFF INDENT ON• markup HTML OFF SPOOL OFF ENTMAP ON PREFORMAT OFF• echo OFF• editfile "afiedt.buf"• embedded OFF• escape OFF

Page 87: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境• 用于 6 或更多行的 FEEDBACK ON• flagger OFF• flush ON• heading ON• headsep "|" (hex 7c)• instance "local"• linesize 80• lno 15• loboffset 1• logsource ""• long 80• longchunksize 80• newpage 1• null ""• numformat ""• numwidth 10• pagesize 14• PAUSE 为 OFF• pno 2• recsep WRAP• recsepchar " " (hex 20)• release 900010101• repfooter OFF and 为 NULL• repheader OFF and 为 NULL

Page 88: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境• serveroutput OFF• shiftinout INVISIBLE• showmode OFF• spool OFF• sqlblanklines OFF• sqlcase MIXED• sqlcode 0• sqlcontinue "> "• sqlnumber ON• sqlpluscompatibility 8.1.7• sqlprefix "#" (hex 23)• sqlprompt "SQL> "• sqlterminator ";" (hex 3b)• suffix "sql"• tab ON• termout ON• time OFF• timing OFF• trimout ON• trimspool OFF• ttitle OFF and 为下一条 SELECT 语句的前几个字符• underline "-" (hex 2d)• USER 为 "ADMIN"• verify ON• wrap : 行将为已换行

Page 89: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境用户可以设置其中很多参数来改变当前工作环境。使用 SET命令可以控制当前环境的设置。语法格式:

SET system_variable value说明: system_variable变量用来控制当前环境, system_variable 包括上面用SHOW ALL命令输出的所有显示格式参数。 value 为该系统变量的值。下面介绍更改其中一些主要参数。1. 页和行的大小命令 SET LINESIZE 指定页宽是多少,最常用的设置为 80 和 132 。例如,设置行宽为 50 ,设置页的长度为 30 。命令如下:

SET LINESIZE 50SET PAGESIZE 30

2. 页头标可用 TTITLE命令设置每页的标题。 TTITLE命令包括许多参数。通常使用的缺省设置为:标题文本在行中央,每页上都有日期和页号。如果需要两行头标,则需要使用竖字符 ( | ) 。例如:在报表居中放置文本“选修计算机基础课程”为第一个头标行,文本“学生成绩报表”居中放置在第二行。 TTITLE ‘ 选修计算机基础课程∣学生成绩报表’

Page 90: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境3. 页脚标可用 BTITLE命令在每页的底部指定一些信息。建议用户将程序名放在这里。如果用户需要修改一个报表时,只要指定页底部的程序名,就可知道修改哪个报表,这有助于避免混淆。例如,下列命令指定报表的页脚标为’ ---report1.sql---’ 。

BTITLE ‘---report1.sql---’ RIGHT用户可以使用 LEFT 或 RIGHT 关键字将文字放到相应的位置。如果 BTITLE命令中没有使用定位关键字, Oracle 将文本置于底行中央。【例 4.67 】利用上述几个例子,生成报表 report1 ,查看选修了“计算机基础”课程的学生学号、姓名、课程名和成绩。 SELECT XS.XH, XM, KCM, CJ

FROM XS JOIN XS_KC JOIN KC ON XS_KC.KCH=KC.KCH ON XS.XH=XS_KC.XH

WHERE KCM=’ 计算机基础’ ;

Page 91: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境上述几个例子的设置及结果如图 4.18 所示。

图 4.18 选修计算机基础的成绩报表

Page 92: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境4. 格式化输出表列使用 COLUMN命令可以格式化实际的表列数据,以满足用户的不同需求。例如,下列命令设置表 EMPLOYEES 的 FIRST_NAME 和 LAST_NAME 列的格式。

COLUMN FIRST_NAME FORMAT a8 WRAP HEADING ‘First Name’∣COLUMN LAST_NAME FORMAT a8 HEADING ‘Last Name’∣按照上面介绍的方法,设置指定页头标、页脚标等,然后执行如下语句:

SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, PHONE_NUMBER, SALARY FROM HR.EMPLOYEES

WHERE DEPARTMENT_ID=80;输出的结果如下图所示 (部分结果 ) 。

Page 93: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境4. 格式化输出表列

图 4.19 两表列格式化的输出

Page 94: 第 4 章  数据库的查询和视图

4.4.2 定制 SQL*Plus 环境4. 格式化输出表列FORMAT 子句可规定用于显示每个数值的位数,并指明在何处插入逗号。例如: COLUMN salary FORMAT 999,999,999,999.00 HEADING 'Salary'使用该语句后,指定显示 12 位数字, 2 位小数,用逗号作分隔符。(1) 断开逻辑 (Break Logic)在 SQL*Plus 中,增加断开逻辑的方法很简单,只要执行 BREAK命令, SQL*Plu

s就会管理所有的断开逻辑。执行断开命令 BREAK ON DEPARTMENT_ID 。(2) 断开和跳过 (Break and Skip)通常,实现断开逻辑后,用户会希望在出现新的断开列值前空几行,这时就需要用到 SKIP命令。(3) 使用 COMPUTE命令。利用 COMPUTE SUM命令,可以让 SQL*Plus 计算所需的和。