程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> DB筆記(Oracle)

DB筆記(Oracle)

編輯:Oracle教程

DB筆記(Oracle)


DB筆記(Oracle)

一.Oracle的安裝,服務的啟動,數據庫的建立,用戶的建立(略過)。

二.Select語句:

(一)、單行函數:

1. 表達式和null計算,結果為null,即,不作顯示(也就是數據失蹤了!)。所以一般用函數NVL(列名,替換值),如NVL(sal,0)。

2. 字符串拼接:|| 例如:select ID||’---’||uname from emp;

3. 排序 和過濾(order by 和 where):

a) select* from emp order by sal asc,comm desc; 此表達式為按薪水升序排,薪水相同的按獎金倒序排。

b) select* from emp order by ( sal + NVL(comm,0) ) desc;此表達式是:按照薪水和獎金之和來排序,注意:如果不用NVL直接用comm,則會丟失一些值

c) select* from emp where uname > ‘CBA’; 字符串的過濾, 這個具體還沒搞懂

d) select* from emp where sal between 100 and 200;

4. 條件選擇:and,or,in(a1,a2,a3)。注意:其中in(a1,a2,a3)表示選擇a1,a2,a3三個中的一個,而不是選擇三個范圍中的一個。

5. Not關鍵字:not in(a,b,c); is not null; 等等。

6. Like關鍵字:通配符有兩個,如下

a) %: 任意字符 出現 任意次數。

b) _: 任意字符 出現 一次。

注意:查詢通配符需要轉義,如下:select * from emp where ename like‘%\%%’ escape ‘\’; select * from emp where ename like ‘_H@_%’ escape ‘@’;

7. 事件處理函數: upper(), Lower(), substr(ename,1,4), length(), trim(), ltrim(), rtrim()。

8. 時間格式函數:to_char(sysdate,’yyyy-mm-dd’); to_date(string,’yyyy-mm-dd’)。

兩個日期間的天數 select floor( sysdate – to_date(‘2014/12/27’ , ‘yyyy/mm/dd’) );

9. rownum: 行號,表的原本數據排序,只能用於<或<=運算符,不能用>或>=運算符,如果要取後幾行數據,需要一個where子查詢先倒敘排列。

10. 正則表達式:sql語句支持正則表達式,例子如下:

select* from emp where regexp_like(列名,’正則表達式’);

(二)、組函數:

1. avg() ,min(), max(), sum() 略過不講。

2.count():計數函數。返回查詢結果的行數,經常配合distinct,去除重復行。

例如: select count(eno) from emp whereeno>200; 或者 select count(distinct eno) from emp;

3. group by : 分組函數。

a). 查詢單位不再以行為單位,所有操作均以組為單位.

b). 何為一組?值相同則為一組.

c). having為過濾分組,

c). group by子句 須在where子句之後,order by子句之前。

d). select eno from emp group byeno; ----eno相同的分為一組,查詢每組的eno

select depno,sal(sal) from dept group by depno; ----以部門號分組,查詢。

select max( avg(sal) ) from dept group by deptno; ----先按部門編號分組,查出每組平均值的最大值。

select * from dept group by sal,comm; ----工資和獎金相同的分為一組,查詢*。

三.Insert,update,delete語句(略過)。

四.其他操作:

1. 索引index:可以給某個列增加index,提高其select的效率。創建方法超級簡單:create index index_name on tablename(cols); 然後不用管,我們索引時oracle會自動調用index來檢索。刪除方法也超簡單:drop index index_name; 注意: index缺點也不少,Index不適合:數據唯一性不好的列+增刪改頻繁的列。所以不到必要,不用建立

2. 視圖view:使用方法和表的一模一樣,好處:sql重用+安全

create view v$_vname as (select子句); drop view V$_vname;

3. 序列sequence:用法:創建,刪除,引用。略過。

五.DB設計范式: (重要)

1. DB范式目前有六種,1NF,2NF,3NF,BCNF,4NF,5NF(完美范式)。依次越優化。

2. 企業級開發,最低滿足3NF。

3. 滿足范式越高,DB冗余越低,DB越優化。

4. 詳解:

a) 1NF:表的每個列都是原子的。

錯誤示范 -->\

b) 2NF:實體屬性完全依賴主關鍵字。即不能只依賴主鍵的一部分。

錯誤示范 à (略過)

常見錯誤 à 聯合主鍵的表。 某些屬性依賴主鍵的一部分。

解決方案 à 拆分主鍵拆分表,外鍵關聯。

c) 3NF:

錯誤示范 -->\

常見錯誤 à 表中屬性A依賴於B,B依賴於C。數據量大時會大量冗余。

解決方案 à 拆表,外鍵關聯。

d) BCNF:允許出現有主鍵的一部分被主鍵另一部分或者其他部分決定。即聯合主鍵相互依賴。

錯誤示范 à倉庫表storehouse(倉庫ID,管理員ID,物品ID,數量),一個倉庫一個管理員,一個倉庫多個物品,則依賴關系如下:

\

出現了倉庫ID和管理員ID相互依賴,符合3NF但不符合BCNF。

解決方案 -->拆分。

編程兩個一對多,這種結構也叫:實體表—映射表關聯結構。

e) 注意:映射表中兩個外鍵需形成聯合主鍵。

備注:

1. 別名可以用中文,但要加雙引號;

2. oracle的某些客戶端,如PLsql等,有sql window和command window窗口,用來跑不同的語句,例如desc User; 指令只能在command window中跑;

3. SQL語句優化:Select * from emp; *是通配符,性能較低,程序中盡量不要出現*,最好能具體到列名。

4. SQL不區分大小寫,但是script執行的時候會統一轉化為大寫。 所以:大寫執行效率高但不利於閱讀,小寫腳本執行效率高但不利於閱讀,所以一般關鍵字大寫,另外需要注意:建議程序裡關鍵字也大寫,有利於增加效率

5. SQL語句的優化: 檢索結果少and 檢索結果多, 檢索結果多 and 檢索結果少。因為sql語句是順序執行。

6. SQL語句優化:select * from emp where eno=100 or eno=200 oreno=300; 此語句和select * from emp where eno in (100,200,300); 等價,但是用in的語法清晰+效率高,因為in函數內部做了優化。

7.SQL語句優化:用like關鍵字和通配符來檢索數據萬不得已再用,它的操作慢的不得了。

8. 組函數的嵌套最多兩層,例如 max( avg(sal) )等,不能出現max( min( avg(sal) ) ).

9. Oracle內部執行順序:where行級過濾 à group by分組 à having組級過濾 à order by排序。所以:group by子句 須在where子句之後,order by子句之前,即where…group by…order by…

10. Transaction事務機制要點:只操作insert,update,delete行級語句。如果系統正常關閉,則事務自動commit;如果執行create,drop等表級操作,事務自動commit;如果非正常關閉如斷電等,事務自動rollback。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved