您的位置:首页 > 其它

第十一章数据操作与事务控制课后练习和作业

2018-08-02 14:36 405 查看

– 练习

  • 练习一

    --  1.向部门表新增一个部门,部门编号为50,部门名称为HR,工作地点为SY。
    insert into dept values(50,'HR','SY');
    select * from dept;
    
    --  2.向部门表新增一个部门,部门编号为60,部门名称为MARKET。
    insert into dept values(60,'MARKET','');
  • 练习二

    --  1.向员工表中新增一个员工,员工编号为8888,姓名为BOB,岗位为CLERK,
    ->  经理为号7788,入职日期为1985-03-03,薪资3000,奖金和部门为空。
    insert into emp
    (empno, ename, job, mgr, hiredate, sal, comm, deptno)
    values
    (8888,
    'BOB',
    'CLERK',
    7788,
    to_date('1985-03-03', 'yyyy-mm-dd'),
    3000,
    null,
    null);
    
    select * from emp;
  • 练习三

    --  1.使用CREATE TABLE emp_back as
    --  SELECT * FROM EMP WHERE 1=0,创建emp_back表,拷贝下来即可。
    create table emp_back as select * from emp where 0 = 1;
    
    --  2.把emp表中入职日期在1982年1月1日之前的员工信息复制到emp_back表中。
    insert into emp_back
    select * from emp where hiredate < to_date('1982-1-1','yyyy-mm-dd');
    select * from emp_back;
  • 练习四

    --  1.修改部门20的员工信息,把82年之后入职的员工入职日期向后调整10天
    update emp
    set hiredate = hiredate +10
    where deptno = 20 and hiredate > to_date('1982-12-31', 'yyyy-mm-dd');
    select * from emp;
    
    --  2.修改奖金为null的员工,奖金设置为0
    update emp set comm = 0 where comm is null;
    
    --  3.修改工作地点在NEW YORK或CHICAGO的员工工资,工资增加500
    update emp
    set sal = sal + 500
    where ename in (select e.ename
    from emp e, dept d
    where e.deptno = d.deptno
    and d.loc in ('NEW YORK', 'CHICAGO'));
    
    --  相关更新方法
    update emp e
    set e.sal = e.sal + 500
    where (select loc from dept where deptno = e.deptno) in
    ('NEW YORK', 'CHICAGO');
  • 练习五(使用相关更新)

    --  1.修改部门20的员工信息,把82年之后入职的员
    --  工入职日期向后调整10天
    update emp e set e.hiredate = e.hiredate + 10
    where (select deptno from dept where deptno = e.deptno) = 20;
    
    --  2.修改奖金为null的员工,奖金设置为0
    update emp e
    set e.comm = 0
    where e.empno in (select empno
    from emp
    where empno = e.empno
    and comm is null);
    --  注:此题条件本可以直接where comm is null,但因为题目要求用相关更新,
    ->  所以需用自身连接相关更新
    
    --  3.修改工作地点在NEW YORK或CHICAGO的员工工
    --  资,工资增加500
    update emp e set e.sal = e.sal + 500
    where (select loc from dept where deptno = e.deptno)
    in ('NEW YORK', 'CHICAGO');
  • 练习六

    --  1.删除经理编号为7566的员工记录
    delete from emp
    where mgr = 7566;
    
    select * from emp;
    
    --  2.删除工作在NEW YORK的员工记录
    delete from emp e
    where exists (select loc
    from dept
    where deptno = e.deptno
    and loc = 'NEW YORK');
    
    --  3.删除工资大于所在部门平均工资的员工记录
    delete from emp e
    where sal >
    (select avg(sal)
    from emp
    where deptno = e.deptno);
  • 练习七

    --  分析如下语句序列,哪些语句会结束事务?
    --  遇到DML语句开始事务
    INSERT…
    UPDATE..  --开始事务1
    INSERT
    ROLLBACK; --结束事务1
    DELETE..  --开始事务2
    DELETE..
    SELECT..
    COMMIT..  --结束事务2
    INSERT..
    INSERT..
    DELETE..  --开始事务3
    GRANT..   --结束事务3
    INSERT..  --开始事务4
    SELECT;
  • 练习八

    --  1.test表为空表,分析如下语句操作后,最后
    test表的状态。
    INSERT INTO test(id,name) values(1, 'a');
    INSERT INTO test(id,name) values(2, 'b');
    SAVEPOINT s1;--即3、4没有执行
    INSERT INTO test(id,name) values(3, 'c');
    INSERT INTO test(id,name) values(4, 'd');
    DELETE FROM test WHERE id in (1,3);
    ROLLBACK TO s1;--回滚到s1保存点
    DELETE FROM test WHERE id in (2,4);--删除2、4,4没有即删了2
    COMMIT;--执行,即只剩下第一句1
    ROLLBACK;--回滚没用了,已经执行
    
    剩下  INSERT INTO test(id,name) values(1, 'a');
  • 练习九

    --  分析如下两个会话,执行完每一步时的数据库状态
    
    --  会话一
    --  1.UPDATE EMP SET sal = sal+500 WHERE deptno= 10;
    emp表中部门为10的员工工资加500;
    本会话中可以看见值改变,但会话二无法看见,因为事务还没结束
    
    --  3.SELECT sal FROM EMP WHERE deptno = 10;
    看见emp表中部门为10的员工工资每人加了500
    
    --  6.COMMIT:
    执行后,sal + 500
    
    --  8.SELECT sal FROM EMP WHERE deptno = 10;
    
    --  会话二
    --  2.SELECT sal FROM EMP WHERE deptno = 10;
    该部门数据在会话一中被锁,事务独立性,看见数据为sal没加500之前的数据
    
    --  4.UPDATE EMP SET sal = sal+500 WHERE deptno = 20;
    可以更新,因为会话一中锁定的数据是emp表中部门10的数据,与部门20的数据无关
    
    --  5. UPDATE EMP SET sal = sal+1000 WHERE deptno = 10;
    更新等待,因为数据被会话一锁定
    
    --  7.COMMIT;

– 课后作业

--  1.使用如下语句,创建学生表student和班级表class
create table student (        --学生表
xh char(4),--学号
xm varchar2(10),--姓名
sex char(2),--性别
birthday date,--出生日期
sal number(7,2), --奖学金
studentcid number(2) --学生班级号
)
Create table class (   --班级表
classid number(2), --班级编号
cname varchar2(20),--班级名称
ccount  number(3) --班级人数
)

--  2.基于上述学生表和班级表,完成如下问题
--  (1)添加三个班级信息为:1,JAVA1班,null
--                         2,JAVA2班,null
--                         3,JAVA3班,null
insert into class values (1,'JAVA1班',null);
insert into class values (2,'JAVA2班',null);
insert into class values (3,'JAVA3班',null);

--  (2)添加学生信息如下:‘A001’,‘张三’,‘男’,‘01-5月-05’,100,1
insert into student values ('A001','张三','男','01-5月-05',100,1);

--  (3)添加学生信息如下:'A002','MIKE','男','1905-05-06',10
insert into student (xh,xm,sex,birthday,sal)
values ('A002','MIKE','男','6-5月-1905',10);

--  (4)插入部分学生信息: 'A003','JOHN','女’
insert into student (xh,xm,sex) values ('A003','JOHN','女');

--  (5)将A001学生性别修改为'女‘
update student set sex = '女' where xh = 'A001';

--  (6)将A001学生信息修改如下:性别为男,生日设置为1980-04-01
update student set sex = '男',birthday = '1-4月-1980'
where xh = 'A001';

--  (7)将生日为空的学生班级修改为Java3班
update student set studentcid = 3 where birthday is null;

--  (8)请使用一条SQL语句,使用子查询,更新班级表中每个班级的人数字段
update class c set
c.ccount = (select count(xh) from student where studentcid = c.classid)

--  3.使用如下语句,建立以下表
CREATE TABLE copy_emp   (
empno number(4),
ename varchar2(20),
hiredate date default sysdate ,
deptno number(2),
sal number(8,2))

--  4.在第三题表的基础上,完成下列问题

--  (1)在表copy_emp中插入数据,要求sal字段插入空值,部门号50,
->  参加工作时间为2000年1月1日,其他字段随意
insert into copy_emp (empno,ename,hiredate,deptno,sal)
values (1234, 'one', '1-1月-2000', 50, null);

--  (2)在表copy_emp中插入数据,要求把emp表中部门号为10号部门的员工信息插入
insert into copy_emp select empno,ename,hiredate,deptno,
sal from emp
where deptno = 10;

--  (3)修改copy_emp表中数据,要求10号部门所有员工涨20%的工资
update copy_emp set sal = sal*1.2 where deptno = 10;

--  (4)修改copy_emp表中sal为空的记录,工资修改为平均工资
update copy_emp set sal = (select avg(sal) from copy_emp)
where sal is null;

--  (5)把工资为平均工资的员工,工资修改为空
update copy_emp set sal = null
where sal = (select avg(sal) from copy_emp);

--  (6)另外打开窗口2查看以上修改
略...

--  (7)执行commit,窗口2中再次查看以上信息
commit;

--  (8)删除工资为空的员工信息
delete from copy_emp sal where sal is null;

--  (9)执行rollback
rollback;
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: