oracle sql面試題



僱員表:EMPLOYEE

(EMPNO     CHARACTER(6)   NOT NULL, --僱員編號,定義爲主鍵  

FIRSTNAME  VARCHAR(12)     NOT NULL, --僱員第一個名字  

MIDINIT   CHARACTER(1),            --僱員中間名字的首字母  

LASTNAME  VARCHAR(15)     NOT NULL, --僱員最後一個名字  

WORKDEPT  SMALLINT,                --部門編號,外鍵,對應部門表DEPTNO  

PHONENO   CHARACTER(4),            --電話號碼  

HIREDATE  DATE,                    --僱用日期  

JOB       CHARACTER(8),            --工作崗位

EDLEVEL   SMALLINT       NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)

SEX       CHARACTER(1),            --性別(1:男,2:女)

BIRTHDATEDATE,                    --出生日期(60週歲以上爲退休)  

SALARY    DECIMAL(9,2),            --薪水  

BONUS     DECIMAL(9,2)             --獎金

);

部門表:DEPT

 (DEPTNO  SMALLINT      NOT NULL, --部門編號,主鍵

  DEPTNAME VARCHAR(14),    --部門名稱

  MANAGER  SMALLINT   --部門經理編號,每個經理也是僱員表中一個僱員 )

);

1 找出收入(SALARYBONUS之和)最低的10EMPNO,按照收入從低到高排序Oracle:

selectnvl(bonus, 0) + nvl(salary, 0) as income

  from EMPLOYEE t  order by income

2 從僱員表中刪除僱用日期在194011日以前的僱員。Oracle

Delete fromEMPLOYEE wherehiredate<to_date('2012-01-01','yyyy-mm-dd');

3、算出所有僱員的平均收入(SALARYBONUS之和)、最低收入、最高收入,取整數位,小數點後面四捨五入。 oracle:

select round(sum(nvl(salary, 0) + nvl(bonus, 0)), 0),

        round(min(nvl(salary, 0) +nvl(bonus, 0)), 0),

        round(max(nvl(salary, 0) +nvl(bonus, 0)), 0)

  from employee 

4.列出所有僱員的全名,全部轉換成大寫字母,名字每一部分中間用空格隔開。oracle:

selectupper(FIRSTNME||' '||MIDINIT||' '||LASTNAME) fromemployee

5、找出僱員數大於50的部門的編號。oracle:

select deptno, deptname from dept where deptno in (selectworkdept  from employee   group by workdept  having count(*) > 50) 

6、在僱員表JOB字段上新建一個索引,取名idx_emp_job oracle:

Createindex idx_emp_job onemployee(job)   

7、找到FIRSTNME=’John’的員工所在部門的名稱和部門經理編號 oracle

select manager, deptname from dept where deptno in(selectworkdept fromemployee t  where t.firstname = 'Jhon')

8、更新僱員表的薪水,如果爲空置爲0,如果不爲空,不變更字段值。oracle:

update  employee set bonus=0 where bonus is null   

9、往部門表新增一個部門,DEPTNO=123DEPTNAME=’Market’MANAGER=20 oracle:

Insertinto dept values(123,'Market',20)

10、列出每個員工的字母縮寫,忽略中間的名字,例如,CHRISTINEI HAAS縮寫爲CHBRUCE ADAMSON縮寫爲BAoracle:

selectsubstr (upper(firstname),1,1)||substr(upper(lastname),1,1) fromemployee

                                                     第二部分

僱員表:EMPLOYEE

(EMPNO     CHARACTER(6)   NOT NULL, --僱員編號,定義爲主鍵  

FIRSTNAME  VARCHAR(12)     NOT NULL, --僱員第一個名字  

MIDINIT   CHARACTER(1),            --僱員中間名字的首字母  

LASTNAME  VARCHAR(15)     NOT NULL, --僱員最後一個名字  

WORKDEPT  SMALLINT,                --部門編號,外鍵,對應部門表DEPTNO  

PHONENO   CHARACTER(4),            --電話號碼  

HIREDATE  DATE,                    --僱用日期  

JOB       CHARACTER(8),            --工作崗位

EDLEVEL   SMALLINT       NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)

SEX       CHARACTER(1),            --性別(1:男,2:女)

BIRTHDATE DATE,                    --出生日期(60週歲以上爲退休)  

SALARY    DECIMAL(9,2),            --薪水  

BONUS     DECIMAL(9,2)             --獎金

);

部門表:DEPT

 (DEPTNO  SMALLINT      NOT NULL, --部門編號,主鍵

  DEPTNAME VARCHAR(14),    --部門名稱

  MANAGER  SMALLINT   --部門經理編號,每個經理也是僱員表中一個僱員 )

);

1、如果僱員對應的經理編號小於100,更新僱員表的薪水和獎金字段,如果爲空置爲0,如果不爲空,在原有基礎上加10%,結果按四捨五入取整。oracle:

update employeea

   set salary = nvl(salary,0)*1.1,bonus = nvl(bonus,0) * 1.1

 whereexists (select1

          fromdept b

         whereb.manager < 2

          anda.workdept = b.deptno)

2、在三個不同的地區,僱員表各有一張,分別是EMPLOYEE_CNEMPLOYEE_USEMPLOYEE_EU,三張表表結構一樣,存放的是本地區僱員的信息,三張表的僱員編號沒有重複。同樣在不同的地區,也各自有一張部門表,DEPT_CNDEPT_USDEPT_EU,這三張表有重複的記錄。需要算出全公司範圍內各個部門的薪酬(薪水加獎金)成本,已經撤銷的部門在部門表中也有記錄,需要在結果集中體現。寫出SQL。要求輸出格式如下:

部門名稱    薪酬       人數

Market        500000    5 

Head Office 1200000     20 

Plains       0          0

Selectb.deptname, sum(income),sum(cnt)

  from (Selectworkdept, count(*) cnt, sum(salary+ bonus) income from EMPLOYEE_CN  groupbyworkdept

        Unionall

        Selectworkdept, count(*) cnt, sum(salary+ bonus) income   from EMPLOYEE_US groupbyworkdept

        Unionall

        Selectworkdept, count(*) cnt, sum(salary+ bonus) income  from EMPLOYEE_EU  groupbyworkdept) a

 rightouterjoin (selectdeptno, deptname from dept

                  Union

                  Selectdeptno, deptname from dept

                  Union

                  Selectdeptno, deptname from dept) b

    On a.workdept = b.deptno

 groupby b.deptname

3、從部門表刪除人數爲0的部門。 oracle:

Deletefrom dept a where not exists (select a.deptno fromemployee b wherea.deptno=b.workdept)

4 新建一張表EMPLOYEE_TMP,表結構與EMPLOYEE一樣,不需要數據。oracle:

Createtable employee_tmp asselect *fromemployee  where1=2

5、列出平均收入大於50000的部門名稱。Oracle:

Selectdeptname,avg(salary+bonus)fromemployee a,dept b Where a.workdept=b.deptnogroupbydeptname  having(avg(salary+bonus)>50000)

6、類似於論壇性質的應用,從表tab1中取記錄,每頁展示20條記錄,請取出按照字段uid排序的第21至第40條記錄。 Db2:

select * from (selectrownumrn, a.* from tab1 whererownum<= 40) wherern >= 21  orderbyuid

7、寫出得到當前時間加1年加2個月加3天是星期幾的SQL

select  to_char(add_months(sysdate, 1 *12 +2)+3, 'yyyy-mm-ddHH24:MI:SS') from dual;

8、使用查詢語句實現如下統計報表:

學歷

人數

工資

平均工資

 合計

合計

中學及以下

 

 

 

 

 

 

 

 

大學

 

 

 

 

 

 

 

 

碩士及以上

 

 

 

 

 

 

 

 

Select edlevel,

       sum(casewhensex = 1then1else0end),

       sum(casewhensex = 2then1else0end),

       count(*),

       sum(casewhensex = 1then salary  else0end),

       sum(casewhensex = 2then salary else0end),

       sum(salary),

       avg(casewhensex = 1then salary end),

       avg(casewhensex = 2then salary end),

       avg(salary)

  from employee

 groupby edlevel

 orderby edlevel

9、表TAB1內容:

pdate      result

2009-05-09   

2009-05-09   

2009-05-09   

2009-05-09   

2009-05-10   

2009-05-10   

2009-05-10   

……

如果要生成類似下列結果:

 日期           

2009-05-09   2     2

2009-05-10  1     2

……

寫出SQL語句。 oracle

Select pdate, sum(casewhenresult =''then1else0end), sum(casewhenresult =''then1else0end) fromtab1 groupby pdateorderbypdate

10、找出數據庫中所有以’TB’開頭的表。 oracle:

select * fromall_tables  where TABLE_NAME like'TB%'

第三部分

僱員表:EMPLOYEE

(EMPNO     CHARACTER(6)   NOT NULL, --僱員編號,定義爲主鍵  

FIRSTNAME  VARCHAR(12)     NOT NULL, --僱員第一個名字  

MIDINIT   CHARACTER(1),            --僱員中間名字的首字母  

LASTNAME  VARCHAR(15)     NOT NULL, --僱員最後一個名字  

WORKDEPT  SMALLINT,                --部門編號,外鍵,對應部門表DEPTNO  

PHONENO   CHARACTER(4),            --電話號碼  

HIREDATE  DATE,                    --僱用日期  

JOB       CHARACTER(8),            --工作崗位

EDLEVEL   SMALLINT       NOT NULL, --學歷(1:中學及以下,2:大學,3:碩士及以上)

SEX       CHARACTER(1),            --性別(1:男,2:女)

BIRTHDATEDATE,                    --出生日期(60週歲以上爲退休)  

SALARY    DECIMAL(9,2),            --薪水  

BONUS     DECIMAL(9,2)             --獎金

);

部門表:DEPT

 (DEPTNO  SMALLINT      NOT NULL, --部門編號,主鍵

  DEPTNAME VARCHAR(14),    --部門名稱

  MANAGER  SMALLINT   --部門經理編號,每個經理也是僱員表中一個僱員 )

);

1 有一個與僱員表結構一樣的臨時表EMPLOYEE_TMP,存放僱員的臨時信息,每天晚上12點需要將僱員的臨時信息同步到僱員表中,如果僱員表中沒有相應記錄,insert,如果有,update WORKDEPTPHONENOJOBSALARYBONUS。使用一條SQL實現。

Mergeinto employee a

Using (select *fromemployee_tmp) b

on(a.empno=b.empno)

Whenmatchedthen 

updateset workdept=b.workdept,phoneno=b.phoneno,job=b.job,salary=b.salary,bonus=b.bonus

whennotmatchedthen

 insert (EMPNO,  FIRSTNAME,MIDINIT, LASTNAME, WORKDEPT,PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE,SALARY, BONUS)

values(b.EMPNO,b.FIRSTNAME,b.MIDINIT,b.LASTNAME,b.WORKDEPT,b.PHONENO,b.HIREDATE,b.JOB,b.EDLEVEL,b.SEX,b.BIRTHDATE,b.SALARY,b.BONUS)

2 有一張表tab1,有類似下面的記錄

 No name 

1    a 

2    b

3    c

4    d

……

請寫一條SQL顯示以下結果:

ab 

ac 

ad

……

bc 

bd 

……

cd

……

Select a.name||b.name fromtab1 a,tab1 b where a.name<b.name orderbya.name,b.name

3、有兩張表: 

Record(recNumber <主鍵>學號, recScore分數

Student(stuNumber <主鍵>學號, stuName姓名,stuClass班級

SQL語句實現以下查詢: 

查詢每一個班級中第二名的同學的姓名。

with tmp as

(selectstuName,recScore,dense_rank()over(orderbyb.recScore desc) ID

 from student a, record bwhereb.recnumber = a.stuNumber)

select stuName fromtmp whereID =2

4、有這樣一張表tb

  PDate        T1      T2    T3

2010-01-28 04:30:09 NULL   NULL

2010-01-28 18:30:00 NULL   NULL

2010-02-09 03:35:25 NULL   NULL

2010-01-28 NULL  04:31:09  NULL 

2010-01-28 NULL  05:31:09  NULL

2010-01-28 NULL  06:31:09  NULL

2010-01-28 NULL  07:31:09  NULL

2010-02-09 NULL  03:36:25  NULL

2010-01-28 NULL     NULL 04:32:09

2010-02-09 NULL    NULL  03:37:25

要求寫出單條SQL語句,通過處理可得到以下結果:

  PDate        T1        T2      T3 

2010-01-28 04:30:09 04:31:09 04:32:09 

2010-01-28 18:30:00 05:31:09  NULL

2010-01-28   NULL    06:31:09  NULL

2010-01-28   NULL    07:31:09  NULL

2010-02-09 03:35:25 03:36:25 03:37:25

selectcoalesce(a.pdate,b.pdate, c.pdate) pdate, a.t1,b.t2, c.t3

  from (selectt.*,row_number()over(partitionbypdate orderby pdate,t1) rr fromtb t wheret1 isnotnull)a

  fullouterjoin

       (selectt.*,row_number()over(partitionbypdate orderby pdate,t2) rr fromtb t wheret2 isnotnull)b

    on (a.pdate= b.pdate anda.rr = b.rr)

  fullouterjoin

       (selectt.*,row_number()over(partitionbypdate orderby pdate,t3) rr fromtb t wheret3 isnotnull)c

    on (b.pdate= c.pdate andb.rr = c.rr)

 orderby1, 2, 3, 4

5、表SALES(

YEAR INTEGER, QUARTER INTEGER,

MONTH INTEGER,

FEE DECIMAL(12,2)),記錄如下:

Year quarter month  fee

2009     1       1    10000

2009     1       2    10000

2009     1       3    10000

2009     2       4    10000

2009     2       5    10000

2009    2       6   10000

2009    3       7   10000

2009    3       8   10000

2009    3       9   10000

2009    4      10  10000

2009    4      11  10000

2009    4       12  10000

使用最簡單的SQL,得到下面的結果:

 year  quarter month  sum(fee)

2009    1         1     10000

  2009    1        2      10000

2009    1        3     10000 

2009    1       NULL   30000 

2009    2       4      10000 

2009    2       5      10000 

2009    2       6      10000

  2009    2      NULL   30000 

2009    3        7      10000 

2009    3       8      10000

2009    3       9      10000 

2009    3     NULL    30000 

2009    4      10      10000 

2009    4      11      10000

 2009   4      12      10000 

2009    4     NULL     30000 

2009   NULL    NULL    120000

NULL   NULL   NULL    120000 

請注意排序

Selectyear,quarter,month,sum(fee)fromsales groupbyrollup(year,quarter,month) orderbyyear,quarter,month

 相當於

select* from (

 Selectyear,quarter,month,sum(fee)from sales group by year,quarter,month

  unionall

 Selectyear,quarter,null,sum(fee)from sales group by year,quarter

  unionall

 Selectyear,null,null,sum(fee)from sales group by year

 unionall

  selectnull,null,null,sum(fee) from sales

 )orderby year,quarter,month;

 

Rollup():分組函數可以理解爲group by的精簡模式,具體分組模式如下:

Rollup(a,b,c):(a,b,c),(a,b),(a),(全表)

Cube():分組函數也是以group by爲基礎,具體分組模式如下:

cube(a,b,c):(a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),(全表)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章