oracle高級部分


回顧

多表關聯查詢的方式

 內連接

  根據AB表關聯的條件進行過濾查詢,只保留滿足條件數據

    Select * from a,b  where a.xxx=b.xxx;     Select * from a inner join b on a.xxx=b.xxxx     inner join c on a.xxxx=c.xxxx

 外連接

  左外連接

  以左表為驅動表,根據AB表關聯的條件進行過濾查詢,保留滿足條件的數據,以及左邊表的所有記錄顯示

    Select * from a left join b on a.xxx=b.xxxx     Inner join c on b.xxxx=c.xxxx     Select * from a, b(+);

  右外連接

  和左外連接正好相反 

Select * from a right join b on a.xxxx=b.xxxx

等同於: select * from b left join a on a.xxxx=b.xxxx

  特殊關聯查詢

  全外連接

    左外連接結果+右外連接結果-重復的數據

    Select * from a full join b on a.xxxx=b.xxxx

  笛卡爾集

  兩張表或多張表的乘積

Select * from a,b Select * from a inner join b on 1=1

  自連接A表連接A表進行查詢)

Select * from a,a
Select * from a t1 inner join a t2 on t1.xxxx=t2.xxxx

  合並查詢union union all

    可以把不同表的結果集合並一個結果集

  (兩張表選擇列的數量和類型必須保持一致

SQL1 Union [all] SQL2

  通過union實現全外連接

Select * from a left join b on a.xxxx=b.xxxx   Union
Select * from a right join b on a.xxxx=b.xxxx

索引

  對數據庫中表的一列或多列進行排序的一種結構,

  使用索引可以快速訪問數據庫中的特定信息

  (空間換時間)

 

 語法

Create [unique] index 索引名 on 表名 (字段1,[字段2])

  例如: create index idx_student_name on t_student (student_name);

  • 索引也是一種約束

優勢

  1. 確保每一行數據的唯一性
  2. 加快檢索速度
  3. 加快多表關聯查詢的速度
  4. 加快分組和排序的查詢速度

劣勢

  1. 創建和維護索引要耗用時間
  2. 索引占用數據以外的物理空間,隨數量量的增加而增加
  3. 當對表中的數據進行增刪改,索引也需要更新

視圖

 視圖是從一個或幾個基本表中導出的虛擬表。

  • 視圖可以把多表關聯查詢的結果作為一張虛擬表來查詢。

  可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。

  對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。

 語法

Create view 視圖名稱 as 關聯查詢的SQL語句

 優勢

  1. 簡化SQL語句
  2. 提高重要數據的安全性
  3. 邏輯數據獨立性

 劣勢

  增加維護成本

   一般運用到的

  不希望訪問者獲取整個表的信息,只暴露部分字段給訪問者。

  查詢的數據來源於不同的表,而查詢者希望以統一的方式查詢。

內置函數

  行轉列

  列轉行

需求

   

 

 1. 通過 decode()函數實現

  • 實現類似if else的功能
  • 思路:分組利用聚合函數擴展字段

語法  decode(字段,條件的值當條件成立返回的值,當條件不成立返回的值)

   

2.Case when語法

  

  列轉行 

  思路:使用union擴展記錄數

    

自定義函數

  什么是數據庫函數

  封裝了完成某些特定功能的SQL語句,經過編譯后保存在數據庫中的一個特殊對象 

 語法: 

create [or replace] function 函數名稱(參數1,參數2)

存儲過程

  類似函數,封裝了某些特定功能的SQL語句集,經過編譯保存在數據庫中的一個特殊對象,存儲過程不能出現在SQL中。

  存儲過程的創建
    Oracle存儲過程包含三部分:過程聲明,執行過程部分,存儲過程異常。

1)無參存儲過程語法

 create or replaceprocedureNoParPro   as  //聲明    ;    begin //執行    ;   exception//存儲過程異常   ;    end; 

 2)帶參存儲過程實例

create or replaceprocedure queryempname(sfindno emp.empno%type)   as   sName emp.ename%type;    sjobemp.job%type;   begin ....   exception ....   end;

  3)帶參數存儲過程含賦值方式

應用場景:

    統計每月的考勤數據

游標

 就在pl中的一個特殊對象,在存儲過程中遍歷SQL結果集時,可以通過游標來指向結果集每一條記錄。

    游標的使用可以讓用戶想操作數組一樣操作查詢出來的數據集,實際上,它提供了一種從集合性質的結果中提取單挑記錄的手段。

游標的種類:

  顯示游標

  隱式游標

觸發器

  應用場景:主鍵自增

  觸發器的定義就是說某個條件成立的時候,觸發器里面所定義的語句就會被自動的執行。

  觸發器是數據庫中的一個特殊的存儲過程,由事件觸發,當用戶對數據進行增刪改操作的時候,可以觸發該存儲過程的執行。

  觸發器可以分為語句級觸發器和行級觸發器。

觸發器的語法:

create [or replace] tigger 觸發器名 觸發時間 觸發事件 on 表名 [for each row]
begin pl/sql語句 end

 


免責聲明!

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



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