1、表:table1(FId,Fclass,Fscore),用最高效最簡單的SQL列出各班成績最高的列表,顯示班級,成績兩個欄位。
select fclass,max(fscore) from table1 group by fclass,fid
2、有一個表table1有兩個欄位FID,Fno,字都非空,寫一個SQL語句列出該表中一個FID對應多個不同的Fno的紀錄。
類如:
101a1001
101a1001
102a1002
102a1003
103a1004
104a1005
104a1006
105a1007
105a1007
105a1007
結果:
102a1002
102a1003
104a1005
104a1006
select t2.* from table1 t1, table1 t2 where t1.fid = t2.fid and t1.fno <> t2.fno;
3、有員工表empinfo
(
Fempno varchar2(10) not null pk,
Fempname varchar2(20) not null,
Fage number not null,
Fsalary number not null
);
假如資料量很大約1000萬條;寫一個你認為最高效的SQL,用一個SQL計算以下四種人:
fsalary>9999 and fage > 35
fsalary>9999 and fage < 35
fsalary <9999 and fage > 35
fsalary <9999 and fage < 35
每種員工的數量;
select sum(case when fsalary > 9999 and fage > 35
then 1
else 0end) as "fsalary>9999_fage>35",
sum(case when fsalary > 9999 and fage < 35
then 1
else 0
end) as "fsalary>9999_fage<35",
sum(case when fsalary < 9999 and fage > 35
then 1
else 0
end) as "fsalary<9999_fage>35",
sum(case when fsalary < 9999 and fage < 35
then 1
else 0
end) as "fsalary<9999_fage<35"
from empinfo;
4、表A欄位如下
month person income
月份 人員 收入
要求用一個SQL語句(注意是一個)的處所有人(不區分人員)每個月及上月和下月的總收入
要求列表輸出為
月份 當月收入 上月收入 下月收入
MONTHS PERSON INCOME
---------- ---------- ----------200807 mantisXF 5000200806 mantisXF2 3500200806 mantisXF3 3000200805 mantisXF1 2000200805 mantisXF6 2200200804 mantisXF7 1800200803 8mantisXF 4000200802 9mantisXF 4200200802 10mantisXF 3300200801 11mantisXF 4600200809 11mantisXF 6800
11 rows selected
select months, max(incomes), max(prev_months), max(next_months)
from (select months,
incomes,
decode(lag(months) over(order by months),
to_char(add_months(to_date(months, 'yyyymm'), -1), 'yyyymm'), lag(incomes) over(order by months), 0) as prev_months, decode(lead(months) over(order by months), to_char(add_months(to_date(months, 'yyyymm'), 1), 'yyyymm'), lead(incomes) over(order by months), 0) as next_months from (select months, sum(income) as incomes from a group by months) aa) aaagroup by months;
MONTHS MAX(INCOMES) MAX(PREV_MONTHS) MAX(NEXT_MONTHS)---------- ------------ ---------------- ----------------200801 4600 0 7500200802 7500 4600 4000200803 4000 7500 1800200804 1800 4000 4200200805 4200 1800 6500200806 6500 4200 5000200807 5000 6500 0200809 6800 0 0
5,表B
C1 c2
2005-01-01 1
2005-01-01 3
2005-01-02 5
要求的處資料
2005-01-01 4
2005-01-02 5
合計 9
試用一個Sql陳述式完成。
select nvl(to_char(t02,'yyyy-mm-dd'),'合計'),sum(t01)from test
group by rollup(t02)
6,資料庫1,2,3 範式的概念與理解。
7,簡述oracle行觸發器的變化表限制表的概念和使用限制,行觸發器裡面對這兩個表有什麼限制。
8、oracle暫存資料表有幾種。
暫存資料表和普通表的主要區別有哪些,使用暫存資料表的主要原因是什嗎?
9,怎麼實現:使一個會話裡面執行的多個過程函數或觸發器裡面都可以訪問的全域變數的效果,並且要實現會話間隔離?
10,aa,bb表都有20個欄位,且記錄數量都很大,aa,bb表的X欄位(非空)上有索引,
請用SQL列出aa表裡面存在的X在bb表不存在的X的值,請寫出認為最快的語句,並解譯原因。
11,簡述SGA主要組成結構和用途?
12什麼是分區表?簡述定界分割和列表分區的區別,分區表的主要優勢有哪些?
13,背景:某資料運行在archivelog,且用rman作過全備份和資料庫的冷備份,
且所有的歸檔日誌都有,現控制檔案全部損壞,其他檔案全部完好,請問該怎麼恢複該資料庫,說一兩種方法。
14,用rman寫一個備份語句:備份資料表空間TSB,level 為2的增量備份。
15,有個表a(x number(20),y number(20))用最快速高效的SQL向該表插入從1開始的連續的1000萬記錄。
1、表:table1(FId,Fclass,Fscore),用最高效最簡單的SQL列出各班成績最高的列表,顯示班級,成績兩個欄位。
2、有一個表table1有兩個欄位FID,Fno,字都非空,寫一個SQL語句列出該表中一個FID對應多個不同的Fno的紀錄。
類如:
101 a1001
101 a1001
102 a1002
102 a1003
103 a1004
104 a1005
104 a1006
105 a1007
105 a1007
105 a1007
結果:
102 a1002
102 a1003
104 a1005
104 a1006
3、有員工表empinfo
(
Fempno varchar2(10) not null pk,
Fempname varchar2(20) not null,
Fage number not null,
Fsalary number not null
);
假如資料量很大約1000萬條;寫一個你認為最高效的SQL,用一個SQL計算以下四種人:
fsalary>9999 and fage > 35
fsalary>9999 and fage < 35
fsalary<9999 and fage > 35
fsalary<9999 and fage < 35
每種員工的數量;
4、表A欄位如下
month person income
月份 人員 收入
要求用一個SQL語句(注意是一個)的處所有人(不區分人員)每個月及上月和下月的總收入
要求列表輸出為
月份 當月收入 上月收入 下月收入
5,表B
C1 c2
2005-01-01 1
2005-01-01 3
2005-01-02 5
要求的處資料
2005-01-01 4
2005-01-02 5
合計 9
試用一個Sql陳述式完成。
6,資料庫1,2,3 範式的概念與理解。
7,簡述oracle行觸發器的變化表限制表的概念和使用限制,行觸發器裡面對這兩個表有什麼限制。
8、oracle暫存資料表有幾種。
暫存資料表和普通表的主要區別有哪些,使用暫存資料表的主要原因是什嗎?
9,怎麼實現:使一個會話裡面執行的多個過程函數或觸發器裡面都可以訪問的全域變數的效果,並且要實現會話間隔離?
10,aa,bb表都有20個欄位,且記錄數量都很大,aa,bb表的X欄位(非空)上有索引,
請用SQL列出aa表裡面存在的X在bb表不存在的X的值,請寫出認為最快的語句,並解譯原因。
11,簡述SGA主要組成結構和用途?
12什麼是分區表?簡述定界分割和列表分區的區別,分區表的主要優勢有哪些?
13,背景:某資料運行在archivelog,且用rman作過全備份和資料庫的冷備份,
且所有的歸檔日誌都有,現控制檔案全部損壞,其他檔案全部完好,請問該怎麼恢複該資料庫,說一兩種方法。
14,用rman寫一個備份語句:備份資料表空間TSB,level 為2的增量備份。
15,有個表a(x number(20),y number(20))用最快速高效的SQL向該表插入從1開始的連續的1000萬記錄。
答案:
1、select Fclass,max(Fscore) from table1 group by Fclass
2、select * from table1 where FID in (select FID from table1 group by FID having (count(Distinct Fno))>=2)
3、select sum(case when fsalary>9999 and fage>35 then 1 else 0 end),
sum(case when fsalary>9999 and fage<35 then 1 else 0 end),
sum(case when fsalary<9999 and fage>35 then 1 else 0 end),
sum(case when fsalary<9999 and fage<35 then 1 else 0 end) from empinfo
4、
Select (Select Month From Table Where Month = To_Char(Sysdate, 'mm')) 月份,
(Select Sum(Income) From Table Where Month = To_Char(Sysdate, 'mm')) 當月收入,
(Select Sum(Income) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) - 1) 上月收入,
(Select Sum(Income) From Table Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) + 1) 下月收入
From Dual
5、select nvl(c1,'合計'),sum(c2) from B group by rollup(c1)
6.
關聯式資料庫設計之時是要遵守一定的規則的。尤其是資料庫設計範式
簡單介紹1NF(第一範式),2NF(第二範式),3NF(第三範式),
第一範式(1NF):在關係模式R中的每一個具體關係r中,如果每個屬性值 都是不可再分的最小資料單位,則稱R是第一範式的關係。
例:如職工號,姓名,電話號碼組成一個表(一個人可能有一個辦公室電話 和一個家裡電話號碼) 規範成為1NF有三種方法:
一是重複儲存職工號和姓名。這樣,關鍵字只能是電話號碼。
二是職工號為關鍵字,電話號碼分為單位電話和住家電話兩個屬性
三是職工號為關鍵字,但強制每條記錄只能有一個電話號碼。
以上三個方法,第一種方法最不可取,按實際情況選取後兩種情況。
第二範式(2NF):如果關係模式R(U,F)中的所有非主屬性都完全依賴於任意一個候選關鍵字,則稱關係R 是屬於第二範式的。
例:選課關係 SCI(SNO,CNO,GRADE,CREDIT)其中SNO為學號, CNO為課程號,GRADEGE 為成績,CREDIT 為學分。 由以上
條件,關鍵字為組合關鍵字(SNO,CNO)
在應用中使用以上關係模式有以下問題:
a.資料冗餘,假設同一門課由40個學生選修,學分就 重複40次。
b.更新異常,若調整了某課程的學分,相應的元組CREDIT值都要更新,有可能會出現同一門課學分不同。
c.插入異常,如計劃開新課,由於沒人選修,沒有學號關鍵字,只能等有人選修才能把課程和學分存入。
d.刪除異常,若學生已經結業,從當前資料庫刪除選修記錄。某些門課程新生尚未選修,則此門課程及學分記錄無法儲存。
原因:非關鍵字屬性CREDIT僅函數依賴於CNO,也就是CREDIT部分依賴組合關鍵字(SNO,CNO)而不是完全依賴。
解決方案:分成兩個關係模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新關係包括兩個關係模式,它們之間通過SCN中
的外關鍵字CNO相聯絡,需要時再進行自然聯結,恢複了原來的關係
第三範式(3NF):如果關係模式R(U,F)中的所有非主屬性對任何候選關鍵字都不存在傳遞信賴,則稱關係R是屬於第三範式的。
例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各屬性分別代表學號,
姓名,所在系,系名稱,系地址。
關鍵字SNO決定各個屬性。由於是單個關鍵字,沒有部分依賴的問題,肯定是2NF。但這關係肯定有大量的冗餘,有關學生所在的幾個
屬性DNO,DNAME,LOCATION將重複儲存,插入,刪除和修改時也將產生類似以上例的情況。
原因:關係中存在傳遞依賴造成的。即SNO -> DNO。 而DNO -> SNO卻不存在,DNO -> LOCATION, 因此關鍵遼 SNO 對 LOCATIO
N 函數決定是通過傳遞依賴 SNO -> LOCATION 實現的。也就是說,SNO不直接決定非主屬性LOCATION。
解決目地:每個關係模式中不能留有傳遞依賴。
解決方案:分為兩個關係 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:關係S中不能沒有外關鍵字DNO。否則兩個關係之間失去聯絡。
7.
變化表mutating table
被DML語句正在修改的表
需要作為DELETE CASCADE參考完整性限制的結果進行更新的表也是變化的
限制:對於Session本身,不能讀取正在變化的表
限制表constraining table
需要對參考完整性限制執行讀操作的表
限制:如果限制列正在被改變,那麼讀取或修改會觸發錯誤,但是修改其它列是允許的。
8.
在Oracle中,可以建立以下兩種暫存資料表:
a。會話特有的暫存資料表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS;
b。事務特有的暫存資料表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的暫存資料表雖然是存在的,但是你試一下insert 一條記錄然後用別的串連登上去select,記錄是空的,明白了吧。
下面兩句話再貼一下:
--ON COMMIT DELETE ROWS 說明暫存資料表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
--ON COMMIT PRESERVE ROWS 說明暫存資料表是會話指定,當中斷會話時ORACLE將截斷表。
9.--個人理解就是建立一個包,將常量或所謂的全域變數用包中的函數返回出來就可以了,摘抄一短網上的解決方案
Oracle資料庫程式包中的變數,在本程式包中可以直接引用,但是在程式包之外,則不可以直接引用。對程式包變數的存取,可以為每個變數配套相應的預存程序<用於儲存資料>和函數<用於讀取資料>來實現。
3.2 執行個體
--定義程式包
create or replace package PKG_System_Constant is
C_SystemTitle nVarChar2(100):='測試全域程式變數'; --定義常數
--擷取常數<系統標題>
Function FN_GetSystemTitle
Return nVarChar2;
G_CurrentDate Date:=SysDate; --定義全域變數
--擷取全域變數<當前日期>
Function FN_GetCurrentDate
Return Date;
--設定全域變數<當前日期>
Procedure SP_SetCurrentDate
(P_CurrentDate In Date);
End PKG_System_Constant;
/
create or replace package body PKG_System_Constant is
--擷取常數<系統標題>
Function FN_GetSystemTitle
Return nVarChar2
Is
Begin
Return C_SystemTitle;
End FN_GetSystemTitle;
--擷取全域變數<當前日期>
Function FN_GetCurrentDate
Return Date
Is
Begin
Return G_CurrentDate;
End FN_GetCurrentDate;
--設定全域變數<當前日期>
Procedure SP_SetCurrentDate
(P_CurrentDate In Date)
Is
Begin
G_CurrentDate:=P_CurrentDate;
End SP_SetCurrentDate;
End PKG_System_Constant;
/
3.3 測試
--測試讀取常數
Select PKG_System_Constant.FN_GetSystemTitle From Dual;
--測試設定全域變數
Declare
Begin
PKG_System_Constant.SP_SetCurrentDate(To_Date('2001.01.01','yyyy.mm.dd'));
End;
/
--測試讀取全域變數
Select PKG_System_Constant.FN_GetCurrentDate From Dual;
10.
select aa.x from aa
where not exists (select 'x' from bb where aa.x = bb.x) ;
以上語句同時使用到了aa中x的索引和的bb中x的索引
11
SGA是Oracle為一個執行個體分配的一組共用記憶體緩衝區,它包含該執行個體的資料和控制資訊。SGA在執行個體啟動時被自動分配,當執行個體關閉時被收回。資料庫的所有資料操作都要通過SGA來進行。
SGA中記憶體根據存放資訊的不同,可以分為如下幾個地區:
a.Buffer Cache:存放資料庫中資料庫塊的拷貝。它是由一組緩衝塊所組成,這些緩衝塊為所有與該執行個體相連結的使用者進程所共用。緩衝塊的數目由初始化參數DB_BLOCK_BUFFERS確定,緩衝塊的大小由初始化參數DB_BLOCK_SIZE確定。大的資料區塊可提高查詢速度。它由DBWR操作。
b. 日誌緩衝區Redo Log Buffer:存放資料操作的更改資訊。它們以日誌項(redo entry)的形式存放在日誌緩衝區中。當需要進行資料庫恢複時,日誌項用於重構或復原對資料庫所做的變更。日誌緩衝區的大小由初始化參數LOG_BUFFER確定。大的日誌緩衝區可減少記錄檔I/O的次數。後台進程LGWR將日誌緩衝區中的資訊寫入磁碟的記錄檔中,可啟動ARCH後台進程進行日誌資訊歸檔。
c. 共用池Shared Pool:包含用來處理的SQL語句資訊。它包含共用SQL區和資料字典儲存區。共用SQL區包含執行特定的SQL語句所用的資訊。資料字典區用於存放資料字典,它為所有使用者進程所共用。
12.
使用分區方式建立的表叫分區表
定界分割
每個分區都由一個分區索引值範圍指定(對於一個以日期列作為分區鍵的表,“2005 年 1 月”分區包含分區索引值為從“2005 年 1 月 1 日”
到“2005 年 1 月 31 日”的行)。
列表分區
每個分區都由一個分區索引值列表指定(對於一個地區列作為分區鍵的表,“北美”分區可能包含值“加拿大”“美國”和“墨西哥”)。
資料分割函數通過改善可管理性、效能和可用性,從而為各式應用程式帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的效能大大提高。此外,分區還可以極大簡化常見的管理工作。通過分區,資料庫設計人員和管理員能夠解決前沿應用程式帶來的一些難題。分區是構建千MB資料系統或超高可用性系統的關鍵工具。
13
回複的方法:
一.使用冷備份,直接將冷備份的檔案全部COPY到原先的目錄下,在從新啟動資料庫就可以
二.使用歸檔日誌,
1.啟動資料庫NOMOUNT
2.建立控制檔案,控制檔案指定資料檔案和重做記錄檔的位置.
3.使用RECOVER DATABASE using backup controlfile until cancel 命令回複資料庫,這時可以使用歸檔日誌
4.ALETER DATABASE OPEN RESETLOGS;
5.重新備份資料庫和控制檔案
14的話參考RMAN的使用手冊
15略