1 简述视图的意义

参考答案

视图的意义在于两个方面:

1)简化复杂查询。如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可。

2)限制数据访问。视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到安全和保密的作用。

2 创建一个视图v_emp_salesman,内容是所有职位是SALESMAN的员工

参考答案

创建视图v_emp_salesman的SQL语句如下所示:

create or replace view v_emp_salesman
as
select empno, ename, sal, deptno from emp
where job = 'SALESMAN';

3 下列语句运行的结果是

insert into v_emp_salesman values(1234, ‘tina’, 3500, 20);

参考答案

上述SQL语句的运行结果为:基表emp增加了一条记录,但是这条记录在视图中无法查询到。因为新增记录的职位不是salesman,不在视图可见范围内。

4 下列关于视图说法正确的是

A.对复杂视图可以执行插入数据操作

B.为了禁止在视图上执行DML操作,可以在建立视图时设置READ ONLY约束

C.CHECK OPTION约束表示,通过视图所做的修改,必须在视图的可见范围内

D.对视图的操作,最终都会转化成对基本表的操作

参考答案

本题的正确答案为BCD。

选项A说法不正确,复杂视图不允许DML操作。

5 创建一个视图v_mgr_salary,列出每个主管的名字,以及他的下属中的最高薪水和最低薪水。

视图中数据显示的形式如图-1所示。

图-1

参考答案

创建视图v_mgr_salary的SQL语句如下所示:

createorreplaceviewv_mgr_salary
as
selectm.ename, max(w.sal) max_sal, min(w.sal) min_sal
fromempwjoinempm
onw.mgr = m.empno
groupbym.ename;

6 关于序列的说法,下列正确的是

A.序列是Oracle提供的可用于产生一系列唯一数字的数据库对象。

B.通常情况下,一个序列为一张表提供主键值,但一个序列也可以为多个表提供主键值。

C.使用序列时,伪列NEXTVAL返回序列生成的下一个值。

D.任何时候都可以使用伪列CURRVAL返回当前序列值。

参考答案

本题的正确答案为ABC。

本题中D选项说法不正确,当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRVAL。

7 创建序列stu_seq,然后,对student表进行插入,插入数据时,使用该序列生成主键

有学员表student,表结构如表-1所示:

表-1学员表student信息

1. 创建一个序列stu_seq,初始值是1000,步进是2。

2. 构造SQL语句,向student数据表中插入一条记录,其信息如下:学号使用上一步创建的序列生成,学生姓名为张无忌,生日为1987-11-17,总成绩为639分。

参考答案

各练习的参考答案如下所示:

1.

 create sequence stu_seq start with 1000 increment by 2;

2.首先创建student表,创建该表的SQL语句如下所示:

create table student(
 id NUMBER(4) primary key,
 nameVARCHAR2(20) not null,
 birthday	DATE,
 scoreNUMBER(9,2)
);

然后使用序列stu_seq为student表的id列生成数据,并执行插入操作,SQL语句如下所示:

insert into student(id, name, birthday, score)
 values(stu_seq.nextval,'张无忌',to_date('1987-11-17','yyyy-mm-dd'), 639);

8 简述索引的原理及创建索引的意义

参考答案

索引是对表的一列或多列进行排序的结构。因为绝大多数的搜索方法在搜索排序结构时效率都会大大提高,所以如果表中某一列经常被作为关键字搜索,则建议对此列创建索引。

索引提供指针以指向存储在表中指定列的数据值,根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似:通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。

9 需要经常在emp表的ename列上执行大小写无关搜索,在此列上建立一个基于UPPER函数的索引

参考答案

创建索引的SQL语句如下所示:

CREATEINDEXemp_ename_upper_idx
ONemp(UPPER(ename));

10 列举需要创建索引以及不适合创建索引的场合

参考答案

适合创建索引的场合为:

1)为经常出现在WHERE子句中的列创建索引。

2)为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致。

3)为经常作为表的连接条件的列上创建索引

不适合创建索引的场合为:

1)不要在经常做DML操作的表上建立索引。

2)不要在小表上建立索引。

3)限制表上的索引数目,索引并不是越多越好。

11 简述主键选取的原则

参考答案

主键的选取原则如下:

1)主键应是对系统无意义的数据。

2)永远也不要更新主键,让主键除了唯一标识一行之外,再无其他的用途。

3)主键不应包含动态变化的数据,如时间戳。

4)主键应自动生成,不要人为干预,以免使它带有除了唯一标识一行以外的意义。

5)主键尽量建立在单列上。

12 已知student表、course表和sc表,为sc表添加外键约束

已知学生表student,该表两个字段学号(id)、姓名(name),其中id列为主键列,创建该表的SQL语句如下所示:

create table student(
  id number(10) primary key,
  name varchar2(20)
 );

有课程表course ,该表有两个字段编号(id)、课程名称(name),其中id列为主键列,创建该表的SQL语句如下所示:

create table course(
 id number(10) primary key,
 name varchar2(20)
);

有选课表sc,该表有三个字段学号(sid)、课程编号(cid)、成绩(score),创建该表的SQL语句如下所示:

create table sc( 
 sid number(10), 
 cid number(10), 
 score number(5,2)
);

本案例要求建立下列外键关联关系:

1.sc表的学号列(sid),外键关联学生表(student)的学号列(id)。

2.sc表的课程编号列(cid),外键关联课程表(course)的编号列(id)。

请写出建立上述关联关系的SQL语句。

参考答案

修改表建立外键关联关系的SQL语句如下所示:

1.

alter table sc add constraint sc_sid_student_fk FOREIGN KEY (sid) references student(id);

2.

alter table sc add constraint sc_cid_student_fk FOREIGN KEY (cid) references course(id);

13 简述外键约束的意义

参考答案

外键约束维护数据的一致性。外键约束条件包括两个方面的数据约束:

1)从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL。

2)当主表参照列的值被从表参照时,主表的该行记录不允许被删除。

14 简述外键约束对性能的影响,以及应对策略

参考答案

如果在一个频繁DML操作的表上建立外键,每次DML操作,都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去;外键确定了主从表的先后生成关系,有时会影响业务逻辑。