Oracle基礎學習筆記
最近找到一份實習工做,有點頭疼的是,有階段性考覈,這...,實際想一想看,大學期間只學過數據庫原理,並無針對某一數據庫管理系統而系統的學習,這正好是一個機會,因而乎用了三天時間學習了一下Oracle數據的相關內容,如下是我總結的一些知識點,有錯誤的地方請及時通知我改正。html
1、Oracle 10g的安裝
首先安裝我就不載這裏贅述了,能夠參考這篇博客進行安裝。
https://blog.csdn.net/qq_33458228/article/details/80447199
值得一提的是在安裝中有一個錯誤:在安裝服端時,沒有注意,其默認的端口爲1521,而安裝客戶端時,將端口設置成1530,進行測試,結果測試失敗。這個問題的解決參考http://www.javashuo.com/article/p-xuzzzpbr-a.html。程序員
2、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 表名稱; 查看錶結構。
3、SQL基礎(DQL)
(1)關係型數據庫標準sql
- 包含: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)分組統計函數session
- 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(數據 | 列,數據|列):求餘數。
4、Oracle SQL
(1)數據更新操做oracle
- 數據更新操做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 對象類型 對象名稱
5、約束的建立與管理
(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 約束名稱;
6、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 序列名 追加 設置
7、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數據庫支持的技術。
8、視圖的定義與使用
- 視圖的定義:它的主要功能是封裝複雜的查詢語句,也就是說利用視圖就能夠實現數據的複雜查詢操做。若是要想建立視圖,採用以下語法:
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;
9、Oracle索引
- 在數據庫裏面索引是一種相對提高數據庫查詢性能的技術手段。
限定查詢,觀察查詢處理過程,經過管理員帳戶啓動軌跡追蹤器進行瀏覽;
切換到管理員帳戶:CONN sys/sys AS SYSDBA;
打開執行追蹤器:SET AUTOTRACE ON;
執行限定查詢:SELECT * FROM WHERE 條件;
- 默認狀況下數據執行時採用的全表掃描(逐行掃描)。數據量很大,執行的速度必定很慢。
解決方案,「排序」,數據庫裏對於不查詢的數據的排序方案就是將其行程一顆樹,排列形式:取第一個數爲根節點,然後比根節點小的數據放在左邊,比根節點大數放在右邊。
通過排序以後會發現若是要是以本樹的形式進行查詢,則查詢的數據量會有所減小,則連帶的查詢性能也會獲得提高。
- 在數據庫之中對於索引的建立有兩種形式:
當數據列上使用了主鍵約束或惟一約束的時候自動建立索引。
本身手工明確一個查詢的字段,手工建立索引。
CREATE INDEX scott.emp_sal_ind ON scott.emp(sal);
雖然使用索引提高了性能,可是索引並非真的100%進行性能提高,索引實現的關鍵是在於整個數據庫之中索引樹的維護,若是沒有這顆樹,那意味着索引將沒法使用,可是這棵樹採用的是指定的索引字段才轉換的樹,若是該字段上的內容頻繁修改,那麼就將有大量的內存和性能浪費在了這顆樹的維護上,那麼反而會形成性能的降低,索引只是一種相對的手段,而選擇創建的索引的字段也要根據實際的狀況有所調整。
10、用戶管理
- 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; 用戶有可能有各類對象的建立,因此刪除的時候必定要將這些遺留的內容一塊兒刪除掉。
11、數據庫備份
- 數據庫管理員(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小時運行的服務器,那麼就應該須要進行熱備份。熱備份最簡單的方法就是創建主從關係。
12、數據庫設計範式
- 核心本質在於設計出方便擴展,而且存儲精準數據結構,而且能夠有效的知足於程序開發的需求。從另外的一個層次來說,數據庫設計沒有模式,核心:保證數據有效存儲,保證查詢性能。
- 第一設計範式
設計要求:數據表中的每一個字段不可再分
注意:
中國姓名就是姓名,國外分爲姓(firstname)、名(lastname);
在設計的時候應該儘量使用數據庫支持的幾種數據類型(字符串、數字、日期、大文本),不要將日期拆分出來
- 第二設計範式
設計原則:數據表中不存在非關鍵字段對任意一候選關鍵字段的部分函數依賴。因此對第二範式有倆層理解:
函數關係:字段間的函數關係 A*B = C
函數依賴:不一樣的字段能夠獲得相同或者不一樣的結果。
沒法確認主鍵,數據冗餘(重複),數據更新麻煩
- 第三設計範式
設計原則:數據表之中不存在非關鍵字段對任意一候選關鍵字段的傳遞函數依賴。實際上傳遞的函數依賴就比如層級關係同樣。
第一範式就是單表設計原則,第二範式就是多對多關係,第三範式一對多關係。
實際的原則:打破範式的約束,使用冗餘字段。
後記
筆記作得可能很糟糕,層次可能有些混亂。水平有限,我會繼續努力的。 Oracle還有一個大的內容是PL/SQL,看了一小部分,怎麼說呢,至關於學一門新的語言,可是感受不怎麼通用,我這裏就沒有再很深刻的學習了。 BE GEEK ARTIST