摘自《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;
待續…