.刪除表空間 DROP TABLESPACE TableSpaceName [INCLUDING CONTENTS [AND DATAFILES]]
.刪除用戶 DROP USER User_Name CASCADE
.刪除表的注意事項
在刪除一個表中的全部數據時
須使用TRUNCATE TABLE 表名;因為用DROP TABLE
DELETE * FROM 表名時
TABLESPACE表空間該表的占用空間並未釋放
反復幾次DROP
DELETE操作後
該TABLESPACE上百兆的空間就被耗光了
.having子句的用法 having子句對group by子句所確定的行組進行控制
having子句條件中只允許涉及常量
聚組函數或group by 子句中的列
.外部聯接+的用法 外部聯接
+
按其在
=
的左邊或右邊分左聯接和右聯接
若不帶
+
運算符的表中的一個行不直接匹配於帶
+
預算符的表中的任何行
則前者的行與後者中的一個空行相匹配並被返回
若二者均不帶
+
則二者中無法匹配的均被返回
利用外部聯接
+
可以替代效率十分低下的 not in 運算
大大提高運行速度
例如
下面這條命令執行起來很慢
用外聯接提高表連接的查詢速度
在作表連接(常用於視圖)時
常使用以下方法來查詢數據:
SELECT PAY_NO
PROJECT_NAME
FROM A
WHERE A
PAY_NO NOT IN (SELECT PAY_
NO FROM B WHERE VALUE >=
);
但是若表A有
條記錄
表B有
條記錄
則要用掉
分鐘才能查完
主要因為NOT IN要進 行一條一條的比較
共需要
*
次比較後
才能得到結果
該用外聯接後
可以縮短到
分左右的時間:
SELECT PAY_NO
PROJECT_NAME
FROM A
B
WHERE A
PAY_NO=B
PAY_NO(+)
AND B
PAY_NO IS NULL
AND B
VALUE >=
;
.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:jfcl
password:hfjf
host sting:ora
數據文件:expdata
dmp):
imp jfcl/hfjf@ora
file=empdata
dmp rows=N
imp jfcl/hfjf@ora
file=empdata
dmp full=Y buffer=
commit=Y ignore=Y
第一條命令輸入所有數據庫結構
但無記錄
第二次輸入結構和?
字節提交一次
ignore=Y選項保證第二次輸入既使對象存在的情況下也能成功
select a
empno from emp a where a
empno not in (select empno from emp
where job=
SALE
);
倘若利用外部聯接
改寫命令如下:
select a
empno from emp a
emp
b
where a
empno=b
empno(+)
and b
empno is null
and b
job=
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相當於First
Second
WHERE EM
_PIPE_PREFAB
DRAWING=D
DRAWING AND
EM
_PIPE_PREFAB
DSNO=D
DSNO);
執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重復的記錄
DELETE FROM EM
_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM
_PIPE_PREFAB D
WHERE EM
_PIPE_PREFAB
DRAWING=D
DRAWING AND
EM
_PIPE_PREFAB
DSNO=D
DSNO);
.返回表中[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<
order by name
選出結果後用name排序顯示結果
(先選再排序)
注意
只能用以上符號(<
<=
!=)
select * from tablename where rownum !=
;返回的是前9條記錄
不能用
>
>=
=
Between
and
由於rownum是一個總是從
開始的偽列
Oracle 認為這種條件 不成立
查不到記錄
另外
這個方法更快
select * from (
select rownum r
a from yourtable
where rownum <=
order by name )
where r >
這樣取出第
條記錄!(先選再排序再選)
要先排序再選則須用select嵌套
內層排序外層選
rownum是隨著結果集生成的
一旦生成
就不會變化了
同時
生成的結果是依次遞加的
沒有
就永遠不會有
!
rownum 是在 查詢集合產生的過程中產生的偽列
並且如果where條件中存在 rownum 條件的話
則:
假如 判定條件是常量
則
只能 rownum =
<= 大於
的自然數
= 大於
的數是沒有結果的
大於一個數也是沒有結果的
即 當出現一個 rownum 不滿足條件的時候則 查詢結束 this is stop key!
: 當判定值不是常量的時候
若條件是 = var
則只有當 var 為
的時候才滿足條件
這個時候不存在 stop key
必須進行 full scan
對每個滿足其他where條件的數據進行判定
選出一行後才能去選rownum=
的行……
獨家披露XP SP
制作全程
多圖 ·劃時代創舉?Longhorn將支離破碎
搜狗
G郵箱與Gmail大比拼! ·微軟未來娛樂星MSN Wave
前曕(圖)
玩轉音頻!音量控制也很酷 ·Firefox神秘武器(
):妙用書簽
用MSN Msg發大表情嚇MM一跳 ·玩轉視頻!DIY萬能播放的WMP
DS Max
光線跟蹤渲染全攻略 ·電腦設計大師之路
選區詳解
《老鼠愛大米》中學演繹版! ·簡約精美!MAC風格屏保
獨家披露XP SP
制作全程
多圖 ·劃時代創舉?Longhorn將支離破碎
搜狗
G郵箱與Gmail大比拼! ·微軟未來娛樂星MSN Wave
前曕(圖)
玩轉音頻!音量控制也很酷 ·Firefox神秘武器(
):妙用書簽
用MSN Msg發大表情嚇MM一跳 ·玩轉視頻!DIY萬能播放的WMP
DS Max
光線跟蹤渲染全攻略 ·電腦設計大師之路
選區詳解
《老鼠愛大米》中學演繹版! ·簡約精美!MAC風格屏保
.快速編譯所有視圖 當在把數據庫倒入到新的服務器上後(數據庫重建)
需要將視圖重新編譯一遍
因為該表空間視圖到其它表空間的表的連接會出現問題
可以利用PL/SQL的語言特性
快速編譯
SQL >SPOOL ON
SQL
SQL >SELECT
ALTER VIEW
||TNAME||
COMPILE;
FROM TAB;
SQL >SPOOL OFF
然後執行ON
SQL即可
SQL >@ON
SQL
當然
授權和創建同義詞也可以快速進行
如
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_FILE
FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE
FOPEN(
C:\
TEST
TXT
A
);
UTL_FILE
PUT_LINE(FILE_HANDLE
HELLO
IT
S A TEST TXT FILE
);
UTL_FILE
FCLOSE(FILE_HANDLE);
END;
.在數據庫觸發器中使用列的新值與舊值 在數據庫觸發器中幾乎總是要使用觸發器基表的列值
如果某條語句需要某列修改前的值
使用:OLD就可以了
From:http://tw.wingwit.com/Article/program/Oracle/201311/16551.html