Oracle上機練習題(五)
試卷總分:120
答題時間:240分鐘
第一大題
create table ODM.T_ACCT ---賬戶表
(ACCT_ID varchar2(19) ---賬戶號 PK
,ACCT_TYPE varchar2(2) ---賬戶性質 01活期;02定期;03保證金
,BAL number(24,6) ---餘額
);
create table ODM.T_ACCT_CUST ---賬號所屬客戶表
(ACCT_ID varchar2(19) ---賬戶號 PK
,CUST_ID varchar2(9) ---所屬客戶號,同一客戶可能有多個同一賬戶性質的賬戶
);
create table ODM.T_ACCT_INFO ---賬號基本信息表
(ACCT_ID varchar2(19) ---賬戶號 PK
,OPEN_BRANCH varchar2(6) ---開戶機構
,OPEN_DATE date ---開戶日期
,ACCT_STS varchar2(2) ---賬號狀態 01正常;02註銷;03凍結
);
create table ODM.T_CUST_INFO ---客戶基本信息表
(CUST_ID varchar2(9) ---客戶號 PK
,CUST_NAME varchar2(20) ---客戶姓名
,CUST_NBR varchar2(18) ---證件號,同一客戶可能通過相同證件號註冊多個客戶號
,NBR_TYPE varchar2(2) ---證件類型
,CUST_TEL varchar2(13) ---手機號碼
,OPEN_BRANCE varchar2(6) ---開戶機構
,OPEN_DATE date ---開戶日期
);
create table ODM.T_TRANS_INFO ---交易流水錶
(ACCT_ID varchar2(19) ---交易賬戶號
,TRANS_NO varchar2(20) ---交易流水號
,TRANS_TIME date ---交易日期時間
,TRANS_BAL numeric(24,6) ---交易金額
,OPP_ACCT_ID varchar2(19) ---交易對手賬戶號
);
1.
統計2個指標:1)機構號 PK 2)活期總餘額小於5萬且定期總餘額小於10萬的客戶數。
補充說明:
1) 證件號+證件類型相同的爲同一個客戶,所屬機構取【客戶基本信息表】中開戶日期小的客戶號的開戶機構。
2) 餘額只取賬號狀態爲正常的。[5分]
SELECT T.OPN_BRANCH,COUNT(DISTINCT T.CUST_NBR||T.NBR_TYPE)AS NUM FROM
(SELECT T3.OPN_BRANCH,T3.CUST_NBR,T3.NBR_TYPE
FROM ODM.T_ACCT T1,ODM.T_ACCT_INFO T3,ODM.TACCT_INFO T5
WHERE T1.ACCT_ID=T2.ACCT_ID AND T2.CUST_ID=T3.CUST_ID AND T3.OPN_DATE=
(SELECT MIN(T4.OPN_DATE) FROM ODM.T_CUST_INFO T4
WHERE T3.CUST_NBR=T4.CUST_NBR AND T3.NBR_TYPE=T4.NBR_TYPE)
AND T1.ACCT_ID=T5.ACC_ID AND T5.ACCT_STS='01' AND T1.ACCT_TYPE='01'
GROUP BY T3.OPN_BTANCH,T2.CUST_NBR,T3.NBR_TYPE
HAVING SUM(T1.BAL)<50000 --總餘額小於5萬的
INTERSECT
SELECT T3.OPN_BRANCH,T3.CUST_NBR,T3.NBR_TYPE
FROM ODM.T_ACCT T1,ODM.T_ACCT_CUST T2,ODM.T_CUST_INFO T3,ODM.T_ACCT_INFO T5
WHERE T1.ACCT_ID=T2.ACCT_ID
AND T2.CUST_ID=T3.CUST_ID AND T3.OPN_DATE=
(SELECT MIN(T4.OPN_DATE) FROM ODM.T_CUST_INFO T4
WHERE T3.CUST_NBR=T4.CUST_NBR
AND T3.NBR_TYPE=T4.NBR_TYPE)
AND T1.ACCT_ID=T5.ACC_ID AND T5.ACCT_SYS='01' AND T1.ACCT_TYPE='02'
GROUP BY T3.OPN_BRANCH,T3.CUST_NBR,T3.NBR_TYPE
HAVING SUM(T1.BAL)<100000) T
GROUP BY T.OPN_BRANCH;
2.
統計1個指標:1)賬戶號 限定爲近30田李在連續的2天內交易次數大於等於10次或交易總金額大於等於100萬的賬號。[5分]
SELECT ACCT_ID FROM
(SELECT T2.ACCT_ID,T2.NUM+T3.NUM AS TOTAL_NUM,T2.BAL+T3.BAL AS TOTAL_BAL
FROM (SELECT T1.TRANS_TIME,T1.ACCT_ID,
COUNT(DISTINCT T1.TRANS_NO) AS NUM,SUM(T1.TRANS_BAL) AS BAL
FROM ODM.T_TRACE_INFO T1
WHERE T1.TRANS_TIME>=SYSDATE-30
AND T1.TRANS_TIME<=SYSDATE
GROUP BY T1.TRANS_TIME,T1.ACCT)ID) T2,
(SELECT T1.TRANS_TIME,T1.ACCT_ID,
COUNT(DISTINCT T1.TRANS_NO) AS NUM,SUM(T1.TRANS_BAL) AS BAL
FROM ODM.T_TRANCE_INFO T1
WHERE T1.TRANS_TIME>=SYSDATE-30
AND T1.TRANS_TIME<=SYSDATE
GROUP BY T1.TRANS_TIME,T1.ACCT_ID) T3
WHERE T2.TRANS_TIME=T3.TRANS_TIME+1
AND T2.ACCT_ID=T3.ACCT_ID) T
WHERE T.TOTAL_NUM>=10 OR T.TOTAL_BAL>-1000000;
第二大題
create table ODMT_CARD ---卡片信息表
(CARD_NBR varchar2(19) ---卡號 PK
,ACCT_ID varchar2(19) ---所屬賬戶號
,ISSUE_DAY date ---髮卡日期
,ACTIVE_DAY date ---激活日期,未激活得爲空值
,ISSUE_BRANCH varchar2(6) ---髮卡機構
);
create table ODMT_EXC_CARD ---換卡信息表
(CARD_NBR varchar2(19) ---卡號 PK
,CARD_NBR_BF varchar2(19) ---換卡前對應卡號
,EXC_DAY date ---換卡日期
);
1.
按機構號統計近三個月以來每個月得髮卡數量,共4個指標:1)機構號 PK 2)上月髮卡數量 3)上上月髮卡數量 4)前第3個月髮卡數量。
補充說明:
1)只統計首長卡且激活了的卡片,換卡的不納入髮卡數量的統計範圍。
2)註釋清晰、有條理、便於維護佔15分,無任何註釋0分。[5分]
SELECT T1.ISSUE_BRANCH ,T1.NUM AS '上個月髮卡數',T2.NUM AS '上上個月髮卡數'
,T3.NUM AS '前第3個月髮卡數'
FROM
(SELECT T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM') AS MONTH,
COUNT(DISTINCT T1.CARD_NBR) AS NUM FROM ODM.T_CARD T1
WHERE T1.ISSUE_DAY >= TRUNC(ADD_MONTHS(SYSDATE, -1)) --上個月月初
AND T1.ISSUE_DAY <= LAST_DAY(ADD_MONTHS(SYSDATE, -1)) --上個月月末
AND T1.ACTIVE_DAY IS NOT NULL --激活日期不爲空
AND NOT EXISTS (SELECT 1 FROM ODM.T_EXC_CARD T2 --剔除換卡的卡片
WHERE T1.CARD_NBR = T2.CARD_NBR )
GROUP BY T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM')) T1 --上個月的髮卡統計
,
(SELECT T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM') AS MONTH,
COUNT(DISTINCT T1.CARD_NBR) AS NUM FROM ODM.T_CARD T1
WHERE T1.ISSUE_DAY >= TRUNC(ADD_MONTHS(SYSDATE, -2)) --上上個月月初
AND T1.ISSUE_DAY <= LAST_DAY(ADD_MONTHS(SYSDATE, -2)) --上上個月月末
AND T1.ACTIVE_DAY IS NOT NULL --激活日期不爲空
AND NOT EXISTS (SELECT 1 FROM ODM.T_EXC_CARD T2 --剔除換卡的卡片
WHERE T1.CARD_NBR = T2.CARD_NBR )
GROUP BY T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM')) T2 --上上個月的髮卡統計
,
(SELECT T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM') AS MONTH,
COUNT(DISTINCT T1.CARD_NBR) AS NUM FROM ODM.T_CARD T1
WHERE T1.ISSUE_DAY >= TRUNC(ADD_MONTHS(SYSDATE, -3)) --前第3月月初
AND T1.ISSUE_DAY <= LAST_DAY(ADD_MONTHS(SYSDATE, -3)) --前第3月月末
AND T1.ACTIVE_DAY IS NOT NULL --激活日期不爲空
AND NOT EXISTS (SELECT 1 FROM ODM.T_EXC_CARD T2 --剔除換卡的卡片
WHERE T1.CARD_NBR = T2.CARD_NBR )
GROUP BY T1.ISSUE_BRANCH ,TO_CHAR(T1.ISSUE_DAY,'YYYY-MM')) T3 --前第3個月的髮卡統計
WHERE T1.ISSUE_BRANCH = T2.ISSUE_BRANCH --髮卡機構關聯
AND T2.ISSUE_BRANCH = T3.ISSUE_BRANCH --髮卡機構關聯
第三大題
create table ODM.T_ACCT ---賬號表
(ACCT_ID varchar2(19) ---賬戶號 PK
,ACCT_TYPE varchar2(2) ---賬戶性質 01 活期;02 定期;03 保證金
,BAL numeric(24,6) ---餘額
);
create table ODM.T_ACCT_INFO ---賬戶基本信息表
(ACCT_ID varchar2(19) ---賬戶號 PK
,OPEN_BRANCH varchar2(6) ---開戶機構
,OPEN_DATE date ---開戶日期
,ACCT_STS varchar2(2) ---賬號狀態 01 正常;02 註銷;03 凍結
);
create table ODM.T_TRANS_INFO ---交易流水錶
(ACCT_ID varchar2(19) ---交易賬戶號
,TRANS_NO varchar2(20) ---交易流水號
,TRANS_TIME date ---交易日期時間
,TRANS_BAL numeric(24,6) ---交易金額
,OPP_ACCT_ID varchar2(19) ---交易對手賬戶號
);
1.
一條SQL展示5個指標:1)賬戶號 PK 2)開戶機構 3)賬戶性質 4)餘額 5)同一開戶機構下同一賬戶性質的所有賬戶的平均餘額,其中所有賬戶都限定爲正常裝填的。
[5分]
SELECT T1.ACCT_ID,T2.OPN_BRANCH,T1.ACCT_TYPE,T1.BAL,T5.AVG_BAL
FROM ODM.T_ACCT T1,ODM.T_ACCT_INFO T2,
(SELECT T4.OPN_BRANCH,T1.ACCT_TYPE,AVG(T3.BAL) AS AVG_BAL
FROM ODM.T_ACCT T3,ODM.T_ACCT_INFO T4
WHERE T3.ACCT_ID=T4.ACCT_ID
AND T4.ACCT_STS='01'
GROUP BY T4.OPN_BRANCH,T3.ACCT_TYPE) T5
WHERE T1.ACCT_ID=T2.ACCT_ID
AND T2.OPON_BRANCH=T5.OPN_BRANCH
AND T1.ACCT_TYPE=T5.ACCT_TYPE;
2.
根據輸入的交易日期時間和交易流水號,展示3個指標:1)交易賬戶號 2)交易金額 3)同一交易賬戶下前2筆交易、當前筆交易、下2筆交易共連續5筆的平均交易金額。[5分]
SELECT T1.ACCT_ID,T2.TRANS_BAL,AVG(T1.TANS_SAL)
(SELECT T1.ACCT_ID,T1.TRANS_BAL,T1.TRANS_NO,
ROW_NUMBER() OVER(PARTITION BY T1.TRANS_TIME,T1.ACCT_ID
ORDER BY T1.TRANS_NO ASC) AS CN
FROM ODM_TRANS_INFO T1
WHERE T1.TRANS_TIME=@輸入日期) T1,
(SELECT T1.ACCT_ID,T1.TRANS_BAL,T1.TRANS_NO,
ROW_NUMBER() OVER(PARTITION BY T1.TRANS_TIME,T1.ACCT_ID
ORDER BY T1.TRANS_NO ASC) AS CN
FROM ODM_TRANS_INFO T1
WHERE T1.TRANS_TIME=@輸入日期) T2
WHERE T2.TRANS_NO=@輸入的流水號
AND T2.ACCT_ID=T1.ACCT_ID
AND T1.CN>=T2.CN-2
AND T1.CN<=T2.CN+2
GROUP BY T1.ACCT_ID,T2.TRANS_BAL
HAVING COUNT(T1.TRANS_NO)=5;
第四大題
1.
查詢每個人的主管(主管本人不包含在內)。[5分]
select t1.*,t2.manager from employee t1,dept t2
where t1.dept=t2.deptno
and not exists(select t1 from dept t3 where t1.empno=t3.manager);
2.
查詢每個部門的男女總人數,其中性別(0-男,1-女)現實爲M-男,F-女。如下:
男 3
女 5[5分]
select deptno,case when sex=0 then 'M-男' when sex=1 then 'F-女' end,num
from (select t1.deptno,t2.sex,count(*) as num
from dept t1 left join employee t2 on t1.deptno=t2.dept
group by t1.deptno,t2.sex);
3.
查詢每個部門的平均年齡。[5分]
select t1.deptno,avg(nvl(t2.age,0) as num
from dept t1 left join employee t2 on t1.deptno=t2.dept
group by t1.deptno;
4.
查詢每個部門工資最低的員工。[5分]
select t1.deptno,min(t3.money)
from dept t1 left join employee t2 on t1.deptno=t2.dept left join wage t3 on t2.empno=t3.empno
and t3.item='salery'
group by t1.deptno;
5.
查詢每個部門工資最高的前三名,升序排列。[5分]
select t.* from
(select t1.deptno,t3.*,row_number() over(partition by t1.deptno
order by t3.money desc) as num
from dept t1 left join employee t2 on t1.deptno=t2.dept left join wage t3 on t2.empno=t3.empno and t3.item='salery') t
where t.num<=3
order by t.deptno,t.num desc;
6.
查詢工資延遲結算的人(結算日期大於次月1號)。[5分]
select distinct t.empno wage t where t.item='Late'
and t.countDate>add_month(to_date(t.month||'01','yyyy-mm-dd'),1);
7.
將所有主管的獎金(Bonus)修改爲450。[5分]
update wage set item=450 where item='Bonus' and empno in
(select manager from dept);
8.
將2005年至2018年所有的月份輸出,包括月份、月初日期、月末日期。
例如:201801,20180101,20180131。[5分]
select day_id,day_id||'01',last_day(to_date(day_id||'01','yyyy-mm-dd'))
from
(select to_char(add_months(to_date('2005-01','yyyy-mm'),rownum-1),'yyyy-mm') day_id
from dual
connect by rownum<=months_between
(to_date('2005-01','yyyy-mm'),to_date('2018-12','yyyy-mm'))+1);
第五大題
1.
創建一個口令認證的數據庫用戶usera_exer,口令爲usera,默認表空間爲USERS,配額爲10MB,初始賬號爲鎖定狀態。[5分]
create user usera_exer identified by usera default tablespace users quota 10m on users account lock;
2.
創建一個口令認證的數據庫用戶userb_exer,口令爲userb。[5分]
create user userb_exer identified by userb;
3.
爲usera用戶授予CREATE SESSION權限、scott.emp表的SELECT權限和UPDATE權限。同時允許該用戶將獲得的權限授予其他用戶。[5分]
grant select,update on scott.emp to usera_exer;
grant create session to usera_exer;
grant dba to usera_exer;
4.
將用戶usera_exer的賬號解鎖。[5分]
alter user usera_exer account unlock;
5.
用usera_exer登錄數據庫,查詢和更新scott.emp中的數據。同時,將scott.emp的SELECT和UPDATE權限授予用戶userb_exer。[5分]
conn usera_exer;
select * from scott.emp;
update scott.emp set sal=2333 where empno=7654;
grant select,update on scott.emp to userb_exer;
6.
禁止用戶usera_exer將獲得的CREATE SESSION權限再授予其他用戶。[5分]
revoke create session from usera_exer;
7.
禁止用戶usera_exer將獲得的scott.emp的SELECT權限和UPDATE權限再授予其他用戶。[5分]
revoke select,update on scott.emp from usera_exer;
8.
創建角色rolea和roleb,將CREATE TABLE權限,scott.emp的INSERT權限和DELETE權限授予rolea;將CONNECT,RESOURCE角色授予roleb。[5分]
create role rolea;
create role roleb;
grant insert,delete on scott.emp to rolea;
grant create table to rolea;
grant connect,resource to roleb;
9.
將角色rolea,roleb授予用戶usera_exer。[5分]
grant rolea,roleb to usera_exer;
10.
屏蔽用戶user_exer的roleb角色。[5分]
revoke roleb from user_exer;
11.
爲用戶usera_exer創建一個概要文件,限定該用戶的最長會話時間爲30分鐘,如果連接10分鐘空閒,則結束會話。同時,限定其口令有效期爲20天,連續登錄4次失敗後將鎖定該賬號,10天后自動解鎖。[5分]
create profile fwj_frofile limit CONNECT_TIME 30 IDLE_TIME 10 PASSWORD_LIFE_TIME 20 FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 10;
alter user usera_exer profile fwj_frofile;
alter user users profile special_user;