1、事务是什么?A:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
2、oracle中truncate和delete命令有何区别?A:
(1)delete将在回滚段中产生回滚信息,truncate不产生,因此无论表中的记录多少,truncate执行都很快。
(2)truncate 是 DDL,执行隐含的commit,truncate不能回滚。任何没有提交的 DML 改变也将会和truncate一起提交。
(3)truncate 重置表及其索引高水位标志。全表扫描和索引快速全扫描读高水位标志下的所有数据块,因此在delete后全扫描性能没有提高,但truncate后将会变快。
(4)truncate 不触发 delete 触发器。
(5)没有对象权限允许一个用户 truncate 另一个用户的表。这样做需要 DROP ANY TABLE 系统权限。
(6)当一个表被 truncate,表及其索引的存储将被重置回初始大小。而 delete 不收缩表及其索引的大小。
(7)当父表有一个可用的引用完整性约束时不能被 truncate。必须先disable引用父表的外键约束,再truncate。
3、Oracle中char和varchar2数据类型有什么区别?有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型有何区别?A:char是定长字符类型,varchar2是变长字符类型。“test”在char(10)中被补齐空格,存储长度是10字节,在varchar2(10)中存储长度是4字节。
4、参见如下表结构
出版社:
出版社代码 char(2),
出版社名称 varchar2(32)
图书:
图书编号 char(8),
图书名称 varchar2(128),
出版社代码 char(2),
作者代号 char(4),
图书简介 varchar2(128)
作者:
作者代号 char(4),
作者名称 varchar2(10),
性别 char(1),
年龄 number(3),
文学方向 varchar2(64)
获奖名单:
获奖日期 date,
获奖人员 char(4)
编写SQL语句,找出“作者”库中没有出现在“获奖名单”库中所有作者信息的SQL语句(提示:使用not in、not exists以及外关联三种方法,并说明哪种方法最优)。A:select * from 作者 where 作者代号 not in (select 获奖人员 from 获奖名单);
select * from 作者 where not exists (select 1 from 获奖名单 where 作者.作者代号 = 获奖名单.获奖人员);
select * from 作者 left join 获奖名单 on 作者.作者代号 = 获奖名单.获奖人员 where 获奖名单.获奖人员 is null;
外关联的性能好于not exists,not exists 好于 not in。
5、Oracle数据库表存在伪列rowid,请利用rowid编写一个SQL语句,从以下记录中找到唯一记录,并将其flag列更新为Y
No name sex flag
1 张三 1 N
1 张三 1 N
1 张三 1 N
A:
update t set flag = 'Y' where rowid = (select min(rowid) from t t2 where t.no = t2.no and t.name = t2.name and t.sex = t2.sex);
6、Oracle中,需要在查询语句中把空值(NULL)输出为0,如何处理?A: select nvl(c1,0) from t1;
7、见第四题“获奖名单”表,写出SQL语句,查询出在上一个月获奖的人员。A:
select * from 作者 join 获奖名单 on 作者.作者代号 = 获奖名单.获奖人员 where to_char(获奖名单.获奖日期,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm');
8、见第四题“图书”表,在表上对图书名称、出版社代码、作者代号创建了组合索引,请问在执行如下语句时会不会利用到索引。Select * from 图书 where 图书名称=’xxxx’
Select * from 图书 where 图书名称=’xxxx’ and 出版社代码=’bb’
Select * from 图书 where 图书名称=’xxxx’ and 作者代号=’ddd’
Select * from 图书 where 出版社代码=’yyy’A:
根据索引的“最左前缀”原理,前三个查询会利用索引,最后一个不会。
9、编写一个简单的Oracle存储过程,输出参数必须有一个是结果集。A:
CREATE OR REPLACE package pkg_getrecord is
TYPE myrctype IS REF CURSOR;
end pkg_getrecord;
/
CREATE OR REPLACE PROCEDURE p_ret_rs (r_cursor OUT pkg_getrecord.myrctype)
IS
BEGIN
OPEN r_cursor FOR SELECT * FROM t;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
RAISE;
END p_ret_rs;
/
2、oracle中truncate和delete命令有何区别?A:
(1)delete将在回滚段中产生回滚信息,truncate不产生,因此无论表中的记录多少,truncate执行都很快。
(2)truncate 是 DDL,执行隐含的commit,truncate不能回滚。任何没有提交的 DML 改变也将会和truncate一起提交。
(3)truncate 重置表及其索引高水位标志。全表扫描和索引快速全扫描读高水位标志下的所有数据块,因此在delete后全扫描性能没有提高,但truncate后将会变快。
(4)truncate 不触发 delete 触发器。
(5)没有对象权限允许一个用户 truncate 另一个用户的表。这样做需要 DROP ANY TABLE 系统权限。
(6)当一个表被 truncate,表及其索引的存储将被重置回初始大小。而 delete 不收缩表及其索引的大小。
(7)当父表有一个可用的引用完整性约束时不能被 truncate。必须先disable引用父表的外键约束,再truncate。
3、Oracle中char和varchar2数据类型有什么区别?有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型有何区别?A:char是定长字符类型,varchar2是变长字符类型。“test”在char(10)中被补齐空格,存储长度是10字节,在varchar2(10)中存储长度是4字节。
4、参见如下表结构
出版社:
出版社代码 char(2),
出版社名称 varchar2(32)
图书:
图书编号 char(8),
图书名称 varchar2(128),
出版社代码 char(2),
作者代号 char(4),
图书简介 varchar2(128)
作者:
作者代号 char(4),
作者名称 varchar2(10),
性别 char(1),
年龄 number(3),
文学方向 varchar2(64)
获奖名单:
获奖日期 date,
获奖人员 char(4)
编写SQL语句,找出“作者”库中没有出现在“获奖名单”库中所有作者信息的SQL语句(提示:使用not in、not exists以及外关联三种方法,并说明哪种方法最优)。A:select * from 作者 where 作者代号 not in (select 获奖人员 from 获奖名单);
select * from 作者 where not exists (select 1 from 获奖名单 where 作者.作者代号 = 获奖名单.获奖人员);
select * from 作者 left join 获奖名单 on 作者.作者代号 = 获奖名单.获奖人员 where 获奖名单.获奖人员 is null;
外关联的性能好于not exists,not exists 好于 not in。
5、Oracle数据库表存在伪列rowid,请利用rowid编写一个SQL语句,从以下记录中找到唯一记录,并将其flag列更新为Y
No name sex flag
1 张三 1 N
1 张三 1 N
1 张三 1 N
A:
update t set flag = 'Y' where rowid = (select min(rowid) from t t2 where t.no = t2.no and t.name = t2.name and t.sex = t2.sex);
6、Oracle中,需要在查询语句中把空值(NULL)输出为0,如何处理?A: select nvl(c1,0) from t1;
7、见第四题“获奖名单”表,写出SQL语句,查询出在上一个月获奖的人员。A:
select * from 作者 join 获奖名单 on 作者.作者代号 = 获奖名单.获奖人员 where to_char(获奖名单.获奖日期,'yyyy-mm') = to_char(add_months(sysdate,-1),'yyyy-mm');
8、见第四题“图书”表,在表上对图书名称、出版社代码、作者代号创建了组合索引,请问在执行如下语句时会不会利用到索引。Select * from 图书 where 图书名称=’xxxx’
Select * from 图书 where 图书名称=’xxxx’ and 出版社代码=’bb’
Select * from 图书 where 图书名称=’xxxx’ and 作者代号=’ddd’
Select * from 图书 where 出版社代码=’yyy’A:
根据索引的“最左前缀”原理,前三个查询会利用索引,最后一个不会。
9、编写一个简单的Oracle存储过程,输出参数必须有一个是结果集。A:
CREATE OR REPLACE package pkg_getrecord is
TYPE myrctype IS REF CURSOR;
end pkg_getrecord;
/
CREATE OR REPLACE PROCEDURE p_ret_rs (r_cursor OUT pkg_getrecord.myrctype)
IS
BEGIN
OPEN r_cursor FOR SELECT * FROM t;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
RAISE;
END p_ret_rs;
/