SQL語句(進階部分)

摘自《SQL必知必會》

1. 視圖

視圖是虛擬的表,與包含數據的表不一樣,視圖只包含動態檢索數據的查詢。
視圖名需要唯一

比如將下面這條查詢語句包裝成一個名爲 productCustomers 的虛擬表

#創建視圖
create view productCustomers as
select cust_name,cust_concat from customers, orders, orderItems 
where customer.cust_id = orders.cust_id
and orderItems.order_num = orders.order_num
and prod_id = 'R1001';


# 通過視圖進行查詢
select cust_name,cust_concat from productCustomers where pro_id = 'R1001';

爲什麼使用視圖:
1.重用SQL
2.簡化複雜SQL操作
3.使用表的一部分而不是整個表
4.保護數據…

2.存儲過程

創建存儲過程

Oracle

CREATE PROCEDURE MailingListCount(ListCount OUT INTEGER)
IS
v_rows INTEGER;
BEGIN
	SELECT COUNT(*) INTO v_rows
	FROM Customers
	WHERE NOT cust_eamil IS NULL;
	ListCount := v_rows;
END;

這個存儲過程有一個名爲ListCount的參數,此參數返回一個值,而不是傳遞一個值給存儲過程。OUT 用來指示這種行爲。

Oracle 支持 IN 傳遞值給存儲過程、OUT 從存儲過程返回值,INOUT即傳值也返回值。
存儲過程的代碼括在BEGIN 和 END 語句中。

上面的語句表示:檢索出具有cust_email的 customer ,然後用檢索出的行數設置ListCount。

聲明一個變量來保存存儲過程返回的值
執行存儲過程
使用 select 語句顯示返回的值

#oracle
var ReturnValue NUMBER
EXEC MailingListCount(:ReturnValue);
Select ReturnValue

SQL Server

SQL Server中局部變量名以@開頭

#SQL Server
CREATE PROCEDURE MailingListCount 
AS
DECLARE @cnt INTEGER     -- 聲明局部變量
SELECT @cnt = COUNT(*) FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;

執行存儲過程

DECLARE @ReturnValue INT
EXECUTE @ReturnValue = MailingListCount;
SELECT @ReturnValue;

3. 事務管理

開啓和提交事務
SQL Server

begin transaction
...
commit transaction

MySQL

start transaction
...

Oracle

set transaction
...
commit;

回滾

delete from student;
rollback;

保留點

複雜的事務,可能需要部分提交或回退
設置保留點,也就是在某一行設置標誌,發生錯誤回退到某個點之前

創建佔位符

#Oracle/MySQL
savepoint delete1;

#SQL Server
save transaction delete1;

回滾到某個保留點

#SQL Server
rollback transaction delete1;
#MYSQL/Oracle
rollback to delete1;

待續…

發佈了31 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章