Oracle百問百答之進階提高(六)
51.delete、drop和truncate的區別
Delete:刪除數據,表結構還在,可以恢復(savepoint),缺點是刪除速度慢
Drop:刪除數據和表結構,可以閃回(flashback)[cascade:級聯刪除]
Truncate:刪除數據,表結構還在,無法找回,優點是刪除速度快
52.主鍵和外鍵指的是什麼?
能夠唯一標識一條記錄的屬性列(組)就是該表的主鍵。主鍵是唯一的,且必須非空。而外鍵是另外一張表中與主表的某個字段的類型、字段名相同的字段(關聯字段),外鍵的作用是關聯兩張或者兩個以上表,保持數據一致性、完整性。只要主表上的關聯字段是唯一或者主鍵,均可以被外鍵引用,但須注意的是外鍵不能是複合鍵。
53.查看哪個表被鎖?
Select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_mode
from v$locked_object lo,dba_objects ao,v$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid;
54.left join、right join、inner join full join,union,union all的區別
left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄
inner join(等值連接) 只返回兩個表中聯結字段相等的行
full join 返回兩張表中的行 left join+right join
UNION在進行錶鏈接後會篩選掉重複的記錄
UNION ALL操作只是簡單的將兩個結果合併後就返回
55.查找表中多餘的重複記錄,重複記錄是根據單個字段(Id)來判斷
select * from t where id in(select id from t group by id having count(*)>1 );
分析:先用分組函數group by 和聚合函數count()統計出有重複的id,再根據id查找重複的記錄。
56.刪除表中多餘的重複記錄,重複記錄是根據單個字段(Id)來判斷,重複的只保留一行
delete from t where id in(select id from t group by id having count(*)>1) and rowid not in
(select min(rowid) from t group by id having count(*)>1);
分析:先假設刪除全部重複的數據,再從要被刪除的數據中剔除(也就是保留)rowid最小的
57.查找表中多餘的重複記錄(多個字段)
select * from t where (id,name) in(select id,name from t group by id,name having count(*)>1 );
58.刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄
delete from t where (id,name) in(select id,name from t group by id,name having count(*)>1 ) and rowid not in
(select min(rowid) from t group by group by id,name having count(*)>1 );
59.怎樣生成執行計劃?
有3種方式a、explain plan for sql語句; select * from table(dbms_xplan.display);b、sqlplus中set autotrace on;c、toad中Ctrl+E,pl/sqldeveloper中F5
60.怎樣創建表空間?
create tablespace tsp_jh
datafile 'd:\oracle\product\10.2.0\oradata\apjh.dbf'
size 20m
reuse
autoextend on
next 5m
maxsize unlimited
logging
permanent
extent management local autoallocate
blocksize 8k
segment space management manual
flashback on;