Oracle Database-數據處理和表的管理部分

Oracle Database-數據處理和表的管理部分

“Oracle Database logo”的图片搜索结果

*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慢
    • 緣由:Oracle的undo數據功能
  • delete是DML(數據操做語言)語句,truncate是DDL(數據定義語言)語句
  • Delete操做能夠回滾rollback
  • Delete操做能夠閃回(Oracle特有,再事務提交後能夠閃回)
    • 在Oracle中,大部分操做均可以閃回,即大部分操做都是可逆的
  • Delete操做可能產生碎片,而且不釋放空間
    • 關於碎片
    • 碎片使表的數據條目之間不連續,影響查詢的速度
    • 清理碎片的方法:
注意:插入、更新和刪除操做會引發數據的的變化,必須考慮數據的完整性

Oracle中的事務

Oracle中事務的概念

數據庫事務的組成

  • 一個或多個DML語句
  • 一個DDLData Definition Language – 數據定義語言)語句
  • 一個DCLData Control Language – 數據控制語言語句

數據庫事務的執行流程

  • 第一個DML語句的執行做爲開始
  • 如下面其中一種做爲結束
    • 顯示結束commit rollback
    • 隱式結束(自動提交:DDL語言、DCL語言、exit(事務正常退出)
      • DDL語句附帶提交此前事務的操做
    • 隱式回滾系統異常終了)關閉窗口、死機或掉電等

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(行地址):
  • 是一串字符串
  • 使用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-檢查性約束
  • 定義每一行記錄所必須知足的條件
    • 如工資應該是正數(>0)等
  • 下面的表達式可使用在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);
索引底層原理類型
  • B樹(默認)
  • 位圖
自動建立
在定義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關鍵字表示公有仍是私有同義詞(對於當前用戶)

建立和刪除同義詞

須要權限
建立同義詞
刪除同義詞
相關文章
相關標籤/搜索