Oracle數據庫上機練習5

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;

第四大題

 https://img.examcoo.com/paper/1414742/201904/155428997150240.png 

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;

 

發佈了24 篇原創文章 · 獲贊 40 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章