Oracle學習筆記簡版
一、Oracle簡介
二、Oracle安裝與配置
OracleOraDb11g_home1TNSListener:監聽服務,如果要通過程式或者是不同的客戶端連線Oracle資料庫的時候,此服務必須啟動,否則無法連線。
OracleServiceMLDN:資料庫的例項服務。
三、SQLPlus命令
四、SQL簡介與資料表分析
1、SQL簡介
SQL是結構化查詢語言。
DML:資料操作語言。DDL:資料定義語言。 DCL:資料庫控制語言。
2、Scott使用者表結構
查詢一個使用者下的所有資料表:SELECT *FROM tab;
查詢一個表的結構:DESC dept;
五、資料查詢
1、SQL簡單查詢
簡單查詢指的是查詢一張資料表中所有資料行的內容。
②SELECT [DISTINCT] * 列名稱[別名],列名稱[別名],...
①FROM 表名稱 [別名];
首先執行的是FROM子句,因為必須通過FROM子句確定資料的來源,而後要針對資料進行篩選,那麼就通過SELECT子句完成。
(1)簡單查詢不能控制資料行,只能夠在SELECT子句裡面控制列。
SELECT empno,ename FORM emp;
(2)去除掉所有的重複資訊,使用“DISTINCT”完成。
SELECT DISTINCT job FROM emp;
(3)SELECT中可以進行四則運算。
(4)SELECT中可以直接輸出常量內容,對於字串使用“’”、數字直接編寫、日期按照字串格式。
(5)“||”負責進行輸出的內容連線,此類操作一般很少直接在查詢中出現(儲存過程中會用到)。
2、SQL限定查詢(部分資料行)
③SELECT [DISTINCT] * 列名稱[別名],列名稱[別名],...
①FROM 表名稱 [別名]
②[WHERE 過濾條件];
關係運算符:>、<、>=、<=、<>(!=);
邏輯運算子:AND、OR、NOT;
範圍運算子:BETWEEN…AND
謂詞範圍:IN、NOT IN;
空判斷:IS NULL、IS NOT NULL;
模糊查詢:LIKE
(1)關係運算符
關係運算符主要是進行大小關係比較操作使用的。
範例:查詢出所有基本工資高於1500的僱員資訊。
SELECT * FORM emp WHERE sal>1500;
(2)邏輯運算子
多個條件要進行連線,需要判斷是與連線還是外連線。
與連線:所有的判斷條件都要滿足;
或連線:若干個條件有一個滿足即可。
範例:查詢出工資在1500~3000之間的僱員資訊
SELECT * FROM emp WHERE sal>1500 AND sal <3000;
(3)範圍查詢
在進行查詢條件過濾的時候針對某一個範圍進行過濾。
範例:查詢工資在1500~2000之間的僱員
SELECT * FROM emp WHERE sal>=1500 AND sal<=2000;
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 2000;
(4)空判斷
空在資料庫上解釋為不確定的內容。但是要注意的是在數字列上使用null那麼絕對不表示0.對於null的判斷不能夠使用關係運算符完成。空的操作只能夠使用IS NULL或者是IS NOT NULL(NOT IS NULL)表示。
範例:查詢所有領取佣金的僱員資訊(佣金存在,不為空)
SELECT * FROM emp WHERE comm IS NOT NULL;
SELECT * FROM emp WHERE NOT comm IS NULL;
(5)IN操作符
IN給出的是一個指定的可選範圍。
範例:查詢出僱員編號是7369、2239、3894的僱員資訊。
SELECT * FROM emp WHERE empno IN(7369,2239,3894);
(6)模糊查詢:LIKE
在使用LIKE的時候可以使用兩個萬用字元:
“_”:匹配任意的一位字元;
“%”:匹配任意的零位、一位或多位字元。
範例:查詢姓名是以字母A開頭的僱員資訊。
SELECT * FROM emp WHERE ename LIKE ‘A%’;
注:使用LIKE實現模糊查詢的時候,如果不設定關鍵字’%%’表示查詢全部。
使用NOT IN查詢的時候,查詢的時候裡面不允許出現null,否則不會有任何查詢結果返回。
3、查詢排序
③SELECT [DISTINCT] * 列名稱[別名],列名稱[別名],...
①FROM 表名稱 [別名]
②[WHERE 過濾條件]
④[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];
對於排序的方式有兩種:ASC(預設升序),DESC(降序)
範例:查詢所有的僱員資訊,要求按照工資由高到低排序
SELECT * FORM ORDER BY sal DESC;
在整個SQL查詢中,只有ORDER BY子句可以呼叫SELECT子句裡面定義的別名。
4、單行函式
5、多表查詢(效能差,開發中儘可能迴避,大資料中不要使用)
③SELECT [DISTINCT] * 列名稱[別名],列名稱[別名],...
①FROM 表名稱 [別名],表名稱 [別名]
②[WHERE 過濾條件]
④[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];
兩個集合發生了積的關係,想要消除笛卡爾積的問題,就必須想辦法為兩張資料表設定關係。
範例:消除掉積的影響
SELECT * FROM dept,emp WHERE emp.deptno=dept.deptno
以上程式碼實際上只是消除了顯示的笛卡爾積,而在資料庫的多表查詢之中,笛卡爾積會一直存在,只要是存在有資料表,那麼一定會存在有笛卡爾積。
在任何情況下,如果要想實現多表查詢操作,永遠只有一個前提:要關聯的資料表一定要存在有關聯欄位或者是關聯條件,不存在這些要求的,一定不能夠使用多表查詢。
6、表的連線
內連線(等值連線):所有滿足條件的資料都會被顯示出來;
外連線(左外、右外、全外):控制左表與右表的資料是否完全顯示。
(1)內連線
之前使用的都是內連線。
(2)外連線
左外連線:欄位=欄位(+);
右外連線:欄位(+)=欄位;
範例:觀察左外連線
SELECT e.empdno,e.ename,e.job,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)
此時會把左表完全顯示,而部分右表內容沒有對應資料,則部門資料即為空。
7、SQL:1999語法支援
8、資料集合操作
9、分組統計查詢
(1)五個常用的統計函式:
統計個數:COUNT(*|[DISTINCT]欄位);
MAX(欄位)、MIN(欄位);
SUM(數字欄位)、AVG(數字欄位)
範例:查詢所有僱員之中最高和最低工資
SELECT MAX(sal),MIN(sal) FROM emp;
解釋COUNT(*)、COUNT(欄位)、COUNT(DISTINCT 欄位)的區別?(★★★★★)
◆COUNT(*):明確的返回表中的資料個數,是最準確的。
◆COUNT(欄位):不統計為null的資料個數,如果某一列的資料不可能為空,那麼結果與COUNT(*)相同。
◆COUNT(DISTINCT 欄位):統計消除掉重複資料後的資料個數。
(2)能夠分組的時候往往指的是部分資料具備某些共性。
④SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
①FROM 表名稱 [別名],表名稱 [別名]
②[WHERE 過濾條件]
③GROUP BY 分組欄位,分組欄位,...]
⑤[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];
範例:按照職位分組,統計出每個職位的名稱、人數、平均工資
SELECT job,COUNT(empno),AVG(sal) FROM emp GROUP BY job;
◆限制一:在沒有編寫GROUP BY子句的時候,那麼SELECT子句之中只允許出現統計函式。
◆限制二:在使用GROUP BY 子句分組的時候,SELECT子句之中只允許出現分組欄位與統計函式,其他欄位不允許出現。
◆限制三:統計函式允許巢狀查詢,但是巢狀後的統計查詢中,SELECT子句裡面不允許再出現任何的欄位,包括分組欄位,只能夠使用巢狀的統計函式。
⑤SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
①FROM 表名稱 [別名],表名稱 [別名]
②[WHERE 過濾條件]
③GROUP BY 分組欄位,分組欄位,...]
④HAVING 分組後的過濾條件]
⑥[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];
關於HAVING子句與WHERE的區別?(★★★★★)
◆WHERE發生在GROUP BY操作之前,屬於分組前的資料篩選,即:從所有的資料之後篩選出可以分組的資料,WHERE子句不允許使用統計函式。
◆HAVING發生在GROUP BY操作之後,是針對於分組後的資料進行篩選,HAVING子句可以使用統計函式。
注:多表查詢與分組統計的時候,查詢結果相當於是一張臨時表,所有的分組是在臨時表裡面完成的。
10、子查詢(★★★★★)
子查詢指的是在一個查詢裡面繼續巢狀其他的查詢語句。
SELECT [DISTINCT] 分組欄位 [別名],... |統計函式 (
SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
FROM 表名稱 [別名],表名稱 [別名]
[WHERE 過濾條件]
GROUP BY 分組欄位,分組欄位,...]
HAVING 分組後的過濾條件]
[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];)
FROM 表名稱 [別名],表名稱 [別名] (
SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
FROM 表名稱 [別名],表名稱 [別名]
[WHERE 過濾條件]
GROUP BY 分組欄位,分組欄位,...]
HAVING 分組後的過濾條件]
[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...]; )
[WHERE 過濾條件](
SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
FROM 表名稱 [別名],表名稱 [別名]
[WHERE 過濾條件]
GROUP BY 分組欄位,分組欄位,...]
HAVING 分組後的過濾條件]
[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];)
GROUP BY 分組欄位,分組欄位,...]
HAVING 分組後的過濾條件](
SELECT [DISTINCT] 分組欄位 [別名],... |統計函式
FROM 表名稱 [別名],表名稱 [別名]
[WHERE 過濾條件]
GROUP BY 分組欄位,分組欄位,...]
HAVING 分組後的過濾條件]
[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];)
[ORDER BY 欄位 [ASC|DESC],欄位 [ASC|DESC],...];
◆WHERE子句:子查詢一般會返回單行單列、單行多列、多行單列資料;
◆HAVING子句:子查詢會返回單行單列,同時表示要使用統計函式;
◆FROM子句:子查詢會返回多行多列資料(表結構);
◆SELECT子句:返回單行單列,不過一般不使用。
如果是子查詢,首先考慮的一定是WHERE或FROM子句裡面出現子查詢的操作,像SELECT子句幾乎是可以忽略掉的,而HAVING子句出現在子查詢只有在使用統計函式的時候才會使用。
子查詢最大的作用是解決了多表查詢所帶來的笛卡爾積影響的效能問題。
複雜查詢=簡單查詢+限定查詢+多表查詢+分組統計查詢+子查詢
六、資料更新、修改、刪除
1、資料增加
INSERT INTO myemp(empno,sal,job,comm,ename) VALUES(777,9000.0,’清潔工’,10.0,‘張三’);
2、資料修改
UPDATE myemp SET sal=8000,comm=9000 WHERE ename=’SMITH’;
總結:以後只要是更新操作,不可能不寫WHERE子句,如果不寫就要更新全部。
3、資料刪除
DELETE FROM myemp WHERE empno=7566;
七、事務
1、事務處理
同一操作業務,要保證多個更新操作要麼同時完成,要麼同時失敗,就會有事務。
事務是針對於資料更新使用的,只有DML的更新操作才存在有事務的支援。
◆commit:事務提交,即:如果已經執行了多條更新操作,那麼只有執行了commit之後更新才會真正發出,在沒有commit之前,所有的更新操作都會儲存在緩衝區中。
◆Rollback:事務回滾操作,即:如果發現更新的操作有問題,則恢復所有的更新操作,以保證原始資料不被破壞。
2、死鎖
SessionA與SessionB更新了同一個資料。一直等待中。
八、資料偽列
1、ROWNUM
利用ROWNUM針對於顯示的資料進行一個自動的行號編號。
2、ROWID
所有表中的資料行都會有一個唯一的一塊實體地址編號,這個編號可以通過ROWID查詢到。
任何情況下,都可以通過ROWID確定唯一的一行記錄。
九、表的內容
1、常見的資料型別
VARCHAR2(n);NUMBER(n,m);DATE;CLOB;BLOB
2、建立資料表
3、表的重新命名
4、截斷表
5、複製表
6、表的刪除
DROP TABLE 表名稱;
7、閃回技術
當執行資料表刪除之後並不會真正立刻發出刪除操作,而是先將資料表儲存在回收站之中,並且標記處回收站的內容不是空的,就在表的資料字典上提供有了”BIN*”。
如果希望表可以直接刪除,就在刪除表的時候加上“PURGE”。
8、修改表結構
十、約束(★★★★★)
約束是為了保證表中的資料儘可能是合法有效的資料。
約束有六種:資料型別、唯一約束、非空約束、主鍵約束、外來鍵約束、檢查約束
DROP TABLE member PURGE;
CREATE TABLE member(
mid NUMBER,
name VARCHAR2(20) NOT NULL
email VARCHAR2(30)
CONSTARINT uk_email UNIQUE(email) 唯一約束
CONSTARINT pk_mid PRIMARY KEY(mid) 主鍵約束
CONSTARINT pk_mid_name PRIMARY KEY(mid,name) 複合主鍵
CONSTARINT ck_age CHECK (age BETWEEN 0 AND 250) 檢查約束
CONSTARINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) 外來鍵約束
);
資料的級聯刪除:
CONSTARINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
級聯更新:
CONSTARINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL
十一、序列(★★★★★)
在很多資料庫中都存在有一種提供自動增長列的資料型別,幾乎所有的關係型資料庫都支援自動增長列的操作,但是隻有Oracle特殊,它只有在Oracle 12C版本之後才提供有自動增長列,在這之前沒有。此時只能通過序列來完成。
建立序列
CREATE SEQUENCE myseq;
查詢序列
SELECT * FROM user_sequences;
大部分情況下,使用序列的時候都只會建立預設序列,預設序列就是指最小值為1,並且沒有最大值,開始值為0,並且設定有20個快取資料。
對於序列的使用可以採用兩個偽列操作:
◆序列物件.nextval:表示進行序列的增長,每呼叫一次,序列加上指定的步長。
◆序列物件.currcal:表示取得當前的序列內容,不管如何呼叫,序列內容不發生改變。
當序列物件建立完成之後,嚴格來講序列是無法直接執行currcal的,必須先執行nextval之後才可以使用currcal。
十二、同義詞
十三、檢視(★★★★★)
所謂檢視就是包裝了複雜查詢的SQL語句物件。
CREATE [OR REPLACE] VIEW 檢視名稱 AS 子查詢;
嚴格來講檢視的資料是不能夠修改的,因為檢視中儲存不是真實而只是查詢結果的資料,並且在以上的複雜查詢裡面這樣的操作更是不可能修改。
總結:
如果是標準的開發,強烈建議使用檢視,這樣可以很好的實現分工。
定義的檢視都建議使用只讀檢視(WITH READ ONLY),因為檢視中的資料都不是真實資料。
十四、索引(★★★★★)
以前所有的都採用了全表掃描。
CREATE INDEX emp_sal_ind ON scott.emp(sal);
一旦加入了索引機制,那麼不再執行全表掃描的操作應用了,而是使用索引進行了查詢,但是這個索引也只是針對於sal欄位上起作用。
資料庫查詢之中可以使用索引來提升查詢效能,但是不適合應用在資料更新頻繁的操作上。
十五、使用者管理
十六、資料庫備份
十七、資料庫設計(★★★★★)
在初期結構之中可以根據正規化來進行設計,但是在最終你會發現所有的正規化都會被打破,so只有一個原則:根據業務的需要儘可能的減少多表查詢或複雜查詢。
第一正規化:資料表中的每一個欄位都不可再分。 單表
第二正規化:資料表之中不存在非關鍵字對任意一候選關鍵欄位的部分函式依賴。 多對多
簡而言之就是資料表之中的兩個列之間不要存在有數學關係。
第三正規化:資料表之中不存在非關鍵欄位對任意一候選關鍵欄位的傳遞函式依賴。 一對多
在實際開發中第三正規化一定最優先考慮的。