Oracle基礎學習筆記 最近找到一份實習工作,有點頭疼的是,有階段性考核,這...,實際想想看,大學期間只學過資料庫原理,並沒有針對某一資料庫管理系統而系統的學習,這正好是一個機會,於是乎用了三天時間學習了一下Oracle數據的相關內容,以下是我總結的一些知識點,有錯誤的地方請及時通知我改正。 一 ...
Oracle基礎學習筆記
最近找到一份實習工作,有點頭疼的是,有階段性考核,這...,實際想想看,大學期間只學過資料庫原理,並沒有針對某一資料庫管理系統而系統的學習,這正好是一個機會,於是乎用了三天時間學習了一下Oracle數據的相關內容,以下是我總結的一些知識點,有錯誤的地方請及時通知我改正。
一、Oracle 10g的安裝
首先安裝我就不載這裡贅述了,可以參考這篇博客進行安裝。
https://blog.csdn.net/qq_33458228/article/details/80447199
值得一提的是在安裝中有一個錯誤:在安裝服端時,沒有註意,其預設的埠為1521,而安裝客戶端時,將埠設置成1530,進行測試,結果測試失敗。這個問題的解決參考https://www.cnblogs.com/ShaYeBlog/p/7866707.html。
二、sqlplus基礎命令
我這裡只總結了一些常用的命令。
- win+r 輸入sqlplus 或者在 cmd中輸入sqlplus;
- 用戶名+回車+密碼(不可見),用戶名/密碼(可見);
- show user顯示當前登錄用戶;
- conn 用戶名[/密碼](選填)切換登錄用戶, AS SYSDBA以超級管理員身份登錄;
- clear SCR 清理屏幕;
- SET LINESIZE NUM(數字)設置每行顯示的數據長度,SET PAGESIZE NUM(數字) 設置每頁顯示的長度;
- edit word 打開本機編輯器,@word 執行sql腳本 ,@絕對路徑 執行sql腳本;
- host 調用本地電腦的命令;
- select * from tab; 查看數據表
- DESC 表名稱; 查看表結構。
三、SQL基礎(DQL)
(1)關係型資料庫標準
- 包含:DML(數據操作語言:crud)
- DDL(數據定義語言),DCL(數據控制語言)
(2)簡單查詢操作
- SELECT [DISTINCT] *| 列名稱[別名] ,(可以有多個)| 數據計算 FROM 數據表[別名];
(FROM 子句確定要查詢的數據來源, DISTINCT 消除重覆數據行的顯示(所有內容才消除),’*’ 數據表中所有列的數據); - 常量:字元串用單引號’’,數字直接是寫,Oracle中字元串靠左對齊,數字靠右對齊,為常量追加別名 別名不用加單引號,用 || 拼接字元串 之後只有一列;
(3)限定查詢
- WHERE 子句常用的幾種判斷符號,關係運算(>、<、>=、<=、=、<>、!=、BETWEEN..AND、IN、LIKE、IS NULL;
- Oracle 中數據區分大小寫的;BETWEEN..AND 可以判斷任何數據類型;
- IS NOT NULL 優於 NOT IS NULL;
- LIKE 進行模糊匹配:“_”匹配任意一位字元,“%”匹配0位1位或者多位字元,LIKE可以用於多種數據類型,’%%’效率差比起簡單查詢;
- in (篩選種子),註意:NOT IN 之中出現有null,是程式的問題,如果發現有null,那麼就不進行查詢,也不返回任何內容,所以NOT IN 中一定不能出現null;
- [ORDER BY 排序欄位 [ASC(預設升序) | DESC],排序欄位 [ASC | DESC],..... ],WHERE 在ORDER BY(所有)之前,ORDER BY 最後執行,可以使用SELECT 別名。
(4)多表查詢
- 笛卡爾積,當數據量很高的時候,多表查詢會產生龐大的計算量;
- SQL1999標準
1)、交叉連接 CROSS JOIN 簡單的將數據表關聯在一起,而後會產生笛卡爾積 ;
2)、自然連接 NATURAL JOIN 內連接 ,自動找到同名的欄位採用內連接的模式消除笛卡爾積 USING 設置要進行關聯的欄位,on 設置關聯條件;
3)、外連接 : 有三類外連接 (LEFT OUTER JOIN)、(RIGHRT OUTER JOIN)、(FULL OUTER JOIN);
4)、內連接:等值連接,在之前進行判斷的時候都會使用一些條件得到的相應的數據信息; - Oracle語法
外連接:數據表記錄的全部顯示,有三類,左外(欄位=欄位(+))、右外(欄位(+)=欄位)、全外連接; - 集合操作:[UNION | UNION ALL | MINUS | INTERSECT] 都用於查詢結果。
UNION運算 將集合結果整合在一起使用,但是相同的部分不顯示,UNION ALL 將集合結果保存在一起顯示,重覆部分也顯示;
MINUS運算:差集運算 ;
INITERSECT 運算:返回倆個查詢中的相同部分,交集。
(5)分組統計函數
- COUNT()、SUM()、AVG()、MIN()、MAX()
- COUNT(表中沒有記錄,統計結果是0而不是null,null 和 0 只是在資料庫層面上有所反應,如果在程式的執行之中,null發現接受的類型是整數,自動變成0;
- COUNT() 三種用法,COUNT(*)統計數據表中的行數,COUNT(欄位)如果有null 則不統計,COUNT(DISTINCT 欄位)統計去除重覆
- 分組的預設前提:列上存在有重覆,非絕對 [GROUP BY 分組欄位,分組欄位]
- 分組操作的定義要求:在編寫沒有編寫GROUP BY,這時SELECT 子句中能夠出現統計函數只能表示對整表進行統計操作(整表分為一組),在使用GROUP BY查詢之中,SELECT 子句中只能出現分組欄位和統計函數,其他欄位不允許出現;在分組查詢的時候,統計函數允許嵌套,但是此時的SELECT 子句之中不能夠出現任何欄位,包括分組欄位
- SQL執行順序 先執行WHERE 在執行SELECT ,所以WHERE 中執行統計函數會報錯,HAVING 分組後篩選。
- HAVING和WHERE區別,
WHERE:是在GROUP BY分組前使用,表示要對分組的數據進行篩選,不允許使用統計函數,
HAVING:在GROUP BY之後篩選,可以使用統計函數,分組操作不只可以用GROUP BY 也可以用集合操作。 - 子查詢:常出現位置 WHERE子句 當子查詢返回單行單列、多行單列、單行多列;HAVING子句 子查詢返回單行單列並且需要進行統計操作的時候;FROM 子句:子查詢返回多行多列(表)可以在FROM子句中出現,按照表的形式處理; SELECT子句 子查詢返回單行單列,子查詢為瞭解決查詢的性能問題。WHERE 子句作用,是限制數據表中的數據行的顯示,所以一般做數據篩選;IN 、ANY(三種 =ANY 與IN操作一樣 >ANY 比最小的要大 <ANY 壁比最大的要小)、ALL(所有內容 倆種 >ALL 比集合最大的要大 <ALL 比集合最小的要小)看查詢要求。
- EXISTS運算 (根據子查詢是否有數據的形式來判斷條件是否成立的運算符 特征 只是簡單的判斷是否有數據返回,而並不關心返回的具體數據內容)
- IN 與EXISTS區別 :
IN需要明確的進行數據的判斷,也就是說子查詢之中返回數據的內容要參與運算。
EXISTS 不需要參考具體的返回內容,其只是依靠是否有數據返回來判斷條件是否成立。
(6)Oracle函數
- 格式 返回數據類型 函數名稱(數據|類型名稱)
- 返回數據類型
字元串VARCHAR2,數字NUMBER,日期DATE , - 常用字元串函數:轉大寫函數UPPER(數據 | 列),
轉小寫 LOWER(數據 | 列),
首字母大寫 INITCAP(數據|列),
字元串長度LENGTH(數據 | 列),
截取字元串 SUBSTR(數據|列,截取點[,長度]),
替換 REPLACE (數據|要替換的數據 | 列,替換數據),使用Oracle中的虛擬表驗證函數,表名為 dual;在最初系統設計的時候,把用戶名使用UPPER變為大寫,解決用戶名大小寫不統一的問題; - 常用數值函數:ROUND(數據 | 列[,保留小數位])
四捨五入,TRUNC (數據 | 列 [,保留小數位])
數據截取,MOD(數據 | 列,數據|列):求餘數。
四、Oracle SQL
(1)數據更新操作
- 數據更新操作SQL中分為三種 增加(INSERT)、修改(UPDATE)、刪除 (DELETE)。
- 數據增加: 【推薦】完整語法 INSERT INTO 表名稱(列名稱,列名稱,..) VALUES(內容1,內容2,...) 內容 字元串 用‘’單引號聲明,數字 直接編寫,日期 可以使用SYSDATE 自定義使用TO_DATE()轉換。不設置某些欄位,增加的時候不設置具體的欄位內容 (推薦),或者將欄位內容寫成null。
INSERT INTO VALUES(內容1,內容2,...) - 數據修改:UPDATE 表名稱 SET 欄位1=內容1,欄位2=欄位2,...[WHERE(更新條件s)],當沒寫更新條件時對所有所有數據行進行更新,加上條件,滿足之前限定查詢那樣各種運算符和子查詢。實際開發中不會更新全部的表記錄,都要加WHERE。
- 刪除操作 :(儘可能少用,沒有成熟的系統支持數據刪除)
DELETE FROM 表名稱 [WHERE 刪除條件(s)]刪除所有數據不設置WHERE
在實際項目中刪除操作,數據的刪除分兩種:物理刪除(直接使用DELETE語句舌體刪除乾凈),邏輯刪除(在表中設置一個邏輯位)。在實際開發中,都使用邏輯刪除,所謂刪除只是一個更新處理。
(2)數據偽列
- 偽列指的的是不存在表中的列,但是該列又可以直接使用。
- ORACLE中倆個重量級的偽列ROWNUM(開發中非常常用)、ROWID(資料庫分析);
- ROWNUM 行號 顯示行號 追加ROWNUM 會自動做一個數據增長列 從1開始,不固定,根據結果自動生成。查詢第一行 ,查詢前N行(只能)。
- 數據的分頁顯示[重點]
SELECT *
FROM(
SELECT 查詢欄位,查詢欄位,...,ROWNUM rn
FROM 數據表
WHERE ROWNUM<=currentPagelineSize) temp
WHERE temp.rn>(currentPage-1)lineSize;
其中currentPage描述的是當前所在頁,而lineSize描述的每頁顯示的數據行數 。 - ROWID:指的是數據行的唯一的編號,該編號通過硬碟的存儲而來的,結構組成 數據的對象編號+數據的文件編號+數據保存的文件塊編號+數據保存的行號。
- 面試題:現在有一張數據表,由於某些原因在表設計初期沒有設計到位,導致在數據表之中存在有大量的完全重覆數據,現在要求刪除裡面重覆數據(不是刪除,重覆的保留一個,假設保留最初增加的一個),如何實現?
首先查詢出所有應該被保留的數據(被保留的數據一定是最早增加的),最早的數據的ROWID一定是最小的,可以採用分組的形式處理(每種數據最小的ROWID),既然已經知道了每行數據最小的ROWID,那麼可以直接進行刪除處理,保留最小的ROWID即可。(極端用法)
(3)Oracl事務處理
- 事務處理是關係型資料庫的最大特征,保證數據完整性,要麼全成功,要麼全失敗,造成性能瓶頸。
- 事務控制原理:資料庫與Session ,在每一個Session之中都擁有屬於自己的獨立操作
- ACID(原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durability)一個用戶一個用戶的更新,每個用戶的更新彼此獨立(誰也不妨礙)
- commit 與 rollback
Commit 指的是所有操作要求進行提交(真正進行數據更新);
Rollback 如果發現數據操作操作產生問題的時候就需要進行回滾熟路,回滾到上一次的提交點; - ORACLE中對事物的支持控制本身是提供有一個事物的緩衝區,用戶所發出的所有的更新操作並不是直接立刻反應到資料庫中,(也可以設置關閉事物,這樣所有的更新操作會立刻提交反應大資料庫當中),用戶更新沒問題commit,有問題rollback。
- 事務鎖:對於一行數據當A用戶正在進行更新操作,用戶一定無法進行更新,B用戶等待A用戶commit或者rollback的時候稱為鎖。在進行鎖定的時候除了使用更新操作也可以使用查詢模式;
SELECT * FROM table WHERE param = param FOR UPDATE; 查詢鎖 當前行被鎖定。
(4)數據表的創建與管理
- 數據表的定義屬於SQL-DDL範疇,不受到事務的控制,只有DML操作才受到事務控制,在ORACLE 中:如果當前事物未提交,並且發生了DDL操作,所有未提交的事物將會自動提交,在實際開發中,數據表的創建要麼在系統定義好的同時設置,或者最簡單的方式就是進行關閉服務維護。
- 常用的數據類型
VARCHAR2(n) 200個字以內的數據用此類型
NUMBER: 直接編寫NUMBER表示的就是數字(小數或者是整數)
|-NUMBER(n):表示最多n位整數;
|-NUMBER(n,m):m表示個小數位,n-m的整數位。
DATE ORACLE中DATE類型是包含有時間數據的,而其他資料庫的DATE只有日期。
CLOB 描述大文本數據(4G)
BLOB 描述二進位的數據(4G)
- 創建數據表
CREATE TABLE 表名稱(
列名稱 數據類型 [DEFAULT 預設值],
列名稱 數據類型 [DEFAULT 預設值],
...
列名稱 數據類型 [DEFAULT 預設值]
);
- 表的複製
CREATE TABLE 表名稱 AS 子查詢;為了數據快速查詢,可以採用此模式。
SELECT * FROM table WHERE 1==2 複製表結構 編寫一個絕對不可能滿足的查詢條件
- 修改表名稱
開發中不建議修改表名稱。只有ORACLE 中提供,數據字典:指的是資料庫會自動進行相關數據對象的紀錄。所謂的數據字典可以理解位一張系統維護的數據表,當用戶創建一張數據表之後,用戶所關註的是CREATE TABLE 的語法,在資料庫中會自動的將這個表的名稱以及表的相關信息都保存在一張系統維護的數據表中。表的更新就是數據字典的信息修改,該數據字典一定要由系統維護,所以用戶不具備系統維護,修改數據字典只能夠採用一系列的命令完成。ORACLE數據字典 有三類 USER_:用戶具有的數據字典信息,DEA_:資料庫系統管理員具有的數據字典信息,ALL_*:用戶和管理員都可以訪問的數據字典信息。
RENAME 表名稱 TO 新表名稱;
- 截斷表
表的刪除並不釋放所有的資源,截斷表。表被截斷,該表中所有資源將被徹底釋放 , rollback 無法恢復。
TRUNCATE TABLE 表名稱;
- 刪除表
表一旦被刪除之後預設情況下(大部分情況下是無法進行恢復的)
語法 DROP TABLE 表名稱;
在ORACLE 10g 之前 如果要是進行數據表刪除,那麼直接該表的信息全被刪除了。10g開始 提供恢復的機制。
語法 DROP TABLE 表名稱 PURGE;(徹底刪除)
- 閃回操作
10g開始 提供恢復的機制,當進行刪除數據表操作生成長串表名稱,這就是屬於FlashBack(閃回)技術,相當於回收站的功能。
查看回收站 SHOW RECYCLEBIN(不穩定)
通用的 可以採用數據字典:
SELECT object_name,original_name,droptime
FROM user_recyclebin;
恢復刪除表
FLASHBACK TABLE 表名稱 TO BEFORE DROP;
刪除回收站的表;PURGE TABLE 表名;
清空回收站: PURGE RECYCLEBIN;
- (8)表結構修改
追加表數據列
ALTER TABLE 表名稱 ADD (列名稱 數據類型 [DEFAULT預設值]...)
修改表數據列
ALTER TABLE 表名稱 ADD MODIFY(列名稱 數據類型 [DEFAULT預設值]...)
- 刪除表數據列
AlTER TABLE 表名稱 DROP COLUMN 欄位名稱 ;
- 資料庫對象(DDL)操作只有三類語法:
CREATE 對象類型 對象名稱
DROP 對象類型 對象名稱
ALTER 對象類型 對象名稱
五、約束的創建與管理
(1)約束的定義及分類
- 約束是保證數據完整性的一種手段,而後根據功能約束一共分為六種,其中
一種成為數據類型的約束。
- 非空約束(NOT NULL、NK):保證數據表中的某一個欄位的內容不允許為null;
- 主鍵約束(PRIMARY KEY、PK): 非空約束 + 唯一約束;ONSTRAINT 約束名稱 PRIMARY KEY(數據項,...)多個主鍵都相同才算重覆
- 檢查約束(CHECK、CK):設置一些判斷條件,而後滿足條件的數據允許更新。CHECK( 邏輯條件 )
- 外鍵約束(FOREIGN KEY、FK):設置父子表之間的約束關係。
CONSTRAINT 約束名 FOREIGN KEY(數據項) REFERENECES 表明(數據項);
(2)約束規則
- 先刪除子表,後刪除主表 不然無法刪除。互為父子,刪不了。則用 DROP TABLE member CASCADE CONSTRAINT;不管不顧刪除。
- 對於數據的記錄在預設情況下,必須先刪除父表中的記錄,而後才能刪除子表中的記錄,缺點,刪除父表中的信息 先刪除所有相關信息 ,很麻煩,外鍵設置級聯操作。
- 在外鍵設置 後追加ON DELETE CASCADE 級聯刪除
在外鍵設設置 後追加ON DELETE SET NULL 級聯更新, 是否使用級聯並沒有明確要求,要看業務需求需求。 - 滿足約束條件的數據才能夠被更新處理(才能被保存在資料庫中)
約束越多,資料庫性能越差。單機版可適當完善約束,集群(高性能)主要主鍵約束。 - 唯一約束 最加 UNIQUE 欄位 (null不在唯一約束限定中)
實際上所有的約束在oracle資料庫之中都會成為一個個獨立的資料庫對象,如果沒有為約束設置對象的名字,那麼會由系統自動的分配一個唯一的名稱進行該對象的標註。所以如果要查看約束的基本信息要查看數據字典。 - SELECT * FROM user_constraints; 查看約束與對應數據表
SELECT * FROM user_cons_columns; 查看約束
設置約束名稱 CONSTRAINT 名稱 UNIQUE(數據項) 放便排查錯誤。方便維護;
- 設置約束:在以後任何的系統資料庫設計的時候,當你的數據表創建完成後一定要將約束同時建立完整,並且不要進行約束的變更。
- 語法ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(欄位);
ALTER TABLE 表名稱 ADD CONSTRAINT 語法只能追加非空以外的約束。
追加非空約束必須修改表結構的方式完成:
ALTER TABLE 表名稱 MODIFY(欄位 類型 NOT NULL);
刪除表名稱:
ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱;
六、Oracle序列
- 所謂序列本質上指的就是自動增長列的配置實現。
ORACLE 開始到 11g 沒有自動增長列的設置,他所提供的是一種手工的控制序列的模式來實現自動增長列(自己手工控制)。 - 用戶想要進行序列的創建,可用如下語法:
CREATE SEQUENCE 序列名稱
[START WITH 開始值]
[INCREMENTY BY ]
[MAXVALUE 最大值 | NOMAXVALUE]
[MINVALUE 最小值 | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE 緩存個數 | NOCACHE]
預設情況
開始值(START WITH): 1;
步長(INCREMENTY BY):1;
最大值:NOMAXVALUE;
最小值:1;
非迴圈序列:NOCYCLE;
緩衝個數為20個:CACHE 20;
序列信息保存在數據字典中。SELECT * FROM user_sequences;
使用序列
序列名稱.nextval 獲取下一個增長值,也就是說當前內容加上步長。
序列名稱.currval 獲取序列當前的內容;
|- 一定要先調用 序列名稱.nextval 後才可以調用序列名稱.currval,不然會出現“序列尚未定義的錯誤”;
根據數據字典裡面可以發現序列最後一次的內容使用了“LAST_NUMBER”來表示,增長是利用 “步長 * 緩存個數 ”,在oracle資料庫裡面為了防止每一次都頻繁的進行計算,所以幫助用戶做緩存處理。提高操作性能,一旦資料庫停掉,可能產生跳號。
結合到數據表中,只能利用增加語句進行操作。
INSERT INTO 表名(欄位1,欄位2,...) VALUES(序列名.nextval,數據1,...);
修改序列的預設值, CTEATE SEQUENCE 序列名 追加 設置
七、Oracle同義詞
- Dual 是sys的用戶表
- 資料庫之中有一個模式的概念(SCHEMA),每一張數據包的全名實際上就是“schema.table”,對於模式最初的時候是要用戶單獨創建的,後來設計者們覺得這樣的設計比較複雜,將模式與用戶名的概念結合在一起了,所以現在的模式基本上指的是用戶名。也就是說對於emp而言,完整的表名稱:scott.emp。
- 發現不同用戶之間要進行數據表訪問的時候需要追加用戶名,但是為什麼scott訪問scott訪問dual表的時候沒有設置這個用戶名呢?
- 之所以允許這樣的訪問就是因為dual屬於sys.dual的同義詞。所以在ORACLE中的同義詞的主要目的是為了方便不同用戶的數據表的訪問,並且如果想要創建同義詞都要具備有管理員的許可權完成。
- 將scott.emp 的數據表創建為emp的同義詞。
語法: CREATEA [PUBLIC] SYSONYM 同義詞名稱 FOR 用戶名.表名稱; - 將同義詞創建完成之後就可以直接利用同義詞的名稱進行訪問 ;
這個時候所創建的同義詞只能夠由sys一個用戶使用,因為其不是公共同義詞,如果一個同義詞要被所有的用戶訪問,則在創建前要追加一個PUBLIC。
刪除同義詞 DROP SYNONYM emp;
同義詞只是ORCALE資料庫支持的技術。
八、視圖的定義與使用
- 視圖的定義:它的主要功能是封裝複雜的查詢語句,也就是說利用視圖就可以實現數據的複雜查詢操作。如果要想創建視圖,採用如下語法:
CREATE [OR REPLACE] VIEW 視圖名稱 AS 子查詢
[WITH CHECK OPTION] [WITH READ ONLY];
- 如果說你現在的項目裡面提供有開發視圖,如果使用 CREATE OR REPLACE 表示該視圖如果不存在,則創建,如果存在則用新的sql替換。
Scott之前有創建視圖的許可權,之後的版本許可權被剝削了。
重新授權
CONN sys/sys AS SYSDBA;
GRANT CREATE VIEW TO scott;
查詢視圖: SELECT * FROM myview;
- 在實際之中數據表的查詢都是比較複雜的,所以在一些傳統的技術開發中,視圖的數量超過表的數量。隨著現在的一些開的發(很難找到所謂的專業的資料庫開發人員了),這樣一來,所有編寫複雜語句的工作又都回到程式員身上了,所以很多程式員為了代碼修改放便,都不再使用視圖了。
- 對於視圖而言,支持的功能還是很多的(很多的功能想用,自己寫替代的觸發器),視圖是一個查詢結果,並不表示真是的數據,所以理論上視圖是不應該被修改的,如果預設情況下如果不進行任何的配置,視圖中的數據是允許修改的(簡單的情況下)。
- 修改視圖中的數據並且影響了原始的數據,最關鍵的是修改的欄位為視圖的創建條件欄位,很明顯這樣的作法不合理,所以為了保證創建欄位的內容不被改變,這個時候可以考慮使用一個子句 [WITH CHECK OPTION]。其他欄位依然可以允許用戶修改,但是視圖之中並不是真實的數據,所以為了保證視圖不可更改,建議追加 [WITH READ ONLY] 配置為只讀視圖。
強烈建議都採用只讀模式。
刪除視圖: DROP VIEW myview;
九、Oracle索引
- 在資料庫裡面索引是一種相對提升資料庫查詢性能的技術手段。
限定查詢,觀察查詢處理過程,通過管理員賬戶啟動軌跡追蹤器進行瀏覽;
切換到管理員賬戶:CONN sys/sys AS SYSDBA;
打開執行追蹤器:SET AUTOTRACE ON;
執行限定查詢:SELECT * FROM WHERE 條件;
- 預設情況下數據執行時採用的全表掃描(逐行掃描)。數據量很大,執行的速度一定很慢。
解決方案,“排序”,資料庫里對於不查詢的數據的排序方案就是將其行程一顆樹,排列形式:取第一個數為根節點,而後比根節點小的數據放在左邊,比根節點大數放在右邊。
經過排序之後會發現如果要是以本樹的形式進行查詢,則查詢的數據量會有所減少,則連帶的查詢性能也會得到提升。
- 在資料庫之中對於索引的創建有兩種形式:
當數據列上使用了主鍵約束或唯一約束的時候自動創建索引。
自己手工明確一個查詢的欄位,手工創建索引。
CREATE INDEX scott.emp_sal_ind ON scott.emp(sal);
雖然使用索引提升了性能,但是索引並不是真的100%進行性能提升,索引實現的關鍵是在於整個資料庫之中索引樹的維護,如果沒有這顆樹,那意味著索引將無法使用,但是這棵樹採用的是指定的索引欄位才轉換的樹,如果該欄位上的內容頻繁修改,那麼就將有大量的記憶體和性能浪費在了這顆樹的維護上,那麼反而會造成性能的下降,索引只是一種相對的手段,而選擇建立的索引的欄位也要根據實際的情況有所調整。
十、用戶管理
- SQL語句有三個方面:DML、DDL、DCL。其中DCL指的是資料庫的控制語言,也就是說進行許可權控制的處理操作,在DCL中,主要有兩個語法:GRANT(授權)、REVOKE(回收)。如果要想正常的去使用DCL還是要結合用戶來完成,而用戶在資料庫之中被稱為對象。
- 要進行用戶的維護,那麼一定要採用管理員賬戶登錄,本次使用sys登錄:
CONN sys/sys AS SYSDBA;
創建用戶 CREATE USER dog IDENTIFIED BY wangwang ;
打開新的sqlplus客戶端進行用戶的登錄,但是此時會發現出現如下提示信息:ORA-01045:user DOG lacks CREATE SESSION privilege;
- 現在只是一個普通的dog用戶,但是這個dog用戶並沒有任何的許可權,本次缺少的CREATE SESSION 的許可權。表示用戶無法創建SESSION(無法登錄);
將session許可權授權給DOG,GRANT CREATE SESSION TO DOG;
然後dog用戶就可以進行登錄操作,進行序列與數據表的創建,
CREATE SEQUENCE 、CREATE TABLE 許可權不足。
ORACLE里提供了倆個角色(每個角色包含多個許可權):CONNECT、RESOURCE,最簡單的做法是將這倆個角色授予dog用戶:GRANT connect,resource TO dog;
授權完成之後如果想要使用,則要重新登錄。
- 一旦有了用戶的產生之後那麼也會出現一些用戶的維護:
重置用戶密碼:ALTER USER dog IDENIFIED BY wangwang;
讓密碼失效:ALTER USER dog PASSWORD EXPIRE;
鎖定用戶:ALERT USER dog ACCOUNT LOCK;
解鎖用戶:ALERT USER dog ACCOUNT UNLOCK;
- 如果現在不同用戶之間要進行訪問,那麼必須具有其他用戶的對象許可權,而對象許可權一共有四種:SELECT、INSERT、UPDATE、DELETE。
將scott.emp表的SELECT、INSERT許可權授予dog用戶:
GRANT SELECT,INSERT ON scott.emp TO dog; - 對象許可權的回收:
REVOKE SELECT,INSERT ON scott.emp FROM dog;
回收角色:
REVOKE connect,resource FROM dog;
回收連接的許可權:
REVOKE CREATE SESSION FROM dog;
這個時候dog沒有任何許可權了,那麼此用戶也不再需要了,則可以進行用戶的刪除: DROP USER dog CASCADE; 用戶有可能有各種對象的創建,所以刪除的時候一定要將這些遺留的內容一起刪除掉。
十一、資料庫備份
- 資料庫管理員(DBA),對於這一職業工程師其最主要的工作就是進行數據備份與災難恢復的。如果發生了一些外在的因素,那麼就必須可以及時的恢複數據執行。資料庫的運行之中為了保證出現災難之後可以及時恢復,那麼也就需要進行數據的備份。
- 數據的導入與導出
數據導出:
現在假設將所有的數據導出到:D:\backup 目錄之中,建立一個目錄
D: -> mkdir backup -> cd backup
執行導出命令 exp;
|-輸入要導出數據的用戶名 : scott/scott
|-設置導出的文件名稱,預設為導出文件“EXPDAT.DMP”
|-導出全部數據表:U(將該用戶下的表都導出)
數據導入:
執行“imp”指令:
|-導入文件:EXPDAT.DMP - 資料庫冷備份
資料庫的冷備份是一種較為全面的資料庫的備份處理模式,利用資料庫冷備份操作可以保證所有的數據都是歸檔數據。要進行歸檔備份,就必須清楚資料庫的存儲結構。 - ORACLE資料庫是以文件的形式存儲的,也就是說在一塊磁碟上會劃分出不同的文件區,而每個文件區可以保存相應的數據。對於表空間的理解,如果將圖書比喻為一張數據表,那麼表空間就好比圖書架,整個的文件就是圖書館,一個城市有多種圖書館。
- 進行如下幾個重要的文件備份:
備份控制文件,控制整個Oracle資料庫的服務信息,通過“v$controlfile”獲得。
備份重做日誌文件,通過“v$logfile”數據字典獲得。
數據文件:保存真實的數據信息,通過“v$datafile”數據字典獲得;
核心配置文件(pfile):整個Oracle核心參數。
使用sys賬戶進行登錄:
Conn sys/sys AS SYSDBA
查看控制文件的路徑:
SELECT * FROM v$controlfile;
查看日誌文件的路徑:
SELECT * FROM v$logfile;
查看數據文件的路徑:
SELECT * FROM v$datafile;
查看pfile文件路徑:
Show parameter pfile;
關閉Oracle的服務(立即執行):
SHUTDOWN IMMEDIATE
將之前記錄好的路徑文件都拷貝到其他的磁碟上去;
恢復Oracle資料庫的實例:startup;
前提要求:允許關閉服務,也就是說如果你現在進行的是一些企業內網的項目開發,可以,如果是7*24小時運行的伺服器,那麼就應該需要進行熱備份。熱備份最簡單的方法就是建立主從關係。
十二、資料庫設計範式
- 核心本質在於設計出方便擴展,並且存儲精準數據結構,並且可以有效的滿足於程式開發的需求。從另外的一個層次來講,資料庫設計沒有模式,核心:保證數據有效存儲,保證查詢性能。
- 第一設計範式
設計要求:數據表中的每個欄位不可再分
註意:
中國姓名就是姓名,國外分為姓(firstname)、名(lastname);
在設計的時候應該儘可能使用資料庫支持的幾種數據類型(字元串、數字、日期、大文本),不要將日期拆分出來
- 第二設計範式
設計原則:數據表中不存在非關鍵欄位對任意一候選關鍵欄位的部分函數依賴。所以對第二範式有倆層理解:
函數關係:欄位間的函數關係 A*B = C
函數依賴:不同的欄位可以得到相同或者不同的結果。
無法確認主鍵,數據冗餘(重覆),數據更新麻煩
- 第三設計範式
設計原則:數據表之中不存在非關鍵欄位對任意一候選關鍵欄位的傳遞函數依賴。實際上傳遞的函數依賴就好比層級關係一樣。
第一範式就是單表設計原則,第二範式就是多對多關係,第三範式一對多關係。
實際的原則:打破範式的約束,使用冗餘欄位。
後記
筆記做得可能很糟糕,層次可能有些混亂。水平有限,我會繼續努力的。
Oracle還有一個大的內容是PL/SQL,看了一小部分,怎麼說呢,相當於學一門新的語言,但是感覺不怎麼通用,我這裡就沒有再很深入的學習了。
BE GEEK ARTIST