例項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...