Oracle面試題


1.rowid、rownum的定義

答:rowid是物理地址,是用於定位數據表中數據存儲的位置,唯一的,不會改變

rownum是SQL輸出結果的排序,同一條記錄不同查詢條件對應的rownum也會不同

 

2.Oracle中function何procedure的區別?

答:function是函數,procedure是存儲過程,函數有1個返回值,存儲過程有多個或者沒有;函數可以在查詢語句中調用,而存儲過程只能單獨調用;

 

3.Oracle的導入導出有幾種方式,有何區別?

1)dmp文件方式
描述:dmp文件是二進制的,可以跨平台,並且包含權限,支持大字段數據,是用的最廣泛的一種。

導出語法:exp 用戶名/密碼@監聽器路徑/數據庫實例名稱 file=e:數據庫文件.dmp full=y ignore=y ;其中full = y ,表示整個數據庫操作; ignore=y,忽略錯誤,繼續操作;
重點內容
導出舉例:exp jojo/jojo@localhost/my_database file=e:my_database.dmp full=y ignore=y

導入語法:imp 用戶名/密碼@監聽器路徑/數據庫實例名稱 file=e:數據庫文件.dmp full=y ignore=y ;

導入舉例:imp jojo/jojo@localhost/my_database file=e:my_database.dmp full=y ignore=y

2)sql文件方式
SQL文件可用文本編輯器查看,有利於可讀性,但效率不如dmp文件,適合小數據量導入導出。尤其注意的是表中不能有大字段(blob,clob,long),如果有,會提示不能導出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)

3)pde文件
第三種是導出為pde格式,pde格式是PL/SQL 自帶的文件格式,且且適用於PL/SQL工具,編輯器無法查看,一般不常用。

 

4.Oracle數據庫sql查詢把數據為空的項顯示為0,用sql查詢表示?

答:select decode(name,NULL,0,name) from table;

 

5.truncate和delete命令的異同?

答:truncate是DDL,隱形提交,不能回滾,delete是DML,每次刪除都有記錄;

執行速度上truncate>delete;

truncate是通過釋放數據頁來達到刪除效果,所以日志文件只有一條刪除記錄,delete每刪除一條就有一條記錄;

 

6.數據庫和數據倉庫有什么區別?

答:數據庫是面向事務,而數據倉庫是面向主題的;數據庫的設計是盡量避免冗余,因此符合范式,數據倉庫反過來是盡可能引入冗余,利用反范式來設計;另外數據庫面向的都是一些在線數據,數據倉庫都是歷史數據。還有之所以說數據倉庫是數據庫的升級優化版,是因為數據庫是用來存放捕獲數據,數據倉庫在次基礎上對數據進行分析。

 

7.Oracle中in與exists的區別?

答:exists返回的是一個布爾值,ture或false,in返回的是一個數據組吧。從查詢效率角度分析,當外循環(主循環)返回的結果集大於子循環返回的結果值時,用in,反之用exists。

 

8.char()和varchar()有什么區別?

答:1.char的長度是不可變的,而varchar的長度是可變的;

       2.定義一個char[10]和varchar[10],如果存進去的是‘abcd’,那么char所占的長度依然為10,除了字符‘abcd’外,后面跟六個空格,而varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多余的空格,而varchar是不需要的

       3.char的存取數度還是要比varchar要快得多

       4.char的存儲方式是,對英文字符(ASCII)占用1個字節,對一個漢字占用兩個字節;而varchar的存儲方式是,對每個英文字符占用2個字節,漢字也占用2個字節,兩者的存儲數據都非unicode的字符數據。

 

選擇適當的數據結構建表(省市縣三級關系)

create table china
(
c_id varchar(7) NOT NULL comment '地區編號',
c_name varchar(50) NOT NULL comment '地區名稱',
c_fid varchar(7) default -1 comment '父級id',
c_jibie char(5) NOT NULL comment '省=1,市=2,縣=3',
primary key (c_id)
)

 

 

查詢成績表score中每科成績前三名

select a.* from score a left join score b on a.c_id=b.c_id 
and a.s_score<b.s_score
group by a.s_id,a.c_id 
having count(b.s_id)<3 
order by a.c_id,a.s_score desc;

 

寫一個存儲過程,實現輸入數字n,輸出1到n的和

create procedure p(in n int,out result int)
begin
declace i int default 1;
declace sum int default 0;
while i<n
set sum=sum+i;
set i=i+1;     //如果奇數相加則i=i+2
end while
set result=sum;
end

 

用PL/SQL塊實現在一個表中插入1000條數據,要求每100條提交一次

delimiter ||
create procedure p(in n int)
begin 
declare i int default 0; 
set i=0; 
lp:loop insert into kkk values(i+1); 
set i=i+1; 
if mod(i,10)=0 then 
commit; 
end if; 
if i=n then 
leave lp; 
end if; 
end loop; 
end||

 

有3個表 A(userid(用戶ID),time(時間),fee(話費)),B(userid(用戶ID),time(時間)),  C(userid(用戶ID),fee(話費))各有1000萬的數據, 3個表的userid是相同的,要求用B表的time字段,C表的fee字段更新A表的相應字段,用存儲過程實現。

create procedure p1
cursor abc_cur is select b.userid,b.time,c.fee 
from b join c on b.userid=c.userid;
begin
for i in abc_cur loop
update a set a.time=i.time,a.fee=c.fee 
where a.userid=i.userid;
end loop;
end ||

 

有上百萬數據用戶表,刪除其中的重復數據,保留最小id號

delete from kxf  k
where k.name in(select name from kxf group by name having count(*) >1) and
k.id not in (select min(id) from kxf froup by name);

 

用戶資料表:serv( serv_id number(10), pro_id number(10), user_type varchar2(30), terminal_name varchar2(30) )

其中,serv_id 為用戶標識,是serv表的主鍵,prod_id為產品標識;user_type為用戶類型;terminal_name為終端類型

終端類型臨時表:terminal(serv_id number(10),terminal_name varchar2(30))

初始化的情況下,serv表的serv_id,prod_id,user_type字段是已知的,terminal_name字段是空的

要求:根據prod_id,user_type字段的值來更新terminal_name字段

更新條件為:

當條件滿足“prod_id = 1 and user_type='A'“時,terminal_name更新為‘固話’

當條件滿足”prod_id = 1 and user_type='B'“時,terminal_name更新為‘小靈通’

當條件滿足”prod_id = 2“時,terminal_name更新為‘寬帶’

當條件滿足”user_type=‘C’“時,terminal_name更新為‘CDMA’

以上條件均不滿足時,terminal_name更新為 -1;

create procedure p 
is 
begin
update serv s
set s.terminal_name = case when prod_id=1 and user_type='A' then 固話
                                           when prod_id=1 and user_type='B' then 小靈通
                                           when prod_id=2 then 寬帶
                                           when user_type='C' then CDMA
                                    else '-1' 
                                    end;
update terminal a
set a.terminal_name = (select t.terminal_name 
                              from serv t
                             where t.serv_id = a.serv_id)
where exists (select *
                   from serv t
                   where t.serv_id = s.serv_id);
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM