1. 程式人生 > >資料庫筆試題(2)

資料庫筆試題(2)

資料庫筆試題

姓名 日期
一、選擇題
1、當你執行一下查詢語句:SELECT empno, ename FROM emp WHERE empno=7782 OR empno=7876; 在WHERE語句中,以下哪個操作符可以取代OR? A
A IN
B BETWEEN …閉區間
C LIKE
D <=

2、哪個實現IF…THEN …ELSE 邏輯?C
A INTCAP() 首字母大寫
B REPLACE()
C DECODE()
D IFELSE()

3、當一個程式執行了SELECT … FOR UPDATE 語句,以下哪個步驟必須需要完成? A
A 執行COMMIT 或ROLLBACK 結束 TRANSACTION,即使並沒有資料改變
B 如果有資料改變,則需要執行COMMIT 或 ROLLBACK來結束TRANSACTION 不全面
C 由於只有資料確實改變後,一個TRANSACTION 才會開始,所以現在不需要COMMIT
或ROLLBACK 被執行 說錯了

4、以下哪個命令可以被用來從表STATE 中 DROP 列 UPDATE_DT ? A
A ALTER TABLE STATE DROP COLUMN UPDATE_DT;
B ALTER TABLE STATE REMOVE COLUMN UPDATE_DT;
C DROP COLUMN UPDATE_DT FROM STATE ;
D 你不能從這個表中DROP 該列

5、下列哪個函式不可以將NULL值轉換為實際值 D
A NVL
B NVL2
C NULLIF[Oracle NULLIF函式
語法為NULLIF(表示式1,表示式2),
如果表示式1 = 表示式2則返回空值,
如果表示式1 !=表示式2則返回表示式1的結果。]
D TO_NUMBER 會報錯

6、當兩位使用者中的每一位都對一個單獨的物件進行了鎖定,而他們又要獲取對方物件的鎖
時,將會發生? 兩人是交叉的訪問 B
A 共享鎖[共享鎖(S,讀鎖): 只讀,不能修改,即允許多個事務對某個資料同時獲得S鎖讀許可權,且無法新增X鎖修改資料!
]
B 死鎖
C 排他鎖[排他鎖(X,寫鎖):某資料被T1加X鎖,不再允許其他事務對其進行任何鎖處理(直到T1釋放X鎖),僅有事務T1能對資料可讀可修改,其他事務無讀寫許可權;    ]

7、DBMS_LOB 資料包提供的,返回LOB值的長度 D
A LENGTH
B SUBSTR
C INSTR
D GELENGTH
8、PL/SQL為記憶體耗盡時,預定義了( ) 異常 B
A NO_DATA_FOUND
B MEMORY_ERROR
C STORAGE_ERROR 硬碟問題
D NO_MOMORY_FOUND

9、在建立序列的過程中,下列哪個選項指定序列在達到最大值或最小值後,將繼續從頭開
始生成值 A
A CYCLE 迴圈
B NOCYCLE
C CACHE 快取
D NOCACHE

10、下列有關包的使用說法錯誤的是 D
A 在不同的包內模組可以重名
B 包的私有過程不能被外部程式呼叫 Java裡的
C 包體中的過程和函式必須在包頭部分說明
D 必須先建立包頭,然後建立包體

11、在ORACLE中,需要( ) 許可權來呼叫其他使用者產生的函式 D
A 函式中使用的表格的select許可權
B 函式中使用的表格的execute許可權
C 函式的execute許可權
D 函式中使用的表格的select許可權和函式的execute許可權

12、在ORACLE中,ORDER BY 子句中 ( )關鍵詞是用於從高到低的顯示數字型列值的 D
A AS
B ASC 正序,預設
C INTO
D DESC 倒序
E BETWEEN…AND

13、在ORACLE中,僱員資訊表的主鍵是僱員號,部門資訊表的主鍵是部門號,在下列所給的
操作中哪項內容不能執行 D
僱員資訊表 部門資訊表

僱員號 僱員名 部門號 工資
001 張三 02 2000
010 王巨集達 01 1200
066 馬林 02 1000
101 趙敏 04 1500
部門號 部門名 主任
01 業務部 李建
02 銷售部 英東
03 服務部 周銀
04 財務部 陳勝利

A 從僱員資訊表中刪除行(’010’,’王巨集達’,’01’,’1200’)
B 將行(’102’,’趙敏’,’01’,’1500’)插入到僱員資訊表中
C 將僱員資訊表中僱員號為’010’的工資改為1600
D 將僱員資訊表中僱員為’010’的部門改為’05’
14、在ORACLE 中,使用HAVING子句也可以進行條件查詢,所以以下選項中說法是正確
的 B
A HAVING子句和WHERE子句相同
B HAVING 子句用於已分組結果的條件查詢
C HAVING 子句用於行的條件查詢 where
D 以上皆非

15、ID是表TABLE1的主鍵,則我們可以確定 A
A TABLE1 只有ID 一個主鍵
B 資料庫範圍內其他表都不可以用ID 為主鍵
C ID必定為某張表的外來鍵
D 以上皆非

二、簡答題

1、查詢oracle資料庫中(表t)被哪些物件使用:
select * from user_dependencies
where referenced_name = ’t’
and referenced_type = ‘TABLE’

2、根據ID刪除表中重複記錄:
delete from 表 t1 where t1.rowid <
(select max(rowid) from 表  t2 where t1.id = t2.id)

3、表t有若干列(id,name,…,value),存放資料5000萬,用最優的方法把value處理為value*(0.1-1)之間的隨機數
create table 表_bak as
select id,name,…,value * round(dbms_random.value(0.1,1),1) from 表;
truncate table 表;
insert into 表 select * from表_bak;
commit;

4、根據表t(code,pcode)中的pcode遞迴查詢獲取所有子節點,已知pcode=’A’
遞迴的寫法
select * from t
start with t.pcode = ‘A’
connect by t.parent = prior t.code

5、觀察下表,用sql語句實現下列結果
原表結構 目標結構
Id Value1 Value2 Value1 Value2
100001 10 10 9.9 10.1
100001 10 10 9.8 10.2
100002 20 20 20.1 19.9
100002 20 20 20.2 19.8
100003 30 30 29.9 30.1
100003 30 30 29.8 30.2
100004 40 40 40.1 39.9
100004 40 40 40.2 39.8

奇數部分 減去 0.1 0.2
偶數部分 加 0.1 0.2
第一行減去0.1 第二行減去0.2
Select id ,
value1 – decode(mod(id,2),1,1,-1)[Case when 值除以2
沒有餘數 就是偶數就是 -1
有餘數 就是 奇數就是 +1

Case when mod(id,2) = 0 then -1 else 1 end

Value1 + Power(-1,value1/10)
Value2 - Power(-1,value1/10)
]*(row_number() over(partition by id order by id)/10) ,
value2 + decode(mod(id,2),1,1,-1)(row_number() over(partition by id order by id)/10) from 表

6、已知“ab+ab=bcc”,用一句sql實現a,b,c的對應值(0…9的數字)
A 是十位的 B 是個位數的

select t1.a ,t2.b, t3.c from
(select rownum - 1 as a from scott.emp where rownum <=10) t1 ,
(select rownum - 1 as b from scott.emp where rownum <=10) t2,
(select rownum - 1 as c from scott.emp where rownum <=10) t3
where t1.a10 + t2.b + t1.a10 + t2.b = t2.b100 + t3.c10 + t3.c

7、一組通話記錄如下:
ID 主叫號碼 被叫號碼 通話起始時間 通話結束時間 通話時長
1 98290000 021546654665 2007-02-01 09:49:53.000 2007-02-01 09:50:16.000 23
2 98290000 021546654666 2007-02-01 09:50:29.000 2007-02-01 09:50:41.000 12
3 98290000 021546654666 2007-02-01 09:50:58.000 2007-02-01 09:51:12.000 14
4 68290900 075513332986 2007-02-01 10:04:31.000 2007-02-01 10:07:13.000 162
5 78290000 075525570863 2007-02-01 10:48:26.000 2007-02-01 10:19:23.000 57

6 78290000 035730928370 2007-02-01 10:49:39.000 2007-02-01 10:52:55.000 196
7 78290000 087113888990 2007-02-01 11:30:45.000 2007-02-01 11:31:58.000 73
8 78290000 035730928379 2007-02-01 11:33:47.000 2007-02-01 11:35:00.000 73

9 68290000 075582111910 2007-02-01 11:52:20.000 2007-02-01 11:54:56.000 156
10 68290000 029852181119 2007-02-01 12:44:45.000 2007-02-01 12:45:04.000 19
求其中同一個號碼的兩次通話之間間隔大於10秒通話記錄ID
例如:6,7,8,9,10條記錄均符合

用兩次該表
t1表示第一行資料
t2表示第二行資料
判斷第一行的結束時間和第二行開始時間之間的間隔

select * from 表 t1 ,
表 t2
where t2.通話起始時間 - t1.通話結束時間> 10
and t1.主叫號碼 = t2.主叫號碼
and t2.id = t1.id +1

8、表T(bbq時間,rg_code行政區劃,code預算科目,amt金額),以時間bbq(“yyyymmdd”)格式儲存,用最優語句計算每個地區每個預算科目的日資料,月累計和年累計
select rg_code ,code,bbq, day_amt,
sum(day_amt) over(partition by rg_code ,code,substr(bbq,1,6)) as 月累計,
sum(day_amt) over(partition by rg_code ,code,substr(bbq,1,4)) as 年累計
from
(select rg_code ,code,bbq,sum(amt) as day_amt
from T
group by rg_code ,code, bbq );----要得到日資料 就可以按時間分組

9、請寫出一條sql語句,查詢出在此期間連續3年納稅金額大於等於2000萬的企業有哪些,其連續的年份的起止時間是多少,平均納稅金額是多少,結果如下:
YEAR ENT AMT
2010 AA 2000
2011 AA 2500
2012 AA 2300
2013 AA 1900
2014 AA 2200
2015 AA 2300
2016 AA 2006
2010 BB 2400
2011 BB 2401
2012 BB 1800
2013 BB 2100
2014 BB 2101
2015 BB 2102
2016 BB 2020

企業名稱 開始時間 結束時間 平均納稅
AA 2010 2012 2266.7
AA 2014 2016 2168.7
BB 2013 2016 2080.8

Select distinct ent , min_year, max _year, ,amt_total/num
from
(Select ent,min(year) over(partition by ent,ch) as min_year,
max(year) over(partition by ent,ch) as max _year,
sum(amt) over(partition by ent,ch) as amt_total,
count(*) over(partition by ent,ch) as num
from
( Select ent ,year ,amt ,
(year - row_number() over(partition by ent order by year)) as ch
from t
where amt>=2000)
)
where num = 3

10、有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問某些月後兔子總數為多少?(要求過程實現輸入任意時間得到相應的結果)
規律:
1 1 2 3 5 8 13 21 34 55 89 144 ….
按 每對兔子計算 前兩個相加等於結果的第三個數值

create procedure tt (num number)
as
rab_num number(38):=1;
rab_midi number(38):=0;
rab_result number(38):=1;
begin
for x in 3…num loop
rab_midi= rab_result; —中間的那個容器
rab_result= rab_result + rab_num; —結果值放在前一個月的
rab_num= rab_midi;
end loop;
dbms_output.putline(rab_result);
end