Oracle的資料處理
阿新 • • 發佈:2019-01-10
SQL的型別
SQL的型別:
1.DML(data manipulation language 資料操作語言):insert update delete select
2.DDL(data definition language 資料定義語言):create table,alter table,drop table,truncate table,create/drop view,sequence(序列),index,synonym(同義詞)
3.DCL(data control language 資料控制語言):grant(授權) revoke(插銷許可權).
insert 語句語法
insert into emp(empno,ename,sal,deptno) values (1001,'Tom',3000,10);
--JDBC:PreparedStatement pst="insert into emp(empno,ename,sal,deptno) values (?,?,?,?)";
--地址符 &(依次輸入,在sqlpus視窗中使用)
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
--批處理
create table emp10 as select * from emp where 1=2; -- 建立測試表
-- 一次性將emp中,所有10號部門的員工插入到emp10中.
insert into emp10 select * from emp where deptno=10;
-- 更新114號員工的工作和工資使其與205號員工相同
update employees set job_id =(select job_id from employees where employee_id=205),salary=(select salary from employees where employee_id=205) where employee_id=114;
-- 刪除表中資料
delete和truncate的區別
1.delete逐條刪除;truncate先摧毀表,在重建.
2.(根本)delete是DML(可以回滾),truncate是DDL(不可以回滾).
3.delete不會釋放空間 truncate會.
4.delete可以閃回(flashback)插銷已經提交的結果,truncate不可以.
5.delete產生碎片,truncate不會.
--undo資料(還原資料),因此delete比truncate快.
去掉碎片
1.alter table<表名> move;
2.匯入匯出(exp imp expdp impdp);
海量拷貝資料
1.資料泵(datapump)-->plsql
2.SQL*Loader
3.(資料倉庫)外部表
4.可傳輸的表空間.
資料庫事務
資料庫事務:1.本地事務 2.全域性事務.
事務的標誌:
1.起始標誌:事務中的第一條DML語句.
2.結束標誌:
提交:顯式:commit,隱式:正常退出(exit),DDL,DCL.
回滾:顯式:rollback,隱式:非正常退出,掉電,宕機.
設定回滾點:saveponit a;
返回: rollback to savepoint a;
資料庫提供的四種事務隔離級別
隔離級別 | 描述 |
---|---|
read uncommited(讀未提交資料) | 允許事務讀取未被其他事務提交的變更,髒讀,不可重複讀和幻讀問題都會出現. |
read commited(讀已提交資料) | 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍然可能出現. |
repeatable read(可重複讀) | 確保事務可以多次從一個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個欄位進行更新,可以避免髒讀和不可重複讀,但幻讀的問題仍然存在. |
serializable(序列化) | 去報事務可以從一表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入,更新和刪除操作,所有併發問題都可以避免,但效能十分低下. |
Read uncommitted 事例:老闆要給程式設計師發工資,程式設計師的工資是3.6萬/月。但是發工資時老闆不小心按錯了數字,按成3.9萬/月,該錢已經打到程式設計師的戶口,但是事務還沒有提交,就在這時,程式設計師去檢視自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老闆及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。
分析:實際程式設計師這個月的工資還是3.6萬,但是程式設計師看到的是3.9萬。他看到的是老闆還沒提交事務時的資料。這就是髒讀。
Read committed 事例:程式設計師拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程式設計師事務開啟),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!!程式設計師的妻子要把錢全部轉出充當家用,並提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程式設計師就會很鬱悶,明明卡里是有錢的…
分析:這就是讀提交,若有事務對資料進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交後才能讀取資料,可以解決髒讀問題。但在這個事例中,出現了一個事務範圍內兩個相同的查詢卻返回了不同資料,這就是不可重複讀。
Repeatable read 事例:程式設計師拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
分析:重複讀可以解決不可重複讀問題。寫到這裡,應該明白的一點就是,不可重複讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。
什麼時候會出現幻讀?
事例:程式設計師某一天去消費,花了2千元,然後他的妻子去檢視他今天的消費記錄(全表掃描FTS,妻子事務開啟),看到確實是花了2千元,就在這個時候,程式設計師花了1萬買了一部電腦,即新增INSERT了一條消費記錄,並提交。當妻子列印程式設計師的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。
Serializable 序列化是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。
值得一提的是:大多數資料庫預設的事務隔離級別是Read committed,比如Sql Server , Oracle。Mysql的預設隔離級別是Repeatable read。
oracle支援2種事務隔離級別:read commited/serializable.oracle預設是隔離級別是read commited;
oracle獨有的:read only,set transaction read only;
mysql支援4中事務隔離級別:mysql預設的事務隔離級別為:repeatable read;
DDL語句建立和管理表
--行地址 rowid
select rowid,empno,ename,sal from emp;
-- 建立一張表
create table empinfo as select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname from emp e,dept d where e.deptno=d.deptno;
Table created
--修改表:追加新列,修改咧,刪除列,重新命名列,重命名錶
alter table test3 modify tname varchar2(40);
alter table test3 drop column photo;
alter table test3 rename column tname to username;
rename test3 to test5;
-- oracle的回收站
show recyclebin; --查看回收站.
purge recyclebin; --清空回收站.
注意:管理員沒有回收站
-- 約束是表一級的限制
如果存在依賴關係,約束可以防止錯誤的刪除資料
約束的型別:1.not null 2.unique 3.primary key 4.foreign key 5.check
foreign key:在子表中定義了表級約束.
references:制定表和父表中列.
on delete cascade:當刪除父表時,級聯刪除子表記錄.
on delete set null:將子表中的相關依賴記錄的外來鍵值置為NULL.
例子:
create table student
(
sid number constraint student_pl primary key,
sname varchar2(20) constraint student_name_notnull not null,
gender varchar2(2) constraint student_gender check(gender in('男','女')),
email varchar2(40) constraint student_email_unique unique
constraint_student_notnull not null,
deptno number constraint student_fk references dept(deptno) on delete set null
);
其他資料庫物件
-- 使用sys使用者授權;
grant create view to scott;
grant create synonym to scott;
-- 某張表的查詢許可權
grant select on hr.employees to scott;
1.檢視(一般只用於select,簡化查詢):從表中抽出的邏輯上相關的資料集合.
檢視:是虛表,建立在已有表的基礎上,檢視賴以簡歷的這些表成為基表.
向檢視提供資料內容的語句為select語句,可以將檢視理解為儲存起來的select語句.
檢視向用戶提供基表資料的另一種表吸納形式.
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname from emp e,dept d where e.deptno=d.deptno
with read only; --只讀
create or replace view v_t3
as
select id, name,salary from t3 where salary>=7000
with check option;--保證讓你只能在檢視的條件之內對檢視進行DML
插入一個要salary小於7000的行,將會報出錯誤.
插入一個大於7000的行,可以成功插入;
-- 物化檢視(快取資料);
2.序列:提供有規律的數值.
可供多個使用者用來產生唯一數值的資料庫物件.
1)自動提供唯一的數值
2)共享物件
3)主要用於提供主鍵值.
4)將序列值裝入記憶體可以提供訪問效率.
序列---->陣列(預設1,步長1)---->記憶體
create sequence testseq
increment by 10 --步長,預設為1
start with 120 --起始值,預設為1
maxvalue 9999 --最大值,預設為nomaxvalue,同理最小值mixvalue/nominvalue
nocache --不快取,若快取寫為cache n
nocycle; --不迴圈,若迴圈為cycle
select myseq.currval from dual; --如果從未使用,那麼將會報錯,初始化指標指向初始值的前一位.
select myseq.nextval from dual;
drop sequence testseq; -- 刪除序列.
3.索引:提高查詢的效率.
--單列,在deptno上建立索引
create index myindex on emp(deptno);
--多列:
create index myindex on emp(deptno,job);
索引的型別:
1)B樹索引(預設)--平衡樹 insert/update/delete(OLTP).
2)點陣圖索引--矩陣 select(OLAP 資料倉庫).
create bitmap index *** on ***;
--刪除索引
drop index indexname;
注意:只有索引的擁有者或擁有drop any index許可權的使用者才可以刪除索引.
4.同義詞:給物件起別名(安全簡化表名).
--為emp表器別名
create synonym myemp for emp;
--建立共有同義詞
create public synonym myemp for emp;