《SQL高級應用和數據倉庫基礎(MySQL版)》作業 ·006

問題列表

1.使用如下語句,建立以下表
create table copy_emp (
	empno int(4),
	ename varchar(20),
	hiredate date,
	deptno int(2),
	sal double(8,2)
);
2.在上一題所建立的表的基礎上,完成下列問題:
(1)在表copy_emp中插入數據,要求sal字段插入空值、部門號50、參加工作時間爲2000年1月1日、其他字段隨意
(2)在表copy_emp中插入數據,要求把emp表中部門號爲10號部門的員工信息插入
(3)修改copy_emp表中數據,要求10號部門所有員工漲20%的工資
(4)修改copy_emp表中sal爲空的記錄,工資修改爲平均工資
(5)把工資爲平均工資的員工,工資修改爲空
(6)另外打開窗口2查看以上修改
(7)執行commit,窗口2中再次查看以上信息
(8)刪除工資爲空的員工信息
(9)執行rollback

參考解答

前提補充

  • 已經使用了第1題的語句建立了表
  • 自己創建的emp表有如下數據
    emp表數據

注意點整理

  • 由於MySQL不能在同一語句中先select出表中的某些值、再update這個表,這裏的一個解決方法是再嵌套了一層select作爲一個臨時表,這個方法體現在了在4、5兩題的答案中。當然,也可能有別的解決方法。
  • MySQL默認隔離級別“repeatable read”
    同一個事務在讀取時,不會受到其他事務讀取、寫入的影響(查詢結果相對重複)
    在對數據執行寫入操作時,需要等待其他執行了寫入操作的事務結束後,才能進行寫入。

分解代碼

整體流程圖如下
Tips:可以點擊流程圖定位到相關步驟的代碼和效果上,點擊跳轉後文字可以返回流程圖

【窗口1】開啓事務A

begin;

【窗口2】開啓事務B

begin;

(第1題)【窗口1】事務A——插入一條自定義數據

insert into copy_emp
values(1, 'Jim', '2020-01-01', 50, null);

select * from copy_emp;

res1
(第2題)【窗口1】事務A——插入一條拷貝數據

insert into copy_emp
select * from emp where deptno = 10;

select * from copy_emp;

res2
(第3題)【窗口1】事務A——更新10號部門員工工資漲20%

update copy_emp
set sal = 1.2 * sal
where deptno = 10;

select * from copy_emp;

res3
(第4題)【窗口1】事務A——更新空工資員工工資爲平均工資

update copy_emp
set sal = (select avg(sal) from (select * from copy_emp) tmp where sal is not null)
where sal is null;

select * from copy_emp;

res4
(第5題)【窗口1】事務A——更新平均工資員工工資爲空工資

update copy_emp
set sal = null
where sal = (select avg(sal) from (select * from copy_emp) tmp where sal is not null);

select * from copy_emp;

res5
(第6題)【窗口2】事務B——查詢所有員工記錄

select * from copy_emp;

res6
(第7-1題)【窗口1】提交事務A

commit;

(第7-2題)【窗口2】事務B——查詢所有員工記錄

select * from copy_emp;

res7-2
(第7-3題)【窗口2】提交事務B

commit;  -- 既然不用了那就提交了吧【事務B完結】

【窗口1】開啓事務C

begin;

(第8題)【窗口1】事務C——刪除空工資員工

delete from copy_emp
where sal is null;

select * from copy_emp;

res8
(第9-1題)【窗口1】回滾事務C

rollback;

(第9-2題)【窗口1】——查詢所有員工記錄

select * from copy_emp;

res9

整體代碼

以下是Navicat查詢窗口1的內容:

-- 0、先開啓事務A
begin;

-- 1、事務A——插入一條自定義數據
insert into copy_emp
values(1, 'Jim', '2020-01-01', 50, null);

select * from copy_emp;

-- 2、事務A——插入一條拷貝數據
insert into copy_emp
select * from emp where deptno = 10;

select * from copy_emp;

-- 3、事務A——10號部門員工變爲原來的1.2倍
update copy_emp
set sal = 1.2 * sal
where deptno = 10;

select * from copy_emp;

-- 4、事務A——空工資員工工資變爲平均工資
update copy_emp
set sal = (select avg(sal) from (select * from copy_emp) tmp where sal is not null)
where sal is null;

select * from copy_emp;

-- 5、事務A——平均工資員工工資變爲空工資
update copy_emp
set sal = null
where sal = (select avg(sal) from (select * from copy_emp) tmp where sal is not null);

select * from copy_emp;

-- 7、事務A——提交之前5次操作【事務A完結】
commit;

-- 8、開啓事務C、刪除空工資員工
begin;

delete from copy_emp
where sal is null;

select * from copy_emp;

-- 9、回滾【事務C完結】
rollback;

select * from copy_emp;

以下是Navicat查詢窗口2的內容:

-- 0、先開啓事務B(A與B的先後無關緊要)
begin;

-- 6、【在事務A執行了前面5次操作後】事務B——查詢copy_emp表的數據
--   答:沒有變化,仍然顯示爲空表,只有在本次事務提交後纔會顯示出3條記錄
select * from copy_emp;


-- 7、【在事務A執行了前面5次操作並提交後】事務B——查詢copy_emp表的數據
--   答:沒有變化,仍然顯示爲空表,只有在本次事務提交後纔會顯示出3條記錄
select * from copy_emp;

commit;  -- 既然不用了那就提交了吧【事務B完結】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章