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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM