Oracle的一些經典SQL面試題

2021-09-08 13:35:54 字數 3361 閱讀 6678

例項1:測試資料:

create table nba(

team   varchar2(20),

year number(4)

sql> select * from nba;

team                  year

活塞                  1990

公牛                  1991

公牛                  1992

公牛                  1993

火箭                  1994

火箭                  1995

公牛                  1996

公牛                  1997

公牛                  1998

馬刺                  1999

湖人                  2000

湖人                  2001

湖人                  2002

馬刺                  2003

活塞                  2004

馬刺                  2005

熱火                  2006

馬刺                  2007

凱爾特人              2008

湖人                  2009

湖人                  2010

21 rows selected

請寫出一條 sql 語句,查詢出在此期間連續獲得冠軍的有哪些,其連續的年份的起止時間是多少,結果如下:

team begin end

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

公牛 1991 1993

火箭 1994 1995

公牛 1996 1998

湖人 2000 2002

湖人 2009 2010

求解:sql> select team, min(t2y), max(t1y)

2    from (select t2.team, t2.year as t2y, t1.year as t1y

3            from nba t1, nba t2

4           where t1.team = t2.team

5             and t1.year = (t2.year + 1)) t

6   group by t.team, (t.t1y - rownum);

team                   min(t2y)   max(t1y)

公牛                       1996       1998

湖人                       2009       2010

湖人                       2000       2002

公牛                       1991       1993

火箭                       1994       1995

分析:這個sql要做的有兩件事:

1)求出連續獲得冠軍的team

2)求出起止年份

關係:根據分析1可知,存在關係team相同的球隊(year=year+1),滿足這個關係的球隊即是連續獲得冠軍的球隊。可以得到sql如下:

sql> select t2.team, t2.year as t2y, t1.year as t1y

2    from nba t1, nba t2

3   where t1.team = t2.team

4     and t1.year = (t2.year + 1);

team                   t2y   t1y

公牛                  1991  1992

公牛                  1992  1993

火箭                  1994  1995

公牛                  1996  1997

公牛                  1997  1998

湖人                  2000  2001

湖人                  2001  2002

湖人                  2009  2010

8 rows selected

sql中t2y欄位表示球隊獲得冠軍每連續兩行之間的最小年份,t1y為連續兩行記錄間的最大年份,最終滿足分析1,和2的結果集到此都可以從這個臨時表中取得了。

下面我們需要對這個臨時表做乙個分組,即連續獲得冠軍的球隊我們只需要1行記錄用做顯示,分組欄位是什麼呢?觀察臨時表結構,這裡我們採用(team,t1y-rownum)作為分組條件,這樣連續獲得冠軍的球隊team就可以用一行顯示了。那麼我們還差起止年份需要處理一下,就可以出具最終的查詢結果了!從臨時表結構可以看出通過(team,t1y-rownum)分組後,可以由t2y欄位我們求出開始年份,即(min(t2y)),可以由t1y欄位求出結止年份,即(max(t1y))!繼續處理sql如下:

sql> select t.team, min(t2y), max(t1y)

2    from (select t2.team, t2.year as t2y, t1.year as t1y

3            from nba t1, nba t2

4           where t1.team = t2.team

5             and t1.year = (t2.year + 1)) t

6   group by t.team, t1y - rownum

7   order by min(t2y);

team                   min(t2y)   max(t1y)

公牛                       1991       1993

火箭                       1994       1995

公牛                       1996       1998

湖人                       2000       2002

湖人                       2009       2010

總結一下,對於這套面試題,對於dba出身的我,沒有處理過類似問題,如果是我遇到了,估計在紙上是寫不出來,但是自己處理,是可以求出如上結果的。所以寫sql是乙個循序漸進的過程,不是一蹴而就的結果。

一些經典的SQL

表結構 部門deptid,父級部門parentdeptid,資料庫的每一條記錄都記錄了自身id和父級部門id,現在要從某個部門查詢其下屬部門生成一棵部門關係樹,sql如下 select so.orgid,so.parentdeptid,so.orgname from sys orginfo so s...

oracle的一些SQL命令

第四章 1 邏輯備份 1 必備引數 exp system abc123 file d b.dmp 該命令並未指定登陸到哪個資料庫例項,因此,將使用系統環境變數 oracle sid 所指定的資料庫例項。2 owner 引數 exp system abc123 owner test,oracle fi...

oracle常用的一些sql命令

檢視系統當前時間 hh24 24小時制 mi是正確的分鐘 select to char sysdate,yyyy mm dd hh24 mi ss from dual hh非24 mm不區分大小寫 日期中mm系統認為是月份 select to char sysdate,yyyy mm dd hh m...