1.7 Oracle資料庫學習教程-集合運算&資料處理
Oracle資料庫學習教程
集合運算&資料處理
集合運算
問題:查詢部門號10和20的員工的資訊:
select * from emp where deptno in(10,20);
select * from emp where deptno = 10 or deptno = 20;
- 集合運算
集合運算的物件是兩個集合
常用的有: \(A \bigcap B\),\(A \bigcup B\),\(A-B\)等
- 並集:union/union all
- 交集:intersect
- 差集:minus
上面的問題改寫為集合運算版本:
select * from emp where deptno = 10 union select * from emp where deptno = 20;
注意事項:
- 參與運算的各個集合必須列數相同,型別一致
- 表頭採用第一個集合的
- 會先執行帶()的語句
資料處理
0. SQL語言型別
- DML語句(資料操作語言): insert,update,delete,select
- DDL語句(資料定義語言): create table,create view(檢視),create index(索引),create sequence(序列)
- DCL語句(資料控制語言):grant(賦權),revoke(回收許可權)
1. 插入資料insert
insert into table[列1..] values (值1...);
如:
insert into emp values (1001,'TOM','Engineer',7839, sysdate,5000,200,10); insert into emp(empno, ename, sal, deptno) values(1002, 'Marry', 6000, 20);
1. &地址符:
SQL> insert into emp(empno, ename, sal, deptno) values(&empno, &ename, &sal, &deptno);
加上&符號,下次輸入/號就可以繼續賦值了,&後面的可以任意寫,一般和前面相同
2. 批處理:
先創一張相同結構的表,不要有資料(where 假):
create table emp10 as select * from emp where 1=2;
然後插入一批資料:
insert into emp10 select * from emp where deptno=10 ;
2. 更新資料
更新操作一般會使用where來改一部分資料
update emp10 set sal=4000, comm=300 where ename = 'CLARK'; ( 或 where empno=7782; )
刪除資料delete
delete from emp10 where empno=7782;(或ename= 'KING');
注意:“from”關鍵字在Oracle中可以省略不寫,但MySQL中不可以。
delete和truncate的區別:
- delete是刪除一條資料,而truncate是先摧毀表再重建.
- delete效能更優.
- delete不會釋放空間,truncate會釋放空間
- delete可以回滾,truncate不能回滾.
- delete會產生碎片,truncate不會.
事務
資料庫事務,是由有限的資料庫操作序列組成的邏輯執行單元,這一系列操作要麼全部執行,要麼全部放棄執行。
要麼都成功,要麼都失敗.
比如銀行轉帳,A轉1000給B:1.A-1000,2.B+1000.這兩步要捆綁一起.
成功了就commit提交,失敗了就rollback回滾
事務的特性:
事務4大特性(ACID):原子性、一致性、隔離性、永續性。
事務的起始標誌:Oracle中自動開啟事務,以DML語句為開啟標誌。
執行一個增刪改查語句,只要沒有提交commit和回滾rollback,操作都在一個事務中。
事務的結束標誌:提交、回滾都是事務的結束標誌。
提交:
- 顯示提交:commit
- 隱式提交:
- 有DDL語句,如:create table除了建立表之外還會隱式提交Create之前所有沒有提交的DML語句。
- 正常退出(exit / quit)
回滾:
- 顯示回滾:rollback
- 隱式回滾:掉電、宕機、非正常退出。
還可以增加儲存點(savepoint),相當於存檔.可以使用rollback回滾到指定的儲存點.
隔離級別:
對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有采取必要的隔離機制, 就會導致各種併發問題:
- 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位. 之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
- 不可重複讀: 對於兩個事物 T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.
- 幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
Oracle支援的隔離級別: Read Commited(預設)和 Serializable,以及Oracle自定義的Read Only三種。
Read Only:由於大多數情況下,在事務操作的過程中,不希望別人也來操作,但是如果將別人的隔離級別設定為Serializable(序列),但是單執行緒會導致資料庫的效能太差。是應該允許別人來進行read操作的。
mysql支援以上四種, Oracle預設讀已提交資料,mysql預設可重複讀。
本文來自部落格園,作者:Ovins,轉載請註明原文連結:https://www.cnblogs.com/ovins/p/15376387.html
喜歡請點關注❤️ ❤️ ❤️