回顧
多表關聯查詢的方式
內連接
根據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);
- 索引也是一種約束
優勢
- 確保每一行數據的唯一性
- 加快檢索速度
- 加快多表關聯查詢的速度
- 加快分組和排序的查詢速度
劣勢
- 創建和維護索引要耗用時間
- 索引占用數據以外的物理空間,隨數量量的增加而增加
- 當對表中的數據進行增刪改,索引也需要更新
視圖
視圖是從一個或幾個基本表中導出的虛擬表。
- 視圖可以把多表關聯查詢的結果作為一張虛擬表來查詢。
可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。
對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
語法
Create view 視圖名稱 as 關聯查詢的SQL語句
優勢
- 簡化SQL語句
- 提高重要數據的安全性
- 邏輯數據獨立性
劣勢
增加維護成本
一般運用到的
不希望訪問者獲取整個表的信息,只暴露部分字段給訪問者。
查詢的數據來源於不同的表,而查詢者希望以統一的方式查詢。
內置函數
行轉列
列轉行
需求
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