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;