Oracle的SQL高階技巧

2021-04-19 19:37:15 字數 1671 閱讀 5151

電郵:

[email protected]

部落格:http://wallimn.bokee.com

記錄一些在開發過程中,費了些事或者走了些彎路才解決的問題。

希望能給網友帶來些幫助。

1.關於層次查詢

select * from employees start with employee_id =100 connected by proior employee_id=manager_id;

這種層次查詢,相信大部分人都知道。但如何保持層次關係並進行排序呢?

oracle有個關鍵字:siblings專門用來解決這個問題。

寫法如下:order siblings by employee_id

這種排序,在層次查詢與樹形控制項結合使用的時候尤其有用。

2.橫向顯示多個依據不同條件的進行統計的count()結果

如,統計每個部門的總人數、及男性數量及女性數量

我使用的原始方法是:

select count(*) ,(select count(*) from employees where ***='1') as male,(select count(*) from employees where ***='0') as female from employees group by dept_id

可以解決問題,但速度很慢。今天在網上看到乙個好方法,記錄如下:

select count(*) ,count(case when ***='1' then 1 else null end) as male,count(case when ***='0' then 1 else null end) as female from employees group by dept_id

很巧妙的使用了count的特性及case,很不錯。

3.今天發現oracle很特別

這個語句不能用:insert into mytab (select * from mytab_tmp order by id)

注:mytab表的寫了個觸發器,要求按順序處理插入的資料。

害得我只好這樣寫:insert into mytab (select * from (select * from mytab_tmp order by id))

4.rownum用法

select * from (select rownum row_id ,month,sell  from (select month,sell from sale group by month,sell)) 

where row_id between 5 and 9

5.oracle計算時間差的方法

總結了一下:

天:round(to_number(end_date - start_date))

小時:round(to_number(end_date - start_date) * 24)

分鐘:round(to_number(end_date - start_date) * 24 * 60)

秒:round(to_number(end_date - start_date) * 24 * 60 * 60)

毫秒:round(to_number(end_date - start_date) * 24 * 60 * 60 * 60)

oracle高階sql指南

正在編寫oracle高階sql開發指南,包含開發中常用的oracle sql技術,以及複雜的sql分析技術,效能調整等問題。並且收錄一些比較優秀的sql。下面是暫定目錄 advanced sql in oracle 1.集合操作 2 1.1.union 和union all 21.2.interse...

oracle 技巧 sql 優化

it168 技術文件 一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面...

SQL高階查詢的一些技巧

高階查詢的一些技巧 1.使用and時,盡量將很可能不為真的條件放在前面 2.使用or運算子時,盡量將最可能為真的條件放在前面 3.distinct比order by更快 select memberid from orders group by memberid select distinct mem...