1. 程式人生 > 實用技巧 >Oracle-查詢結果的處理

Oracle-查詢結果的處理

函式相關

統計上卷函式

rollup()

專門做最終的彙總統計

先對每個組分別做計算,然後最終對整個表做計算

集合運算

union all

將兩個查詢語句的所有結果進行拼接

union

先將結果拼接,再去除重複值

並集

intersect

取兩個查詢結果的交集

minus

取第一個結果有的但是第二個結果沒有的資料

邏輯處理

空值處理

nvl()

專門處理空值的方法,當列的值為空的時候,設定一個預設值

nvl(列名,如果列為空時的預設值)

nvl2()

專門處理空值的方法,當列為空或者不為空的時候,都單獨設定顯示結果

nvl2(列名,不為空的處理,為空的處理)

邏輯判斷

decode()

邏輯判斷函式

decode(列名,判斷條件1,條件1為真的結果,判斷條件2,條件2為真的結果...,所有條件為假的結果)

sign()

計算一個數學表示式

sign(數字計算)
計算結果為正數則等於1   負數則等於-1  零則等於0

decode()+sign()邏輯判斷

如果sign(數字-1000)   
如果結果=0,說明數字是1000,如果是1,數字大於1000,-1數字則小於1000

case...when...

邏輯判斷語句

case 
  when 條件判斷1  then  結果顯示
  when 條件判斷2  then  結果顯示
  ...
  else  結果顯示
end

偽列

rowid

每一行資料,都有存在於oracle資料庫裡面的唯一編號。

使用rowid進行去重

將要去重的資料進行分組,

找到每個組最小或者最大的rowid,

將除了最小或者最大rowid的行資料都刪除掉,

剩下的就是去重之後的資料了

delete from dept where rowid not in
(select min(rowid) from dept group by deptno,dname,loc);

rownum

根據表的順序,生成的一組從小到大的序號

使用rownum進行分頁查詢

--分頁查詢的應用,先將rownum那一行固定下來
select * from
(select emp.*,rownum r from emp)
 where r>=5 and r<=10;

分析函式

核心:開窗函式over()

over(partition by 分組欄位 order by 排序欄位)

聚合計算

使用聚合函式加上開窗函式,計算出一列新的資料

排名函式

row_number()

排名不存在相同並列的名次

即使兩個的結果相同,排名也分前後

rank()

排名存在並列的名次

當兩個結果相同時,名次也相同,然後會下個名次會跳過

dense_rank()

排名存在並列的名次

當兩個結果相同時,名次也相同,然後會下個名次會繼續被使用,不會跳過

資料平移

將資料向上或者向下挪動一行

lag(列名) 將列的資料往下挪一行

lead(列名) 將列的資料往上挪一行

同比計算

在幾個不同週期內,對週期內相同的時間段進行資料的比較

--使用表連線的方法進行資料同比的計算
select a.y,a.m,(a.amount-b.amount)/b.amount 增長率 from sales a join sales b on a.m=b.m and a.y=b.y+1;

--使用lag()進行資料的下移,進行同比的計算
select a.*,(amount-last_y)/last_y 增長率 from
(select sales.*,
       lag(amount) over(partition by m order by y) last_y
  from sales) a
 where last_y is not null;

環比計算

在一個時間週期內,對相鄰的時間段進行資料比較

--使用表連線的方法進行資料環比的計算
select a.y,a.m,(a.amount-b.amount)/b.amount from sales a join sales b on a.m=b.m+1;

--使用lag()進行資料的下移,進行環比的計算
select a.*,(amount-last_m)/last_m from
(select sales.*,
       lag(amount) over(order by m) last_m
  from sales) a;

行列轉換

行展示的資料,轉換成列展示的資料

pivot()

先找出需要的資料,

再在privot函式中進行分組聚合函式的操作,

顯示需要的列

select * from 
(select 需要的資料的列 from 原來的表格名)
pivot(
聚合函式(列名) 
    for 
分組的列名 
    in 
(新的列名1,新的列名2...)
);

臨時表

表裡面的資料不是永久存在的

很大的表格進行表連線查詢的時候,
將每個表分開進行資料的篩選,
將篩選的結果儲存到臨時表中,
最後再對臨時表的資料,進行表的連線。
為了減少資料篩選和查詢時候的資料量。

會話級臨時表

本次登入的過程中,資料一直存在,如果重新登入,資料就消失了

create  global  temporary  table  臨時表的名字(
列名 資料型別
)on  commit  preserve rows;

事務級臨時表

操作了事務之後(commit, rollback),資料就會消失

create global temporary table 臨時表名字(
列名 資料型別
)on commit delete rows;