– 练习
练习一
-- 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;