熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle入門教程,新手必讀

2013-11-13 17:25:13  來源: Oracle 

   刪除表的注意事項
  在刪除一個表中的全部數據時須使用TRUNCATE TABLE 表名;因為用DROP TABLEDELETE * FROM 表名時TABLESPACE表空間該表的占用空間並未釋放反復幾次DROPDELETE操作後該TABLESPACE上百兆的空間就被耗光了
  
  having 子句的用法
  having 子句對 group by 子句所確定的行組進行控制having 子句條件中只允許涉及常量聚組函數或group by 子句中的列
  
  外部聯接+的用法
  外部聯接+按其在=的左邊或右邊分左聯接和右聯接若不帶+運算符的表中的一個行不直接匹配於帶+預算符的表中的任何行則前者的行與後者中的一個空行相匹配並被返回若二者均不帶+則二者中無法匹配的均被返回利用外部聯接+可以替代效率十分低下的 not in 運算大大提高運行速度例如下面這條命令執行起來很慢
  
  用外聯接提高表連接的查詢速度
  在作表連接(常用於視圖)時常使用以下方法來查詢數據:
  SELECT PAY_NO PROJECT_NAME
  FROM A
  WHERE APAY_NO NOT IN (SELECT PAY_
  NO FROM B WHERE VALUE >=);
   但是若表A有條記錄表B有條記錄則要用掉分鐘才能查完主要因為NOT IN要進行一條一條的比較共需要*次比較後才能得到結果該用外聯接後可以縮短到分左右的時間:
  SELECT PAY_NOPROJECT_NAME
  FROM AB
  WHERE APAY_NO=BPAY_NO(+)
  AND BPAY_NO IS NULL
  AND BVALUE >=;
  
  set transaction 命令的用法
  在執行大事務時有時oracle會報出如下的錯誤:
  ORA:snapshot too old (rollback segment too small)
  這說明oracle給此事務隨機分配的回滾段太小了這時可以為它指定一個足夠大的回滾段以確保這個事務的成功執行例如
  
  set transaction use rollback segment roll_abc;
  delete from table_name where
  commit;
  回滾段roll_abc被指定給這個delete事務commit命令則在事務結束之後取消了回滾段的指定
  
  數據庫重建應注意的問題
  在利用import進行數據庫重建過程中有些視圖可能會帶來問題因為結構輸入的順序可能造成視圖的輸入先於它低層次表的輸入這樣建立視圖就會失敗要解決這一問題可采取分兩步走的方法:首先輸入結構然後輸入數據命令舉例如下 (uesrname:jfclpassword:hfjfhost sting:ora數據文件:expdatadmp):
  
  imp jfcl/hfjf@ora file=empdatadmp rows=N
  
  imp jfcl/hfjf@ora file=empdatadmp full=Y buffer=
  
  commit=Y ignore=Y
  
  第一條命令輸入所有數據庫結構但無記錄第二次輸入結構和數據字節提交一次ignore=Y選項保證第二次輸入既使對象存在的情況下也能成功
  
  select aempno from emp a where aempno not in
  
  (select empno from emp where job=SALE);
  
  倘若利用外部聯接改寫命令如下:
  
  select aempno from emp a emp b
  
  where aempno=bempno(+)
  
  and bempno is null
  
  and bjob=SALE;
  
  可以發現運行速度明顯提高
  
  從已知表新建另一個表
  CREATE TABLE b
  AS SELECT * (可以是表a中的幾列)
  FROM a
  WHERE lumn = ;
  
  查找刪除重復記錄:
  法一: 用Group by語句 此查找很快的
  select count(num) max(name) from student 查找表中num列重復的列出重復的記錄數並列出他的name屬性
  group by num
  having count(num) > 按num分組後找出表中num列重復即出現次數大於一次
  
  delete from student(上面Select的)
  這樣的話就把所有重復的都刪除了慎重
  
  法二:當表比較大(例如萬條以上)時這個方法的效率之差令人無法忍受需要另想辦法:
   執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重復的記錄
  SELECT * FROM EM_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM_PIPE_PREFAB D D相當於FirstSecond
  WHERE EM_PIPE_PREFABDRAWING=DDRAWING AND
  EM_PIPE_PREFABDSNO=DDSNO);
  
   執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重復的記錄
  DELETE FROM EM_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM_PIPE_PREFAB D
  WHERE EM_PIPE_PREFABDRAWING=DDRAWING AND
  EM_PIPE_PREFABDSNO=DDSNO);
  
  返回表中[NM]條記錄
  取得某列中第N大的行
  select column_name from
  (select table_name*dense_rank() over (order by column desc) rank from table_name)
  where rank = &N
  
  假如要返回前條記錄
  select * from tablename where rownum<;(或是rownum <= 或是rownum != )
  假如要返回第條記錄
  select * from tablename
  where …
  and rownum<
  minus
  select * from tablename
  where …
  and rownum<5
  order by name
  選出結果後用name排序顯示結果。tW.wiNGWIt.coM(先選再排序)
  
  注意:只能用以上符號(<、<=、!=)。
  select * from tablename where rownum != 10;返回的是前9條記錄。
  不能用:>,>=,=,Between...and。由於rownum是一個總是從1開始的偽列,Oracle 認為這種條件 不成立,查不到記錄.
  
  另外,這個方法更快:
  select * from (
  select rownum r,a from yourtable
  where rownum <= 20
  order by name )
  where r > 10
  這樣取出第11-20條記錄!(先選再排序再選)
  要先排序再選則須用select嵌套:內層排序外層選。
  
  rownum是隨著結果集生成的,一旦生成,就不會變化了;同時,生成的結果是依次遞加的,沒有1就永遠不會有2!
  rownum 是在 查詢集合產生的過程中產生的偽列,並且如果where條件中存在 rownum 條件的話,則:
  1: 假如 判定條件是常量,則:
  只能 rownum = 1, <= 大於1 的自然數, = 大於1 的數是沒有結果的, 大於一個數也是沒有結果的
  即 當出現一個 rownum 不滿足條件的時候則 查詢結束   this is stop key!
  2: 當判定值不是常量的時候
  若條件是 = var , 則只有當 var 為1 的時候才滿足條件,這個時候不存在 stop key ,必須進行 full scan ,對每個滿足其他where條件的數據進行判定
  選出一行後才能去選rownum=2的行……
  
  9.快速編譯所有視圖
  ---- 當在把數據庫倒入到新的服務器上後(數據庫重建),需要將視圖重新編譯一遍,因為該表空間視圖到其它表空間的表的連接會出現問題,可以利用PL/SQL的語言特性,快速編譯。
  SQL >SPOOL ON.SQL
  SQL >SELECT ALTER VIEW ||TNAME||
  COMPILE; FROM TAB;
  SQL >SPOOL OFF
  然後執行ONSQL即可
  SQL >@ONSQL
  當然授權和創建同義詞也可以快速進行
  SQL >SELECT GRANT SELECT ON
  ||TNAME|| TO USERNAME; FROM TAB;
  SQL >SELECT CREATE SYNONYM
  ||TNAME|| FOR USERNAME||TNAME||; FROM TAB;
  
  讀寫文本型操作系統文件
   在PL/SQL 以上的版本中UTL_FILE包允許用戶通過PL/SQL讀寫操作系統文件如下
  
  DECALRE
  FILE_HANDLE UTL_FILEFILE_TYPE;
  BEGIN
  FILE_HANDLE:=UTL_FILEFOPEN(
  C:\TESTTXTA);
  UTL_FILEPUT_LINE(FILE_HANDLE
  HELLOITS A TEST TXT FILE);
  UTL_FILEFCLOSE(FILE_HANDLE);
  END;
  
  在數據庫觸發器中使用列的新值與舊值
   在數據庫觸發器中幾乎總是要使用觸發器基表的列值如果某條語句需要某列修改前的值使用:OLD就可以了使用某列修改後的新值用:NEW就可以了如:OLDDEPT_NO:NEWDEPT_NO
  
  數據庫文件的移動方法
  當想將數據庫文件移動到另外一個目錄下時可以用ALTER DATABASE命令來移動(比ALTER TABLESPACE適用性強)
   使用SERVER MANAGER關閉實例
  SVRMGR > connect internal;
  SVRMGR > shutdown;
  SVRMGR >exit;
   使用操作系統命令來移動數據庫文件位置(假設這裡操作系統為SOLARIS ) 在UNIX中用 mv命令可以把文件移動到新的位置
  #mv /ora/orarun/documentdbf /ora/orarun
   裝載數據庫並用alter database命令來改變數據庫中的文件名
  SVRMGR > connect internal;
  SVRMGR > startup mount RUN;
  SVRMGR > alter database rename file
  > / ora/orarun/documentdbf
  > / ora/orarun/documentdbf;
   啟動實例
  SVRMGR > alter database open;
  
  連接查詢結果
  表a 列 a a
  記錄 a
   b
   x
   y
   z
  用select能選成以下結果:
   ab
   xyz
  
  下面有兩個例子
  使用pl/sql代碼實現但要求
From:http://tw.wingwit.com/Article/program/Oracle/201311/18294.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.