問題列表
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表有如下數據
注意點整理
- 由於MySQL不能在同一語句中先select出表中的某些值、再update這個表,這裏的一個解決方法是再嵌套了一層select作爲一個臨時表,這個方法體現在了在4、5兩題的答案中。當然,也可能有別的解決方法。
- MySQL默認隔離級別“repeatable read”
同一個事務在讀取時,不會受到其他事務讀取、寫入的影響(查詢結果相對重複)
在對數據執行寫入操作時,需要等待其他執行了寫入操作的事務結束後,才能進行寫入。
分解代碼
整體流程圖如下
Tips:可以點擊流程圖定位到相關步驟的代碼和效果上,點擊跳轉後文字可以返回流程圖
begin;
begin;
insert into copy_emp
values(1, 'Jim', '2020-01-01', 50, null);
select * from copy_emp;
insert into copy_emp
select * from emp where deptno = 10;
select * from copy_emp;
(第3題)【窗口1】事務A——更新10號部門員工工資漲20%
update copy_emp
set sal = 1.2 * sal
where deptno = 10;
select * from copy_emp;
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;
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;
select * from copy_emp;
commit;
select * from copy_emp;
commit; -- 既然不用了那就提交了吧【事務B完結】
begin;
delete from copy_emp
where sal is null;
select * from copy_emp;
rollback;
select * from copy_emp;
整體代碼
以下是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完結】