1. 程式人生 > 資料庫 >Oracle的四道經典面試題分享

Oracle的四道經典面試題分享

前言

本文整理了4道Oracle 經典面試題,與大家分享學習。這也許是你一直期待的文章,下面話不多說了,來一起看看詳細的介紹吧

第一題

create table test(
 id number(10) primary key,type number(10),t_id number(10),value varchar2(6)
);

insert into test values(100,1,'張三');
insert into test values(200,2,'男');
insert into test values(300,3,'50');

insert into test values(101,'劉二');
insert into test values(201,'男');
insert into test values(301,'30');

insert into test values(102,'劉三');
insert into test values(202,'女');
insert into test values(302,'10');

select * from test;

程式碼生成表格如:

根據以上程式碼生成的表寫出一條查詢語句,查詢結果如下:

姓名 性別 年齡
張三 50
劉二 30
劉三 10

/*
根據表格可以分析出type列中1代表姓名、2代表性別、3代表年齡,而t_id中id一樣的為同一個人的屬性
查詢結果中列依次為姓名、性別、年齡,而type列決定姓名、性別、年齡
*/

/*使用分組,先對t_id進行分組,然後用decode函式過濾資料,例:decode(type,value) type=1就顯示為value
由於分組後select後面的列欄位只能是分組的欄位或者組函式,所有使用max()。
同一個人的type沒有重複數值所以 decode(type,value)返回的值只有一個,最大值也就是這個值
*/
select max(decode(type,value)) "姓名",max(decode(type,value)) "性別",value)) "年齡"
 from test
 group by t_id;

/*使用連表,通過where過濾生成3張type分別等於1(姓名)、2(性別)、3(年齡)的3張虛擬表 如:

再通過where 連線條件 三張表t_id相等的為同一個人或者說同一條記錄(行)
*/
select t1.value "姓名",t2.value "性別",t3.value "年齡" from 
(select value,t_id from test where type=1) t1,(select value,t_id from test where type=2) t2,t_id from test where type=3) t3
where t1.t_id=t2.t_id and t1.t_id=t3.t_id;

第二題

/*

2.一道SQL語句面試題,關於group by
表內容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負
2005-05-09 負
2005-05-10 勝
2005-05-10 負
2005-05-10 負

如果要生成下列結果,該如何寫sql語句?

   勝 負
2005-05-09 2 2
2005-05-10 1 2
------------------------------------------
create table tmp(rq varchar2(10),shengfu varchar2(5));

insert into tmp values('2005-05-09','勝');
insert into tmp values('2005-05-09','負');
insert into tmp values('2005-05-09','負');
insert into tmp values('2005-05-10','勝');
insert into tmp values('2005-05-10','負');

select * from tmp;
*/

--使用分組
--按日期分組,用conut函式計算次數
select rq "日期",count(decode(shengfu,'勝',1)) "勝",'負',1)) "負"
 from tmp
 group by rq
 order by rq;

--使用連表
--這道題本身就需要分組,不建議使用連表做
--以下使用的是SQL1999的連表方式,語法不一樣效果與第一題使用的SQL1992的一樣
select t1.rq,t1.勝,t2.負 from
(select count(decode(shengfu,rq from tmp group by rq) t1
join
(select count(decode(shengfu,1)) "負",rq from tmp group by rq) t2
on t1.rq=t2.rq;

第三題

/*3.生成題目所需的表

create table STUDENT_SCORE
(
 name VARCHAR2(20),subject VARCHAR2(20),score NUMBER(4,1)
);
insert into student_score (NAME,SUBJECT,SCORE) values ('張三','語文',78.0);
insert into student_score (NAME,'數學',88.0);
insert into student_score (NAME,'英語',98.0);
insert into student_score (NAME,SCORE) values ('李四',89.0);
insert into student_score (NAME,76.0);
insert into student_score (NAME,90.0);
insert into student_score (NAME,SCORE) values ('王五',99.0);
insert into student_score (NAME,66.0);
insert into student_score (NAME,91.0);

3.1得到類似下面的結果
姓名 語文 數學 英語
王五 89 56 89
李四 xx xx xx
select * from STUDENT_SCORE;

3.2有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,
請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路): 
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。 
  顯示格式: 
  語文    數學    英語 
  及格    優秀    不及格 
------------------------------------------
*/

--3.1
--使用分組
select name "姓名",max(decode(subject,'語文' ,score)) "語文",'數學' ,score)) "數學",'英語' ,score)) 英語
 from STUDENT_SCORE
 group by name;

--使用連表

select t1.name 姓名,t1.score 語文,t2.score 數學,t3.score 英語 from
(select name,score from STUDENT_SCORE where subject='語文') t1
join
(select name,score from STUDENT_SCORE where subject='數學') t2
on t1.name=t2.name
join
(select name,score from STUDENT_SCORE where subject='英語') t3
on t1.name=t3.name;

--3.2
--在3.1的基礎上使用 case when then esle end
select t.姓名,(case when t.語文>=80 then '優秀'
   when t.語文>=60 then '及格'
   else '不及格' end) 語文,(case when t.數學>=80 then '優秀'
   when t.數學>=60 then '及格'
   else '不及格' end) 數學,(case when t.英語>=80 then '優秀'
   when t.英語>=60 then '及格'
   else '不及格' end) 英語
 from 
(select t1.name 姓名,score from STUDENT_SCORE where subject='英語') t3
on t1.name=t3.name
) t;

第四題(這道題難度相對較高)

/*4.請用一個sql語句得出結果
從table1,table2中取出如table3所列格式資料,注意提供的資料及結果不準確,
只是作為一個格式向大家請教。


table1

月份mon 部門dep 業績yj
-------------------------------
一月份  01  10
一月份  02  10
一月份  03  5
二月份  02  8
二月份  04  9
三月份  03  8

table2

部門dep  部門名稱dname
--------------------------------
  國內業務一部
  國內業務二部
  國內業務三部
  國際業務部

table3 (result)

部門dep 一月份  二月份  三月份
--------------------------------------
  10  null  null
  10   8  null
  null  5  8
  null  null  9

------------------------------------------

create table yj01(
  month varchar2(10),deptno number(10),yj number(10)
)

insert into yj01(month,deptno,yj) values('一月份',01,10);
insert into yj01(month,yj) values('二月份',02,03,5);
insert into yj01(month,yj) values('三月份',8);
insert into yj01(month,04,9);
insert into yj01(month,8);

create table yjdept(
  deptno number(10),dname varchar2(20)
)

insert into yjdept(deptno,dname) values(01,'國內業務一部');
insert into yjdept(deptno,dname) values(02,'國內業務二部');
insert into yjdept(deptno,dname) values(03,'國內業務三部');
insert into yjdept(deptno,dname) values(04,'國際業務部');
*/
select * from yj01;
select * from yjdept;
--使用分組
select deptno,max(decode(month,'一月份',yj)) 一月份,'二月份',yj)) 二月份,'三月份',yj)) 三月份 
from yj01 group by deptno
order by deptno;

--這道題給出了兩張表,而用分組做,使用yj01表就能做出來了,所以這道題考察的應該是連表的知識
/*這兩張表中有的月份有的部門業績是空的,而用前幾道題的做法,不匹配條件的值會被過濾掉,
例如month=一月份的只有1部門,形成的表裡deptno只有1和二月份、三月份形成的表中的deptno無法匹配
而yjdept表中包含了所有部門編號deptno,這時就可以用到外連線的特性
(在滿足一張表的內容都顯示的基礎上,連線另外一張表,如果連線匹配則正常顯示,連線不匹配,另外一張表補null)
*/
select t1.deptno,t1.yj 一月份,t2.yj 二月份,t3.yj 三月份
from
(select y2.deptno,y1.yj from
(select yj,deptno from yj01 where month='一月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t1
join
(select y2.deptno,deptno from yj01 where month='二月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t2
on t1.deptno=t2.deptno
join
(select y2.deptno,deptno from yj01 where month='三月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t3
on t1.deptno=t3.deptno
order by t1.deptno;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。