Oracle 學習筆記



2019_6_27日 星期四

第一章 oracle從入門到精通
Laarry Ellison: 拉里.埃里森
Bruce Scott: Tiger PointBase(WebLogic軟件產品中附贈的數據庫產品)


1.1 oracle安裝
oracle從實際的開發來講,oracle11g是使用較多的,oracle的開發主要
分為兩類:
.數據庫管理類:DBA
.數據庫的編程:SQL編程 PL/SQL(子程序,觸發器,面向對象,游標)

oracle下載的文件有兩個壓縮包,對於這兩個壓縮包建議分別解壓縮,
而后合並成一個再進行安裝啟動
但是在進行oracle安裝前要注意一下問題:
1.如果你的電腦上有各種病毒防火牆,建議關閉
2.在安裝前,保證你的系統是健康的

oracle只是一個數據庫平台,里面可能存在多個數據庫

在oracle數據庫里面,有一個比較牛的專業:IBM AIX+RAC

在進行安裝時選擇“高級配置”,配置編碼,同時需要定義樣本數據

在配置數據庫名稱時,會存在一個sid的內容,這個指的是Service ID
,服務ID,它的主要作用是數據庫的網絡連接使用,一般情況下,建議數據
庫名稱與SID一致


在oracle數據庫中默認提供若干個用戶,每個用戶有不同的權限,此處會
詢問是否為每個用戶創建各自的用戶和密碼

進入到檢測階段,出現問題可以忽略

在安裝完后,會進行用戶的權限控制
在此處需要配置四個用戶的密碼:現在所配置的密碼是通用密碼。
.超級管理員:sys/change_on_install
.普通管理員:system/manager
.普通用戶:scott/tiger(是在選定了“樣本方案數據庫之后產生的”)
.大數據用戶:sh/sh

1.2 oracle的服務
oracle在使用的過程中必須啟動系統服務,並且在oracle安裝完成后
會自動地配置如下幾個服務項(在服
務中自己找)
因為oracle會占用大量的系統內存,所以對oracle數據庫的服務建議
手動啟動,在所有的服務中,有兩個服務是尤為重要的服務
OracleOraDb11g_home1TNSListener:監聽服務
客戶端訪問本機時使用

OracleServiceORCL:數據庫的實例服務
在oracle平台上可以同時配置多個數據庫,"Configration Assistant"這個工具
可以建議多個數據庫,每一個數據庫建立完成后都會按照"ServiceSID"這個服務


1.3 sqlplus的操作
1.格式化操作
數據庫本身是由一系列的數據表組成,所謂的表,就是行與列的集合
查詢emp表的全部內容:select * from emp
設置每行顯示的數據長度:SET LINESIZE 300;
設置每頁顯示的行數:SET PAGESIZE 30;
這些格式化的操作只是針對於數據庫直接操作進行的,而在實際開發中
都是通過程序讀取,所以這種格式化沒有太大的意義。

對列進行格式化:col 列名稱 FOR A 長度數字c

2.調用記事本:"ed hello"
在使用ed命令時,如果不設置文件后綴,則默認使用的是.sql文件
同時這個文件會保存在用戶目錄下,可以在打開的記事本中編寫命令e
並保存。co
如果想要執行該文,則使用 @文件名
利用@指令也可以調用磁盤上的文件,如果這個文件的后綴是"*.sql"
則可以不寫文件的后綴 @e:data

3.顯示用戶
在一個數據庫中會有多個操作用戶,如果想要確定當前用戶是哪一位,則使用 show user 命令。

用戶的切換:conn 用戶名[密碼][AS SYSDBA]
如果現在使用的是sys用戶登錄,這屬於超級管理員,那么必須設置SYSDBA,
否則無法登陸

如果使用sqlplus時,不需要用戶登錄,則加一個 /nolog 的參數 sqlplus /nolog

4.調用本機程序
在sqlplus中充分考慮到用戶可能使用的系統命令,所有提供一個HOST指令
可以在host指令之后調用本機的指令執行
HOST COPY e:\data.sql e:\hello.sql


1.4 認識SQL
SQL:結構化的查詢語句
SQL語句本身也分為若干個子類:
1.DML (數據庫操作語言) 數據的更新與查詢
2.DDL (數據庫定義語言) 數據庫的定義語言
3.DCL (數據庫控制語言) 數據庫的權限控制


scott用戶表
1.如果想要知道一個用戶(模式)所有的數據表,那么可以使用如下語法完成
SELECT * FROM tab;

2.查看某張表具體的結構
DESC 表名

3.scott用戶中存在的四張表:
部門表:dept
雇員表:emp
工資等級表:salgrade
工資表:bonus 表中沒有任何數據

 

6.28 星期五
第二章 SQL基礎查詢
2.1 SQL簡單查詢(主要特征是操作數據列,並未操作數據行)
||表連接
SELECT empno||ename FROM emp
SELECT '姓名:'||ename||' 編號:'||empno FROM emp;

普通數字:可以直接編寫(SELECT ename|| 1 FROM emp)
字符串: 使用單引號聲明(SELECT ename||'hello' FROM emp)

DISTINCT關鍵字:主要的目的是為了消除重復的關鍵字


2.2 SQL限定查詢 (對數據進行篩選 where)
【3.選出需要的數據列】 SELECT [DISTINCT] *|列[別名],列[別名]...
【1.確定數據來源】FROM 表名[別名]
【2.篩選數據行】[WHERE 限定條件]

關系運算:> = < >= <= !=(<>)
范圍運算:BETWEEN...AND
空判斷: IS NULL IS NOT NULL
IN 判斷: IN ,NOT IN, exists()
模糊查詢:like

以上限定符都只能夠判斷一次,如果現在有若干個限定符,那么就需要
若干個限定符的邏輯運算:AND,OR ,NOT
以上所給出的判斷是SQL中的標准支持,其他數據庫可能有自己的標准內容

1.=:除了在數字上使用外,還可以在字符串上使用
2.在oracle中:數據是區分大小寫的
3.在oracle中的所有運算都不受數據類型的控制,除了數字,還可以使用字符串或者
日期進判斷。字符串的意義不大,重點來看日期判斷

4.某些數據列上是允許為null的,但是null不能使用關系運算判斷,關系可以判斷的是
數字和字符串,但是null既不是字符串,也不是數字0,所以在oracle中
只能通過IS NULL來判斷是否為空

5.若NOT IN中出現null,則不會有任何數據返回

6.關於like的兩種查詢
1)如果使用LIKE查詢時,未使用任何的關鍵字,表示查詢全部
2)LIKE可以再任何數據類型上使用

 


6.29 星期六
2.3 排序查詢 order by
【3.選出需要的數據列】 SELECT [DISTINCT] *|列[別名],列[別名]...
【1.確定數據來源】FROM 表名[別名]
【2.篩選數據行】[WHERE 限定條件]
【4.數據排序】[ORDER BY 排序字段 [asc|desc]]...

排序可以在任意數據類型上進行(默認升序排列)

字段的混合排序,所有的排序操作都是在where篩選之后進行的

 

第三章 單行函數
3.1 單行函數簡介
根據函數的特點,單行函數可以分為以下幾種
1.字符串函數
2.數值函數
3.日期函數
4.轉換函數
單行語句可以在SQL語句的任意位置上出現


3.2 字符串函數
字符串函數可以針對於字符串數據進行處理,在oracle中對於此類函數定義
UPPER() LOWER() INITCAP() REPLACE() LENGTH() SUBSTR()
1.大小寫轉換函數
UPPER(列|字符串)

2.首字母大寫(首字母大寫,其余字母都是小寫)
字符串 INITCAP(列|數據)
SELECT INITCAP(ename) FROM emp;

3.計算字符串的長度
數字 LENGTH(列|字符串數據)
SELECT ename,LENGTH(ename) FROM emp;

4.z字符串的替換函數
字符串 REPLACE(列|數據,要查找的內容,新的內容)
SELECT REPLACE(ename,UPPER('a'),'');
實際上利用REPLACE()可以取消掉字符串中的全部空格數據:
SELECT REPLACE('Hello World',' ','') FROM dual;

5.字符串的截取(下表從1開始)
語法1:字符串 SUBSTR(列|數據,開始點),從指定的開始點一直截取到結尾
語法2:字符串 SUBSTR(列|數據,開始點,結束點),截取指定范圍的字符串
SUBSTR()索引可以支持負數
Oracle中字符串的索引都是從1開始,即使設置為0,也會自動變為1


3.3 數值函數
1.ROUND()
2.TRUNC()
3.MOD()

1.四舍五入函數
數字 ROUND(列|數字 [,保留小數位]) ,如果不設置保留小數位則表示不保留

2.截取小數
TRUNC(列|數字 [,保留小數位])

3.求模
MOD(列1|數字1,列2|數字2)


3.4 日期函數
日期函數主要是進行日期處理的,但是在日期處理過程中會存在一個關鍵性的問題
:如何獲取當前時間。為此在Oracle中專門提供了一個偽列,這個列不存在於表中
但是可以進行查詢,那么這個偽列就是SYSDATE
SELECT SYSDATE FROM dual;

實際上對於日期計算提供有以下三種計算模式:
日期+數字=日期(若干天之后的日期)
日期-數字=日期(若干天之前的日期)
日期-日期=天數(兩個日期之間的天數)

1.計算兩個日期間所經歷的月數總和
數字 MONTHS_BETWEEN(日期1,日期2);

計算兩個日期間的年限
MONTHS_BETWEEN(日期1,日期2)/12

2.增加若干月之后的日期
語法:日期 ADD_MONTHS(日期,月數);

3.計算指定日期所在月的最后一天
日期 LAST_DAY(日期);


3.5 轉換函數(重點)
所謂的轉換函數就是實現字符串與日期,數字之間的轉換。轉換函數一共有三種
TO_CHAR()

1.字符串 TO_CHAR(日期|數字|列,轉化格式)
對於日期的轉換格式而言主要有兩類格式:
|-日期轉為字符串:年(yyyy),月(mm),日(dd),時(hh,hh24),分(mi),秒(ss)
|-數字轉化為字符串:任意一位數字9 貨幣L

(一定要記住:這樣的轉換操作只是給我們提供了一個思想:日期要想轉變格式
,最終需要轉換為字符串,但是這樣會破壞數據的一致性)

好處:可以拆分出日期的年,月,日

2.轉日期函數 TO_DATE();
如果說一個字符串按照"'日-月-年'"的方式編寫,那么可以自動轉化為日期類。
字符串轉化為日期類型,這個可以依靠為TO_DATE();

TO_DATE(字符串,轉換格式);


3.轉數字函數
數字 TO_NUMBER(字符串);

 

3.5 通用函數(Oracle自己的特色)
在Oracle中提供有兩個簡單的數據處理函數:NVL() DECODE().並且隨着版本的提升衍生出
許多子函數。
1.處理null null在進行任何數學計算后,結果都是為空,在實際的計算過程中
如果發現內容為空,則用0來替代
NVL(列|null,默認的替代值);

2.多數值判斷
所謂的多數值判斷,指的是根據不同的結果在輸出的時候進行一個數據的轉換
DECODE(列,匹配內容1,顯示內容1,匹配內容2,顯示內容2,未匹配內容的默認值);

 


第四章 多表查詢
1.多表查詢的意義以及基本問題
2.表的連接查詢
3.SQL:1999語法標准對多表查詢的支持
4.數據的集合操作

4.1 認識多表查詢
實際上所謂的多表查詢就是從多張數據表中取出數據並且顯示的一種操作

多表連接雖然消除了顯示的笛卡爾積,但是笛卡爾積一致存在着,是無法消除的
如果說表之間的數據量小還可以承受,如果數據量大,那么多表查詢會帶來嚴重的
性能問題

判斷是程序慢,還是數據庫數據量大:
程序算法慢(CPU占用率高)
數據庫數據量大(內存占用率高)


4.3 表的連接
實際上對於兩張數據表進行多表查詢對於消除笛卡爾積來講主要是依靠連接模式來處理的
數據庫有兩種連接模式:
1.內連接
2.外連接

4.4 SQL:1999語法定義
SELECT [DISTINCT] *|列[別名],列[別名],...
FROM 表1[別名]
[CROSS JOIN 表2[別名]]
[NATURAL JOIN 表2[別名]]
[JOIN 表2[別名] ON(條件)|USING(關聯字段)]
[LEFT|RIGHT|FULL OUTER JOIN 表2];

1.交叉連接:目的是差生笛卡爾積
[CROSS JOIN 表2[別名]]

2.自然連接(內連接):利用關聯字段自己進行笛卡爾積的消除
(只要字段名稱相同 自己匹配)
[NATURAL JOIN 表2[別名]]

3.外連接
SELECT [DISTINCT] *|列[別名],列[別名],...
FROM 表1[別名]
[LEFT|RIGHT|FULL OUTER JOIN 表2];

全外連接:將左表和右表全都顯示


4.4 數據集合操作
數字集合:交集、並集、差集、補集
UNION: 並集(消除重復的數據)
UNION ALL: 和(將所有的數據加在一起)
INTERSECT: 交集
MINUS: 差集

可是在使用集合操作之中有一件非常重要的注意事項,由於集合的操作最終是需要將
若干個查詢結果合並為一個查詢結果,所以要求這若干個查詢結果所返回的數據必須相同

 

第五章 分組統計查詢
1.統計函數的使用
2.分組統計查詢的實現
3.對分組數據的過濾

5.1 統計函數(也稱為分組函數)
count()
實際上針對COUNT()函數有三種使用形式:
COUNT(*):可以准確地返回表中的全部記錄數
COUNT(字段):統計不為null的所有數據量
COUNT(DISTINCT 字段):消除重復數據之后的結果

 

7.2 星期二
5.2 分組統計查詢
【4.選出需要的數據列】 SELECT [DISTINCT] *|列[別名],列[別名]...
【1.確定數據來源】FROM 表名[別名]
【2.篩選數據行】[WHERE 限定條件]
【3】[GROUP BY 分組字段,分組字段,分組字段...]
【5.數據排序】[ORDER BY 排序字段 [asc|desc]]...

實際上GROUP BY子句之所以使用麻煩,是因為分組的時候有一些約定條件
.如果查詢不使用GROUP BY子句,那么SELECT語句中只允許出現統計函數,
其他任何字段不允許出現

.如果查詢中使用了GROUP BY子句,那么SELECT子句中只允許出現
分組字段,統計函數,其他字段都不允許出現

.統計函數允許嵌套,但是嵌套之后的SELECT子句里面只允許出現嵌套函數
而不允許包括分組字段


5.3 多表查詢與分組統計(重點)
對於GROUP BY子句而言實在WHERE 子句之后執行的,所以在使用時,可以進行限定查詢,
也可以進行多表查詢


5.4 having子句(group 分組上進行限定)
having 是在GROUP BY分組之后才進行的篩選,在HAVING里面可以直接使用統計函數

WHERE與HAVING的區別?
.WHERE子句是在GROUP BY分組之前進行篩選,並且不允許使用統計函數
.HAVING子句是在GROUP BY分組之后執行,可以使用統計函數


5.5 分組查詢案例
范例:顯示所有非銷售人員的工作名稱以及從事同一工作的雇員的月工資的總和,
並且從事同一工作的雇員的月工資的總和大於5000,且按照工資總和升序排列
SELECT job,SUM(sal) sum
FROM emp
WHERE job <>'SALEMAN'
GROUP BY job
HAVING SUM(sal)>5000
ORDER BY sum asc;

 

第六章 子查詢
1.分析子查詢的使用情況
2.子查詢對於查詢性能的幫助

所有可能出現測子查詢都需要使用()聲明。所謂的子查詢實質上就屬於我們的查詢嵌套
而且從理論上來講,查詢的任意位置上都可以出現子查詢,但是出現子查詢
最多的位置:WHERE FROM.所以針對於子查詢的出現給出幾個個人的
使用方案。


6.1 在where子句中使用子查詢
6.1.1 子查詢返回單行單列

6.1.2 子查詢返回單行多列

6.1.3 子查詢返回多行單列
如果說子查詢返回了多行單列的數據,那么實質上就告訴了用戶一個數據的范圍。
如果想要進行一個范圍的判斷,在WHERE子句里提供有主要的三個運算符:
IN ANY ALL

1)IN 操作,是指內容可以在指定的范圍之中存在
多行單列就相當於給出了我們的查詢范圍

NOT IN:一定要保證子查詢中沒有空

2)ANY 操作
對於ANY的操作有三種子操作
a.= ANY (本質上與IN沒有任何區別)

b.>ANY (比最小的內容要大)

c. < ANY (比最大的內容要小)


3)ALL操作
>ALL (比最大的內容要大)

<ALL (比最小的內容要小)


4)exist()
如果現在子查詢有數據返回(不管什么數據),就表示條件滿足,就可以顯示出數據,否則不顯示

 

6.2 在HAVING子句中使用子查詢

6.3 在SELECT語句中使用子查詢

6.4 FROM子句中出現子查詢
為了解釋這種查詢的作用,下面做一個簡單的查詢
范例:查詢出每個部門的編號,名稱,位置,部門人數,平均工資

SELECT d.deptno,d.name,d.loc,count(*),AVG(sal)
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.name,d.loc


SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg
FROM dept d,(
SELECT deptno,COUNT(empno) count,AVG(sal) avg
FROM emp GROUP BY deptno) temp
WHERE d.deptno=temp.deptno
//此種解法構造出零時表 temp

這兩種方式有什么區別:
為了更好的解決此類問題,現在將數據量擴大100倍,emp:1400條記錄,dept:400條記錄
多表查詢后分組統計:
數據量:1400*400=640000

子查詢分組統計后進行多表查詢:
FROM子句的數據量:1400行記錄,最多返回400行記錄
與dept表進行多表查詢:最多返回400*400=160000
總共做了161400次運算

=========================性能優化===========================
1.between...and... 的性能優於 >.... and <....
原因:between and只做了一次運算, >.... and <....做了兩次運算

2.查詢分組統計后進行多表查詢 的性能要優於 多表查詢后分組統計

============================================================

 

7.3 星期三
第八章 數據更新
1.數據的增加
2.數據的修改
3.數據的更新

8.1、數據增加
對於數據表肯定需要新數據的加入,對於數據增加的操作,可以適用於如下的語法完成
INSERT INTO 表名稱 [(字段名稱,字段名稱...)] VALUE (數據,數據...)

但是對於數據的增加操作需要注意一點,關於數據的定義問題:
.字符串函數 :用單引號括住
.數值函數:直接編寫
.日期:有三種方式可以選擇
1.可以設置為當前日期SYSDATE
2.根據日期的保存結構編寫字符串
3.可以利用TO_DATE() 將字符串轉化為DATE型數據

3.2 數據修改
UPDATE 表名稱 SET 字段=內容,字段=內容,...[WHERE 更新條件]


3.3 數據刪除
刪除數據就是指所有的數據不再需要,對於刪除語法
DELETE FROM [WHERE 刪除條件]

 

7.4日 星期四
第九章 事務處理
1.事務處理的作用
2.事務處理的命令

9.1 事務:保證事務完整性的一種手段。
事務具備ACID原則(保證你一個人更新數據的時候其他人不能更新)

在oracle之中,sqlplus是一個客戶端。但是對於Oracle服務而言
每一個sqlplus的客戶端都是獨立的,都使用一個session描述


在事務的處理之中提供有兩個核心的命令:
.提交事務:commit
.回滾事務:rollback


9.2 事務鎖
按照之前的講解,每一個session都進行自己的事務處理,那么如果說兩個session
同時操作了同一條數據該如何了。

范例:第一個session更新7566雇員的信息
UPDATE emp SET sal=5000 WHERE empno=7566;
此時session並沒有提交或回滾事務

范例:第二個session也更新7566雇員的信息
UPDATE emp SET comm=9000 WHERE empno=7566;
此時更新操作不能完成,因為兩個不同的session更新了同一條數據,那么此時就會出現
一種情況:鎖。即:在第一個session沒有提交或回滾前,第二個session要一致等待着更新完成。
所以在事務的處理過程中有一個鎖定的概念,即:在提交或者回滾之前,只能有一個session操作數據
這就是事務的隔離性

 


第十章 數據偽列
偽列:列本身不存在,但是卻可以使用的列。Oracle提供有兩個非常重要的偽列
:ROWNUM,ROWID

10.1 ROWNUM(核心)
如果在開發之中使用了ROWNUM,那么就表示會自動生成行號。
行號是根據查詢結果動態計算出來的,所以每一個行號都不會與特定的記錄捆綁。
在實際的開發過程中,ROWNUM可以做兩件事情,
.取得第一行數據
.取得前n行數據(重要)

解釋:為什么NOT IN里面不能夠有null
NOT IN(null) ,如果某一列的內容沒有null,那么就表示查詢全部,但是NOT IN 本身
的作用是進行數據的部分篩選,由於自身的數據錯誤導致查詢全部,那么就是災難了


范例:取得6-10行數據
錯誤的做法:
SELECT ROWNUM,empno,ename FROM emp WHERE ROWNUM BETWEEN 6 AND 10;
在數據表的查詢過程之中,ROWNUM不能定義范圍,所以此時要想正確實現需要的功能
必須通過子查詢完成。子查詢中,首先查詢前10行記錄,而后查詢后5 行記錄


分頁sql語句
currentPage:當前頁號
lineSzie:每頁記錄的條數

SELECT *
FROM (
SELECT ROWNUM rn,列,...FROM 表名稱
WHERE ROWNUM<=currentPage*lineSize)temp
WHERE temp.rn>(currentPage-1)*lineSize;


10.1 ROWID(理解)
所謂的ROEID指的是針對於每行數據提供的物理地址

以"AAAR3qAAEAAAACHAAA"這個數據為例,介紹ROWID的組成
.數據對象編號:AAAR3q
.數據文件編號:AAE
.數據保存的塊號:AAAACH
.數據保存的行號:AAA

面試題:表中有很多完全重復的數據,要求將重復的數據刪除掉(只剩最早一個)

 

7.5 星期五
第十一章 表的創建與管理
1.常見的數據類型
2.表的創建操作
3.表的刪除操作
4.表的修改操作

11.1 常用數據類型(重點)
1)字符串:使用VARCHAR2描述 (其他數據庫使用VARCHAR)

2)數字:Oracle之中使用NUMBER來描述數字,如果描述小數使用NUMBER(m,n),
其中m-n為整數位,n為小數位,但是數據庫也考慮了我們程序開發人員的習慣
整數:INT
小數:FLOAT
3)日期:使用DATE是最常見的做法,但是在Oracle里面DATE包含有日期時間,可是其他的數據庫
里面,DATE可能只是日期,DATETIME才表示日期時間

4)大文本數據:使用CLOB描述,最多可以保存4G文字

5)大對象數據:使用BLOB描述,保存圖片,音樂,電影文字最多可以保存4G


11.2 創建數據表
CREATE TABLE 表名稱(
列名稱 類型 [DEFAULT 默認值],
列名稱 類型 [DEFAULT 默認值],
列名稱 類型 [DEFAULT 默認值],
.
.
列名稱 類型 [DEFAULT 默認值]
);

 

11.3 表的復制
嚴格的來說復制表不是復制的操作,而是將一個子查詢的返回結果變為一張表的形式
保存,復制表的操作可以使用如下的語法完成
CREATE TABLE 表名稱 AS 子查詢

只復制表結構,不復制表內容:只需要添加一個絕對不可能滿足的條件即可

 

11.4 表的截斷操作
事務是保證數據完整性的一種手段:但是在使用事務的處理過程中需要注意一點:
在用戶進行數據更新后還未進行事務提交中,如果發生了DDL語言,那么所有的事務將自動
提交

TURNCATE TABLE 表名稱 :刪除表時進行資源釋放


11.5 表的重命名
RENAME 表名稱1 TO 表名稱2;

DDL:數據對象定義語言,主要的功能是創建對象,但是問題是這些對象
是誰記錄着?
當用戶進行對象操作的時候,Oracle中有一個數據字典,記錄表的增加,刪除信息
但是這個數據字典是Oracle自己維護的,用戶不能夠直接操作數據字典的CRUD

數據字典用戶常用主要分為三類:
USER_*:用戶的數據字典信息
DBA_*: 管理員的數據字典
ALL_* : 所有人可以看的數據字典
在之前使用過這樣的語句:
SELECT * FROM tab;
嚴格來講此時可以使用數據字典完成
SELECT * FROM user_tables;
user_tables這個數據字典記錄了保存數據的存儲情況,以及占用資源的情況


7.6 星期6
11.6 表的刪除(重點)
刪除數據表屬於數據庫對象的操作:
DROP TABLE 表名稱

在最早的時候,如果進行了刪除語句,數據表就會進行直接刪除,但是在Oracle 10g以后
對於刪除操作,出現了一次挽救的機會。類似於window的回收站,
如果沒有其他的說明,會將刪除的表保存在回收站之中,如果用戶刪除出現了問題
可以進行恢復,或者是徹底刪除。稱之為閃回技術(Flash Back)

在任何數據庫里沒有批量刪除數據表的操作

 

11.7 閃回技術
FlashBack給與用戶最直接的支持是給了用戶后悔機會,但是用戶現在想要去操作這個回收站,
那么對於用戶而言應具備查看,恢復,清空,徹底刪除幾項操作。

1)查看回收站
SHOW RECYCLEBIN(古老命令,不支持了)
SELECT * FROM user_recycle_bin;

現在發現person表刪除錯誤,於是想利用閃回技術恢復:
FLASHBACK TABLE person TO BEFORE DROP;

但是有的同學認為,這樣刪除太麻煩了,希望有想windows那樣徹底刪除的選項
,可以使用"PURGE"
徹底刪除person表
DROP TABLE person PURGE;

刪除回收站的表person:
PURGE TABLE person

清空回收站:
PURGE RECYCLEBIN;

 

11.8 修改表的結構
1.修改已有列:
ALTER TABLE 表名 MODIFY(列名 數據類型(長度) DEFAULT'默認值');

2.為表增加列
如果發現表中列的功能不足,那么就需要為其增加新的功能列
ALTER TABLE 表名稱 ADD(列名 數據類型(長度) [DEFAULT 默認值]);

3.刪除表中的列
任何情況下,刪除這種操作都是及其危險的。
ALTER TABLE DROP COLUMN 列名稱;

 

第12章 約束的創建與管理(最為重要)
1.5種約束的使用
2.約束的管理

數據表本身只支持數據的存儲操作,但是在數據庫上為了保證數據的完整性,
即:需要在滿足若干條件之后才可以進行操作,例如用戶信息不可以重復。

本質上來說數據庫中的約束一種有6種:
數據類型,非空約束,唯一約束,主鍵約束,檢查約束,外鍵約束
但是約束是一把雙刃劍,約束確實是可以保證數據合法后才可以進行保存
但是在一個數據庫里面設置了過多的約束,那么數據更新的操作一定會慢
所以在開發之中,一些更新的操作還是強烈建議交給程序完成。

1.非空約束(NOT NULL NK)
所謂的非空約束指的是表中的某一個字段的內容不允許為空,如果要是用
非空約束,只需要在每個列的后面使用 NOT NULL 聲明即可


2.唯一約束(UNIQUE UK)
唯一約束的特點是在某一個列上的內容不允許重復

創建數據表
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL,
email VARCHAR2(20)
CONSTRAINT uk_email UNIQUE(email)
)
此時如果違反了唯一主鍵原則,則提示為
ORA-00001:違反唯一約束條件(SCOTT.UK_ENAME)


3.主鍵約束(PRIMARY KEY,PK)
主鍵約束=非空約束+唯一約束

Oracle是允許定義多個列為主鍵,這樣的操作往往稱為復合主鍵
如果是符合主鍵,那么當着若干個主鍵完全重復時,才違反唯一
主鍵原則


4.檢查約束
檢查約束是指在數據列上設置一些過濾條件,當過濾條件滿足時
才可以進行保存


5.外鍵約束
外鍵約束主要是在父子表關系中體現的一種約束操作。
CREATE TABLE book(
bid NUMBER,
title VARCHAR(20),
mid NUMBER,
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCE member(mid)
)
所謂外鍵就相當於字表中某一個字段的內容由父表來決定其使用范圍
對於外鍵而言最為麻煩的在於一堆限制

限制1:再刪除父表之前需要刪除掉他所對應的的全部字表后才可以刪除
但是有些時候,一些奇葩的設計者,將A表作為B表的父親,B表也作為A表的父親
那么A,B兩表都不允許被刪除。此時在Oracle中專門提供了一個強制刪除父表的操作
,刪除之后不關心字表
DROP TABLE member CASCADE CONSTRAINT
此時強行刪除member表,字表不會受影響


限制2:如果要作為字表外鍵的父表列,那么這個列必須設置為唯一約束或主鍵


限制3:如果現在柱表中中的某一行數據有對應的字表數據,那么必須刪除字表中的全部數據
如果說現在不想受到子記錄的困擾,那么就可以使用級聯

級聯刪除:
所謂級聯刪除是指在父表數據已經被刪除的情況下,自動刪除其對應字表的數據
在定義外鍵的時候定義:ON DELETE CASCADE 即可

級聯更新:
如果說現在刪除父表數據的時候,那么對應的字表數據的外鍵列就設置為空
使用ON DELETE SET NULL 設置


6.修改約束(了解)
如果說表結構的修改還在容忍的范疇之內,那么約束的修稿就對是100%禁止的
所有的約束一定要在表創建的時候就設置完整


實際上約束可以進行后期的添加以及后期的刪除操作。但是如果想要進行這樣的
維護,那么必須保證有約束名稱

1.增加約束
ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(字段)選項....
范例:為member表增加主鍵約束
ALTER TABLE ADD CONTRAINT pk_mid PRIMARY_KEY(mid)

利用以上語法可以實現4種約束的增加:主鍵,唯一,檢查,外鍵
但是不包含非空,如果想要為字段增加非空約束,那么只能依靠修改表結構完成
ALTER TABLE mem(name VARCHAR2(20) NOT NULL);


2.刪除約束
ALTER TABLE 表名稱 DROP CONSTRANINT 約束名稱

所以綜合來說,不要修改表結構,且約束和表一起創建

 

7.8 星期一
第14章 常用數據庫對象
14.1.序列的使用
在許多數據庫中都存在一種數據類型---自動增長列,它能夠創建流水號。
但是遺憾的是,在Oracle12C之前並沒有提供這樣自動的增長列,但是從12c開始
出現了自動增長,如果想要實現自動增長列,那么就可以使用序列的方式完成
如果想要使用序列,則可以采用如下的方式完成創建

語法:
CREATE SEQUENCE 序列名稱
[MAXVALUE 最大值|NOMAXVALUE]
[MINVALUE 最小值|NOMINVALUE]
[INCREMENTBY 步長][START WITH 開始值]
[CYCLE|NOCYCLE] 是不是循環序列
[CACHE 緩存個數|NOCACHE]
序列屬於數據庫對象的創建過程,屬於DDL的分類范疇(數據定義語言),對於序列而言 ,
創建之后一定會在數據字典之中保存

范例:創建序列
CREATE SQUENCE myseq;

既然序列的對象信息會在數據字典之中保存,那么現在就可以查詢序列的數據字典
范例:查詢user_squence數據字典

當序列已經創建成功了,如果想要使用序列則可以使用如下兩個偽列完成
nextval:取得序列下一個內容,每一次調用,序列的值都會增長
currval:表示取得序列的當前內容,每一次調用序列不會增長,如果想要使用此偽列,那么在使用之前
必須首先使用nextval()取得內容才可以。


7.9 星期二
14.2 定義特殊序列
如果想要在實際開發之中使用序列進行開發,那么必須手工在數據增加的時候進行處理,
而數據表的形式與之前沒有任何區別
CREATE TABLE mytab(
id NUMBER,
name VARCHAR2(50),
CONSTRAINT pk_id PRIMARY KEY(id)
);
此時數據表與原始相比沒有任何區別,但是最關鍵的部分是在數據增加的時候,(id是主鍵列),
可以利用序列來生成id的內容。

INSERT INTO mytab(id,name) VALUES(myseq.nextval,'HELLO');
以上的操作是序列在實際開發中使用最多的情況,但是從序列的創建語法來講,並不是這么簡單
下面需要針對序列做進一步的分析





第15章 視圖的定義及使用(重要)
1.視圖的定義語法
2.視圖的使用限制

15.1 視圖的創建及使用
利用視圖可以實現復雜SQL語句的封裝操作。從實際的開發來說,
一個優秀的數據庫設計人員除了要給出合理的數據表結構之外,
還應該將所有可能用到的查詢封裝好視圖,一並交給開發者

視圖依然屬於DDL的定義范疇,所以視圖的創建需要使用如下語法完成:
CREATE[OR REPLACE] VIEW 視圖名稱 AS 子查詢;

范例:創建視圖
CREATE VIEW myview AS SELECT * FROM emp WHERE deptno=10;
提示:權限不足

在Oracle 10g及以前版本,scott是可以直接進行視圖創建的,但是從
Oracle 10G R2版本開始如果想要在scott中創建視圖,那么就需要單獨
分配創建視圖的權限

范例:為scott分配創建視圖的權限
CONN sys/change_on_install AS SYSDBA;
GRANT CREATE VIEW TO scott;
CONN scott/tiger
權限分配完成后,則可以進行視圖的創建操作。視圖本身屬於數據庫對象,
所以要想查看視圖的信息可以使用"user_views"數據字典完成。在這個視
圖中,可以查詢到具體的語法。
SELECT * FROM user_views;


視圖可以像普通數據表那樣直接進行查詢。查詢視圖與之前使用SELECT查詢
結果是完全相同的,所以視圖就包裝了SQL語句,而開發者可以通過視圖查詢
到所需要的數據

查詢視圖:
SELECT * FROM myview;


若視圖的名稱已經被占用了,那么理論上應該先刪除,而后再創建。可是刪除與
創建之間可能產生間隔。所以在實際之中,由於視圖使用頻率較高,直接與開發有
關,那么一般情況下不會選擇刪除后重新創建,而是選擇進行視圖的替換。利用新
的查詢替換掉舊的查詢。


15.2 視圖的更新操作
實際上視圖只是包含有查詢語句的零時數據,並不是真實存在的,可是在默認情況
下,我們創建的視圖是可以進行修改操作的。

1.對視圖的創建條件進行更新
CREATE VIEW myview AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION;
此時使用了WITH CHECK OPTION子句可以保證視圖的創建條件不被更新,如果更新了視圖
的創建條件,那么會有提示信息:
ORA-01402:視圖WITH CHECK OPTION where子句違規

2.對視圖的其他字段進行更新(非視圖的創建條件)
但是視圖中不光有創建條件的字段,還可能會包含其他字段,可是在現在的操作中
可以修改視圖中的其他內容
修改其他字段:
UPDATE myview SET sal=80000 WHERE empno=7369;
此時更新的操作成功,但是發現視圖更新時改變的是數據表中的數據,那么這樣的操作
同時也是不合理的。
所以在一般創建視圖的時候,由於里面都屬於映射的數據,那么本質上就不建議修改,
建議創建一個只讀視圖。使用WITH READ ONLY完成。這樣就避免了通過視圖的臨時數據
來修改數據表的真實數據。


疑問:直接修改視圖挺方便的,為什么非要使用只讀視圖?
以上的講解只是分析問題,但是如果現在只是單表查詢,那么封裝為視圖有個P用


總結:理論上從正規的開發項目來說,一個數據庫之中應該包含很多個視圖
但是在現實開發中,有些團隊不使用視圖。

 

7.10 星期三
第十七章 數據庫備份
數據庫的備份操作在所有項目的運營環境中都要涉及到


17.1 數據庫的導入與導出
1.數據的導出
1)首先需要准備一個進行數據備份的目錄,假如說現在將D:\backup
目錄作為備份路徑。

2)需要進入到backup目錄中(以命令行的方式進入)
cd backup

3)輸入exp指令,導出數據(在backup目錄中)

1.數據的導入
1)進入到備份文件所在路徑
2)輸入imp指令

在實際的備份操作之中,這樣的操作使不了。因為在其導出過程之中,必須
保證其他用戶不更新數據。


17.2 數據庫的冷備份
數據庫的冷備份嚴格來說稱為歸檔備份,指的是數據庫要關閉服務,所有的事務都需要提交
從實際來說要進行數據的備份則需要備份如下內容:
1.控制文件:控制整個Oracle的實例,可以使用"v$controlfile"數據字典找到

2.重做日志文件:"v$logfile"數據字典找到

3.數據文件:通過"v$datafile"數據字典找到

  4.核心配置文件pfile:使用SHOW PARAMETER pfile找到

數據庫的備份操作肯定要由管理員進行。

1.使用sys登錄
CONN sys/change_on_install AS SYSDBA;

2.查找控制文件的信息
SELECT * FROM v$controlfile

3.查找重做日志信息
SELECT * FROM v$logfile;

4.找到所有數據文件信息
SELECT * FROM v$datafile;

5. 找到pfile文件
SHOW PARAMETER pfile

6.記錄好這些文件的路徑

7.關閉Oracle服務
SHUTDOWN IMMEDIATE

8.重啟服務
startup


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM