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

– 练习

  • 练习一

    --  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;

猜你喜欢

转载自blog.csdn.net/bb_code_exchange/article/details/81356868