[SQL數據庫易錯點] 子查詢 | 分頁查詢案例學習

首先讓我們看一下 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語句完整的執行順序:

  1. from子句組裝來自不同數據源的數據;
  2. where子句基於指定的條件對記錄行進行篩選;
  3. group by子句將數據劃分爲多個分組;
  4. 使用聚集函數進行計算;
  5. 使用having子句篩選分組;
  6. 計算所有的表達式;
  7. select 的字段;
  8. 使用order by對結果集進行排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章