oracle數據庫SQL開發之數據操作與事務控制
一、數據操作語言
– Data Manipulation Language ,簡稱DML,主要用來實現對
數據庫表中的數據進行操作。
– 數據操作語言主要包括如下幾種:
• 增加行數據:使用 insert語句 實現
• 修改行數據:使用 update語句 實現
• 刪除行數據:使用 delete語句 實現
• 合併行數據:按照指定條件合併兩個表的數據,使用 merge語句 實現
(一)插入數據 insert
.–.向部門表新增一個部門,部門編號爲50,部門名稱爲HR,工作地點爲SY。
insert into dept
values (50,'HR','SY'); --插入數據insert into 表名 values ();
select * from dept;
1.插入空值null(隱含法、顯示法)
–.向部門表新增一個部門,部門編號爲60,部門名稱爲MARKET(隱含法)
insert into dept (deptno,dname) --隱含法
values (60,'MARKET');
insert into dept ---------(顯示法)
values (60,'MARKET','null')
2.插入日期型
(1)插入 sysdate 函數記錄當前日期和時間
(2)插入 to_date函數轉換成要求的日期型數據
3.插入特字符& 在其前加上 \ 如: ‘& dafdad &’; escape 轉義符
4.多行插入
–創建經理表
CREATE TABLE manager AS SELECT * FROM emp WHERE 1=0; --獲取emp表頭並create表
–多行插入不用values
INSERT INTO manager SELECT * FROM emp WHERE job = 'MANAGER'; --查詢獲取的結果是多行的
(二)修改數據 update
.• 修改數據使用UPDATE子句完成,語法結構如下:
UPDATE table
SET column = value [, column = value]
[WHERE condition];
–把員工編號爲 7782 的部門編號修改爲20
SQL> UPDATE emp
SET deptno = 20
WHERE empno = 7782;
1.一次修改多列
–把部門編號爲 10 的員工,部門編號調整爲 20 ,工資增加1000
update emp set dept = 20,sal=sal+100 where dept =10;
2.嵌入子查詢修改
–– 把部門編號爲 10 的員工,部門編號調整爲 20,工資在原有的基礎上,增加所有人的平均工資
update emp
set dept = 20,sal=sal+(select avg(emp.sal) from emp)
where dept =10;
3.相關子查詢修改
. 在 emp 表中增加一個列, dname,
alter table emp add(dname varchar2(14));
例 2. 使用相關子查詢更新 dname 列爲正確的部門名稱。
updete emp e
set dname =(select dname
from dept d
where deptno = e.deptno);
4.修改記錄時的注意部範 完整性約束錯誤
(三)刪除數據delete
DELETE [FROM] table
[WHERE condition];
–刪除員工編號爲7856的信息
delete from emp where empno = 7856;
1.本表單行刪除
2.基於另一個表刪除本表記錄 (子查詢)
3.刪除記錄時的完整性約束錯誤
4.相關delect
– 使用相關delect,你可以使用相關子查詢來只刪除那些已經存在於另一張表中的行。
二、事務控制
(一)事務
事務:也稱工作單元,是由一個或多個SQL語句所組成的操作序列,這些SQL語句作爲一個完整的工作單元,要麼全部執行成功,要麼全部執行失敗。在數據庫中,通過事務來保證數據的一致性。
事務處理語言:Transaction Process Language ,簡稱TPL,主要用來對組成事務的DML語句的操作結果進行確認或取消。
–確認也就是使DML操作生效,使用提交(commit)命令實現;
–取消也就是使DML操作失效,使用回滾(rollback)命令實現。
(二)事務組成
– 在數據庫中,事務由一組相關的DML或SELECT語句,加上一個TPL語句(commit、roolback)或一個DDL語句(create、alter、drop、truncate等)或一個DCL(grant、remove)語句。
(三)事務結束
(1)顯示結束
– 提交(COMMIT):使用COMMIT命令實現,以成功的方式結束事務,組成事務的DML語句操作全部生效。
– 回滾(ROLLBACK):使用ROLLBACK命令實現,以失敗的方式結束事務,組成事務的DML語句操作全部被取消。
(2)隱式結束
– 隱式提交:當下列任意一種情況發生時,會發生隱式提交
• 執行一個DDL(CREATE、ALTER、DROP、TRUNCATE、RENAME)語句;
• 執行一個DCL(GRANT、REVOKE)語句;
• 從SQLPlus正常退出(即使用EXIT或QUIT命令退出);
– 隱式回滾:當下列任意一種情況發生時,會發生隱式回滾
• 從SQL*Plus中強行退出
• 客戶端連接到服務器端異常中斷
• 系統崩潰
(四)設置保存點
如果在一個事務內,想要回滾到指定位置,不是回滾到事務的起始點,可以通過保存**(savepoint)**來實現。
– savepoint savepointname ;–定義一個保存點語句;
– rollback to savepointname ;–回滾到指定保存點
– 注意:如上兩條語句不結束事務的執行。
三、事務特徵
.事務特徵可用四個字母的縮寫表示:即ACID(重點知識)
– 原子性(Atomicity)
• 事務就像“原子”一樣,不可被分割,組成事務的DML操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。
– 一致性(Consistency)
• 一旦事務完成,不管是成功的,還是失敗的,整個系統處於數據一致的狀態。
– 隔離性(Isolation)
• 一個事務的執行不會被 另一個事務所幹擾。比如兩個人同時
從一個賬戶從取錢,通過事務的隔離性確保賬戶餘額的正確性。
– 持久性(Durability)
• 也稱爲永久性,指事務一旦提交,對數據的改變就是永久的,不可以再被回滾。
四、事務鎖
1.鎖的概念
–鎖用來在多用戶併發訪問和操作數據庫時,保證數據的一致性的一種機制;
– 鎖由Oracle自動管理,如一個DML操作,oracle默認的機制是在DML操作影響的行記錄上自動加鎖;
– 鎖在被相關的操作申請並持有後,會一直保持到事務的結束,事務結束後,鎖纔會被釋放;
2.– 查詢語句不會鎖定任何記錄,純粹的select查詢可以查詢數據,如果在查詢語句後面加for update子句會鎖定查詢所影響的行記錄;
–select …for update (skip locked); 加上了行鎖
skip locked 是篩選掉被其他會話加上鎖的部分數據行
一個會話中select子句末尾加上for update後,該查詢結果的原表該部分數據會上鎖,
另一個會話不能操作該部分數據。