首先讓我們看一下 HR.EMPLOYEES 這張表的結構:
問題需求:
查出薪水最高的5-10條數據
答案:
select * from
(select rownum r, e1.* from
(
select e.* from hr.employees e order by e.salary desc
) e1
) e2 where e2.r >=5 and e2.r<=10
爲什麼要這麼麻煩? 爲什麼不能這樣寫?
錯誤示範:
select rownum r, e1.* from
(
select e.* from hr.employees e order by e.salary desc
) e1
where e1.r >=5 and e1.r<=10
因爲rownum的運行機制問題,所以呢,這種方法當前查得是當前生成得e1的rownum,所以查看出來的第一條數據其給它附的id爲1,然後後面有執行e1.r的判斷,所以那個e1的第一條數據(id爲1)不符合大於等於5小於等於10,第一條不符合,那麼它就會執行銷燬,所以本來的第二條也會成爲id爲1,然後繼續執行,所以第二條也不符合,如果想使它符合,那麼只能讓e1.r大於0即可,否則其它條件都是不可以的,如果你想讓其大於1或者及以上,就必須多包含一層,讓其變成一個數據集,再從數據集裏面取就可以取到(這就是爲什麼要多取一層的原因),不然你執行這個語句,一條數據都沒有而且還會報錯。
課外知識點補充:
SQL Select語句完整的執行順序:
- from子句組裝來自不同數據源的數據;
- where子句基於指定的條件對記錄行進行篩選;
- group by子句將數據劃分爲多個分組;
- 使用聚集函數進行計算;
- 使用having子句篩選分組;
- 計算所有的表達式;
- select 的字段;
- 使用order by對結果集進行排序。