Oracle Database-數據處理和表的管理部分
*SQL的類型
- DML(Data Manipulation Language 數據操做語言):select/insert/update/delete
- DDL(Data Definition Language 數據定義語言):create table/alter table/truncate table/drop table
- create/drop view/sequnece/index/synonym(同義詞)
- DCL(Data Control Language 數據控制語言):grant(受權)/revoke(撤銷權限)
DML語句(增/刪/改)
INSERT語句
用於插入數據
- 爲每一列添加一個新值
- 按列的默認順序列出各個列的值
- 在INSERT 子句中隨意列出列名和他們的值
- 字符和日期型數據應包含在單引號中
語法
使用這種語法一次只能向表中插入一條數據
示例:
插入空值
使用地址符來佔位具體值
相似JDBC的PreparedStatement,用佔位符"?"來表示之後將要插入的值的位置
在Oracle中可使用"&"符號來指定列值,位置放在VALUES子句中
一般使用與列名同樣的地址符後綴,如:id——&id
地址符幾乎可使用在全部SQL語句中,不只僅是插入語句
如:
從其餘表中拷貝數據
語法是在INSERT語句後加入子查詢
- 不須要書寫VALUES子句
- 子查詢中的值列表應該與INSERT子句中要被插入的列名相對應
- 這種方式能夠一次插入多條數據
當須要插入海量數據時,這種方法效率很低,一般使用如下的方法來解決
海量插入數據
- Oracle提供了數據泵(PLSQL程序):dbms_datapump(程序包)
- SQL*Loader
- 外部表
UPDATE語句
語法
能夠一次更新多條數據
通常使用WHERE子句來肯定須要更新哪些數據
在UPDATE語句中使用子查詢
更新操做中的數據完整性錯誤
數據的完整性就是指建立表時定義的表與表之間的
約束
DELETE語句
語法
能夠一次刪除多條數據
使用WHERE子句來肯定須要更新哪些數據
刪除操做中的數據完整性錯誤
關於DELETE和TRUNCATE的異同
- 都是刪除表中的數據
- delete是逐條刪除,truncate是先摧毀表再重建
- delete速度更快,truncate速度比delete慢
- delete是DML(數據操做語言)語句,truncate是DDL(數據定義語言)語句
- Delete操做能夠回滾rollback
- Delete操做能夠閃回(Oracle特有,再事務提交後能夠閃回)
- 在Oracle中,大部分操做均可以閃回,即大部分操做都是可逆的
- Delete操做可能產生碎片,而且不釋放空間
- 關於碎片
- 碎片使表的數據條目之間不連續,影響查詢的速度
- 清理碎片的方法:
注意:插入、更新和刪除操做會引發數據的的變化,必須考慮數據的完整性
Oracle中的事務
Oracle中事務的概念
數據庫事務的組成
- 一個或多個DML語句
- 一個DDL(Data Definition Language – 數據定義語言)語句
- 一個DCL(Data Control Language – 數據控制語言)語句
數據庫事務的執行流程
- 以第一個DML語句的執行做爲開始
- 如下面其中一種做爲結束
- 顯示結束:commit rollback
- 隱式結束(自動提交):DDL語言、DCL語言、exit(事務正常退出)
- 隱式回滾(系統異常終了):關閉窗口、死機或掉電等
COMMIT和ROLLBACK語句
使用COMMIT和ROLLBACK語句能夠
- 確保數據完整性
- 數據改變被提交以前預覽
- 將邏輯上相關的操做分組
經過SAVEPOINT控制事務
- 使用SAVEPOINT語句能夠在當前事務中建立保存點。
- 使用ROLLBACK TO SAVEPOINT語句回滾到建立的保存點
- 使用SAVEPOINT來回滾能夠避免出現小錯誤而回滾整個事務
數據庫事務的隔離級別
對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,若是
沒有采起必要的隔離機制,就會致使各類併發問題:
- 髒讀:對於兩個事物T1,T2,T1讀取了已經被T2更新但尚未被提交的字段。以後,若T2 回滾,T1讀取的內容就是臨時且無效的
- 不可重複讀:對於兩個事物T1,T2,T1讀取了一個字段,而後T2更新了該字段。以後,T1再次讀取同一個字段,值就不一樣了
- 幻讀:對於兩個事物T1,T2,T1從一個表中讀取了一個字段,而後T2在該表中插入了一些新的行。以後,若是T1再次讀取同一個表,就會多出幾行
數據庫事務的隔離性
數據庫系統必須具備隔離併發運行各個事務的能
力,使它們不會相互影響,避免各類併發問題
一個事務與其餘事務隔離的程度稱爲隔離級別
數據庫規定了多種事務
隔離級別,不一樣隔離級別對應不一樣的干擾程度,隔離級別越高,數據一致
性就越好,但併發性越弱
數據庫提供的4種事務隔離級別
Oracle支持的兩種事務隔離級別(或三種)
- Oracle支持2種事務隔離級別:READ COMMITED和SERIALIZABLE(或加上READ ONLY只讀共三種)
- Oracle默認的事務隔離級別爲:READ COMMITED
Mysql支持4種事務隔離級別. Mysql 默認的事務隔離級別爲: REPEATABLE READ
DDL語句(管理及操做表)
常見的數據庫對象
表空間
表空間是Oracle數據庫的邏輯單元
數據庫——表空間
一個表空間能夠於多個數據文件(物理結構)關聯一個數據庫下能夠創建多個表空間,一個表空間能夠創建多個用戶,一個用戶下能夠創建多張表
創建表空間的語句
用戶
建立用戶的語句
爲用戶賦權限語句
新建立的用戶沒有任何權限,登錄後會提示
角色
Oracle中存在三個主要角色
- connect角色
- resource角色
- dba角色
分別有如下權限
賦權語法
建立表
CREATE TABLE語句
*前提:
- 用戶須要具有CREATE TABLE權限
- 有足夠的存儲空間
語法
必須指定
表名,
列名及其
數據類型和
數據類型的大小
示例:
DEFAULT VALUE-默認值
執行insert操做時,能夠爲其指定默認值
語法:
- 值、表達式和SQL語句均可以做爲默認值
- 其餘的列名或者是僞列都是非法的
- 默認值的類型必須和該列的類型一致
利用select語句建立表
select語句查詢的結果至關於一張表,咱們能夠將這個查詢結果變成一張表,即建立一張存儲select語句查詢結果的表
這樣就能夠很方便的建立新的表了
語法:注意
as關鍵字
示例:
拷貝現有的表結構(建立與現有表的結構相同的表)
利用上述經過select語句建立查詢結果對應的表的功能:
create table 新表 as select * from
where 1=2
;
將會拷貝表但不拷貝表中的數據
同理能夠在where條件中加上篩選條件拷貝須要的表數據
列的數據類型
關於ROWID(行地址):
*表及列名的命名規則
- 必須以字母開頭
- 必須在1–30 個字符之間
- 必須只能包含A–Z、a–z、0–九、_、$、和#
- 必須不能和用戶定義的其餘對象重名
- 必須不能是Oracle的保留字
- Oracle默認存儲是都存爲大寫
- 數據庫名只能是1~8位,datalink能夠是128位,和其他一些特殊字符
*使用子查詢建立表
使用AS subquery選項,將建立表與插入數據結合
語法:
要求:
- 指定的列和子查詢中的列要一一對應
- 經過列名和默認值定義列
示例:
修改表
ALTER TABLE語句
使用ALTER TABLE語句能夠
語法
列的追加/修改/刪除/重命名
追加列的示例:
修改一個列的示例
能夠修改列的數據類型,數據類型大小和默認值
注意:
對默認值的修改隻影響
從此對錶的修改,此前的數據不影響
刪除一個列示例
刪除表
DROP TABLE語句
使用DROP TABLE語句
- 數據和結構都被刪除
- 全部正在運行的相關事物被提交
- 全部相關索引被刪除
- DROP TABLE 語句不能回滾,可是能夠閃回
語法
DROP TABLE不是將表完全刪除,只是將表放到RECYCLEBIN(回收站)中
能夠經過加雙引號的方法查出已刪除的表
回收站能夠被清空
注意:回收站並非必定存在的,某些用戶沒有回收站(如sys-管理員用戶),要注意
purge關鍵字
能夠跳過回收站完全刪除
從回收站恢復已刪除的表
有多種方式,如閃回刪除:
七種方式:
其中閃回數據歸檔Oracle11G纔有,其他六種11G和10G均有
詳細自查
重命名對象
RENAME語句
執行RENAME語句將會改變表、視圖、序列或同義詞的
名稱
前提:必須是對象的擁有者
語法
清空表
TRUNCATE TABLE語句
使用TRUNCATE TABLE語句將
語法
注意:
- TRUNCATE語句不能回滾
- 可使用DELETE語句代替TRUNCATE語句刪除數據
約束
約束的概念
- 約束是表一級的限制
- 若是存在依賴關係,約束能夠防止錯誤的刪除數據
- 約束的類型
- NOT NULL-非空約束
- UNIQUE-惟一約束
- PRIMARY KEY-主鍵約束
- FOREIGN KEY-外鍵約束
- CHECK-檢查性約束
約束級別
在Oracle中有兩種約束級別
- 列級約束:若是沒有特別指明,通常都是列級約束
- 表級約束
約束規則
- 用戶能夠自定義約束,也可使用OracleServer的sys_cn格式命名約束
- 約束建立的時機:
- 約束能夠定義在列一級,或者是表一級
- 經過數據字典查看約束
約束的類型
NOT NULL-非空約束
保證該列的值不爲空
UNIQUE-惟一性約束
保證該列的值惟一
PRIMARY KEY-主鍵約束
經過主鍵查詢數據速度最快,由於主鍵是一個惟一性的
索引,關於原理見下文索引部分
約束列的值:
FOREIGN KEY-外鍵約束
與主表的主鍵有約束
- FOREIGN KEY: 在子表中,定義了一個表級的約束
- REFERENCES: 指定表和父表中的列
- ON DELETE CASCADE: 當刪除父表時,級聯刪除子表記錄(謹慎使用,比較危險)
- ON DELETE SET NULL: 將子表的相關依賴記錄的外鍵值置爲null,此時子表這個記錄與父表沒有聯繫了
子表的外鍵必須是父表的主鍵
check-檢查性約束
- 定義每一行記錄所必須知足的條件
- 下面的表達式可使用在check約束中:
- 引用CURRVAL、NEXTVAL、LEVEL、和ROWNUM
- 調用SYSDATE、UID、USER和USERENV函數
- 另外一個表的查詢記錄
在定義檢查性約束的時候最好定義這個檢查性約束的名稱,當不知足約束時回顯這個名稱告知約束條件,上圖emp_salary_min就是這個約束的名稱
小結
建表示例:
常見的數據庫對象
視圖
- 視圖是一種虛表
- 視圖創建在已有表的基礎上,視圖賴以創建的這些表稱爲基表
- 向視圖提供數據內容的語句爲SELECT語句,可以將視圖理解爲存儲起來的SELECT語句
- 視圖向用戶提供基表數據的另外一種表現形式
視圖的優勢
建立視圖-基本
權限
通常來說普通用戶沒有建立視圖的權限,須要被管理員受權
語法
- FORCE:子查詢不必定存在
- NOFORCE:子查詢存在(默認)
- CHECK OPTION:只操做視圖對應的數據,若操做視圖不存在的數據則報錯
- 如:視圖爲10號部門的員工視圖,就不能夠插入部門號爲其餘的員工條目了
- 「只能操做看獲得的」
- 不建議經過視圖對錶進行操做
- WITH READ ONLY:只能作查詢操做
子查詢能夠是複雜的SELECT語句
示例:
顯示視圖結構:使用
示例2:建立視圖時在子查詢爲列定義別名
以後應該在選擇視圖中的列時使用別名
查詢視圖
語法
簡單視圖和複雜視圖
替換(至關於修改)視圖
使用CREATE OR REPLACE VIEW子句修改視圖
建立或者替換
CREATE VIEW子句中各列的別名應和子查詢中各
列相對應
建立複雜視圖
複雜視圖舉例:查詢各個部門的最低工資,最高工資,平均工資
視圖中使用DML的規定
注意:不建議經過視圖
對表
進行操做,緣由就是使用DML的規定太多了
能夠在簡單視圖中執行DML操做
當視圖定義中包含如下元素之一時不能使用delete
- 組函數
- GROUP BY子句
- DISTINCT(去重)關鍵字
- ROWNUM僞列
當視圖定義中包含如下元素之一時不能使用update
- 組函數
- GROUP BY子句
- DISTINCT關鍵字
- ROWNUM僞列
- 列的定義爲表達式
當視圖定義中包含如下元素之一時不能使用insert
- 組函數
- GROUP BY子句
- DISTINCT關鍵字
- ROWNUM僞列
- 列的定義爲表達式
- 表中非空的列在視圖定義中未包括
屏蔽DML操做
- 可使用WITH READ ONLY 選項屏蔽對視圖的DML操做
- 任何DML操做都會返回一個Oracle server錯誤
刪除視圖
刪除視圖只是刪除視圖的定義,並不會刪除基表的數據
序列
序列是指可供
多個用戶用來產生
惟一數值的數據庫對
象
- 自動提供惟一的數值
- 共享對象
- 主要用於提供主鍵值
- 將序列值裝入內存中能夠提升訪問效率
- *建立序列就至關於建立一個數組
Oracle中的序列從功能上來講至關於MySQL中的auto_increment同樣
建立序列
建立序列就至關於建立一個數組,數組長度默認爲20
語法
- INCREMENT BY n:定義自增量(步長),默認爲1
- START WITH n:定義起始值,默認爲1
- MAXVALUE n / MINVALUE n | NOMAXVALUE / NOMINVALUE:最大值/最小值 | 無最大值/無最小值,默認爲無最大最小值
- CYCLE | NOCYCLE:是否循環(會產生重複的值),默認爲NOCYCLE
- CACHE n | NOCACHE:緩存長度(至關於這個數組的長度),默認爲20 | 無緩存,即長度爲1
示例:
- 建立序列DEPT_DEPTID_SEQ爲表DEPARTMENTS提供主鍵
- 自增量爲10
- 起始值爲120
- 默認無最小值
- 最大值爲9999
- 不循環
- 不定義緩存
查詢序列
示例
查詢數據字典視圖USER_SEQUENCES獲取序
列定義信息
若是指定NOCACHE選項,則列
LAST_NUMBER顯示序列中下一個有效的值
NEXTVAL和CURRVAL僞列(至關於操做數組的指針)
這個指針默認是在第1個元素的前面(即CURRVAL此時無心義)
- NEXTVAL返回序列中下一個有效的值,任何用戶均可以引用
- CURRVAL中存放序列的當前值
- NEXTVAL應在CURRVAL以前指定,兩者應同時有效
序列的應用示例
序列的特色
- 將序列值裝入內存可提升訪問效率
- 序列在下列狀況下出現裂縫(不連續了)
- 若是不將序列的值裝入內存(NOCACHE),可以使用表USER_SEQUENCES查看序列當前的有效值
修改序列
示例
修改序列的增量、最大值、最小值、循環選項或是
否裝入內存
修改序列的注意事項
- 修改序列的用戶必須是序列的擁有者或對序列有ALTER權限
- 只有未來的序列值會被改變
- 改變序列的初始值只能經過刪除序列以後重建序列的方法實現
刪除序列
- 使用DROP SEQUENCE語句刪除序列
- 刪除以後,序列不能再次被引用
示例:
索引
索引是用於加速數據存取的數據對象,合理地使用索引能夠大大下降I/O次數,從而提升數據訪問性能
- 一種獨立於表的模式對象,能夠存儲在與表不一樣的磁盤或表空間中
- 索引被刪除或損壞,不會對錶產生影響,其影響的只是查詢的速度
- 索引一旦創建,Oracle管理系統會對其進行自動維護,並且由Oracle管理系統決定什麼時候使用索引,用戶不用在查詢語句中指定使用哪一個索引
- 在刪除一個表時,全部基於該表的索引會自動被刪除
- 經過指針加速Oracle服務器的查詢速度
- 經過快速定位數據的方法,減小磁盤I/O
- 「相似一本書的目錄」
建立索引
索引的類型
- 單列索引:基於單個列所創建的索引
- 如CREATE index 索引名 on 表名(列名)
- 複合索引(多級索引):基於兩個或多個列的索引,在同一張表上能夠有多個索引,可是要求列的組合必須不一樣
- 如:CREATE index emp_idx1 on emp(ename,job);和CREATE index emp_idx2 on emp(job,ename);
索引底層原理類型
自動建立
在定義PRIMARY KEY 或UNIQUE約
束後系統自動在相應的列上建立惟一性索引
手動建立
用戶能夠在其它列上建立非惟一的索引,
以加速查詢
示例
執行計劃(效率對比-不建立索引和建立索引)
Cost(%CPU)越低越好
建立索引的時機
如下狀況能夠建立索引
- 列中數據值分佈範圍很廣
- 列常常在WHERE子句或鏈接條件中出現
- 表常常被訪問並且數據量很大,訪問的數據大概佔數據總量的2%到4%
如下狀況不該該建立索引
- 表很小
- 列不常常做爲鏈接條件或出如今WHERE子句中
- 查詢的數據大於2%到4%
- 表常常更新(常常更新索引對應的列)
查詢索引
示例
可使用數據字典視圖USER_INDEXES和
USER_IND_COLUMNS查看索引的信息
刪除索引
使用DROP INDEX命令刪除索引
刪除索引UPPER_LAST_NAME_IDX
只有索引的擁有者或擁有DROP ANY INDEX權限的用戶才能夠刪除索引
同義詞(別名)
使用同義詞訪問相同的對象
語法
有否PUBLIC關鍵字表示公有仍是私有同義詞(對於當前用戶)
建立和刪除同義詞
須要權限
建立同義詞
刪除同義詞