经典sql-高级-实验三

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三、

1.建立一个表(表名自定),表结构与EMP相同,没有任何记录。

create table my_emp as select * from emp;

2.用Insert语句输入5条记录,并提交。

3.扩大该表的记录数到约40条,并使雇员号不重复;每个雇员都有所属部门,雇员在同一部门的经理是同一人。

insert….

update…

commit

4.建立一个与DEPT表结构和记录完全相同的新表,并与前项新表建立参照完整性约束。

alter table my_dept add( constraint s1 primary key(deptno));

alter table my_emp add(constraint s2 foreign key(deptno) references dept(deptno));

5.对在‘NEW YORK’工作的雇员加工资,每人加200。

6. *如果雇员姓名与部门名称中有一个或一个以上相同的字母,则该雇员的COMM增加500。

update my_emp a

set comm=NVL(comm,0)+500

where a.ename<>(

select translate(a.ename,b.dname,CHR(27))

from my_dept b where b.deptno=a.deptno

);

--a.deptno与b.deptno必须有主外键连接,否则可能出错,为什么?commit;

7.删除部门号为30的记录,并删除该部门的所有成员。

delete from emp where deptno=30;

delete from dept where deptno=30;

commit

8.新增列性别SEX,字符型。

alter table emp add(sex char(2));

9.修改新雇员表中的MGR列,为字符型。

该列数据必须为空

alter table emp modify(mgr varchar2(20));

10.试着去删除新表中的一个列。

alter table my_emp drop (comm);

实验四、

1.查询部门号为30的所有人员的管理层次图。

select level,ename from emp

connect by mgr=prior empno

start with deptno=30and job='MANAGER';

2.查询员工SMITH的各个层次领导。

select level,ename from emp

connect by prior mgr= empno

start with ENAME='SMITH';

3.查询显示EMP表各雇员的工作类型,并翻译为中文显示

用decode函数

4. *查询显示雇员进入公司当年是什么属相年(不考虑农历的年份算法)用decode函数

5.建立一个视图myV_emp,视图包括myEMP表的empno、ename、sal,并按sal 从大到小排列。

create view myV_EMP as select empno,ename,sal from emp;

6.定义一个mySeq,对select mySeq.nextval,my_emp.* from my_emp的执行结果进行说明。

7.定义序列mySeq、myEMP、myV_emp的同义词,能否用同义词对上述对象进行访问。

8.在myEMP表中建立ename的唯一性索引。

9.如何在sql*plus中,运行sql的脚本(即后缀为.sql的文件)

实验五、

1.观察下列PL/SQL的执行结果

declare

s emp%rowtype;

begin

select * into s

from emp

where ename='KING';

DBMS_OUTPUT.PUT_LINE(s.empno||s.ename||s.job||s.sal);

END;

2.编写一个PL/SQL,显示ASC码值从32至120的字符。

begin

for i in32..120

loop

dbms_output.put_line(chr(i));

end loop;

end;

3.计算myEMP表中COMM最高与最低的差值,COMM值为空时按0计算。declare

var1 number;

var2 number;

val_comm number;

begin

select max(nvl(comm,0)) into var1 from myemp;

select min(nvl(comm,0)) into var2 from myemp;

val_comm:=var1-var2;

dbms_output.put_line(val_comm);

end;

4.根据表myEMP中deptno字段的值,为姓名为‘JONES’的雇员修改工资;若部门号为10,则工资加100;部门号为20,加200;其他部门加400。

declare

c1 number;

c2 number;

begin

select deptno into c1 from emp where ename=’JONES’;

if c1=10then

c2:=100;

elsif c1=20then

c2:=200;

else c2:=400;

end if;

update emp set sal=sal+c2 where ename=’JONES’;

commit;

end;

5.计算显示部门人数最多的部门号、人数、工资总和,以及部门人数最少的部门号、人数、工资总和。

6.计算myEMP中所有雇员的所得税总和。假设所得税为累进税率,所得税算法为:工资收入为0-1000为免税;收入1000-2000者,超过1000的部分税率10%;2000-3000者超过2000部分按20%税率计算;3000-4000者超过3000部分按30%税率计算;4000以上收入,超过4000部分按40%税率计算。(请查阅累进税率的概念)

declare

sum_xx number:=0;

xx number;

begin

--计算收入为1000-2000的所得税总额

select sum((sal-1000)*0.1) into xx from emp where sal >1000and sal<=2000; sum_xx:=sum_xx+xx;

--计算收入为2000-3000的所得税总额

select sum((sal-2000)*0.2+100) into xx from emp where sal >2000and sal<=3000;

sum_xx:=sum_xx+xx;

相关文档
最新文档