視圖
視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢,而自身不包含任何數據
爲什麼要視圖
•重用SQL語句
•簡化複雜的SQL操作
•使用表的組成部分而不是整個表
•保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限
•更改數據格式和表示
視圖的規則與限制
•與表一樣,視圖必須唯一命名
•在一個數據庫中,可以創建的視圖數目沒有限制
•視圖可以嵌套,即可以利用從其他視圖中查詢出來的數據構建新的視圖
•Order by可以用在視圖中,但如果從該視圖檢索數據的select中也含有order by,那麼該視圖中的Order by將會被覆蓋
•視圖不能索引,也不能有關聯的觸發器或默認值
•視圖和表可以一起使用,例如編寫一條聯接表和視圖的查詢
創建視圖
SQL語句:
CREATE VIEW myview1 AS
SELECT p.prodprice,p.prodname,t.typename
FROM product AS p
LEFT JOIN producttype AS t
ON p.typeid = t.id
接下來視圖就可以像表一樣使用了,但是視圖的更新與表的操作有一些差別
視圖的更新
•對視圖進行insert update delete將會影響其基表,因爲視圖中不包含任何數據
•不是所有視圖都可以更新,一下情況不能更新視圖:
•含有分組(group by 和 having)
•聯接查詢
•子查詢
•聚合函數
•DISTINCT
•不是迫不得已,不要對視圖進行更新操作,因爲效率低。視圖主要用於查詢。
簡而言之,只有由單表查詢建立視圖可以更新。
存儲過程
存儲過程是一組爲了完成某個特定功能而編寫的並運行在數據庫端的SQL程序集。
存儲過程優點
1.通過把處理封裝在簡單易用的單元中,簡化複雜的操作
2.提高性能。使用存儲過程比使用單獨的SQL語句要快
3.安全,調用者只需要調用指定的存儲過程即可,而不用關心存儲過程的內容
存儲過程缺點
1.編寫複雜
2.如果沒有相應的權限,你將無法創建存儲過程
創建存儲過程
SQL語句:
DELIMITER // #定義開始符號
CREATE PROCEDURE findtype()
BEGIN
SELECT * FROM producttype;
END// #結束
簡單的說就是將SQL寫成了一個方法。
DELIMITER; #回覆原來的分號;
#有返回值的
DELIMITER //
CREATE PROCEDURE findtypecount(OUT c INT,OUT p FLOAT)
BEGIN
SELECT COUNT(*) INTO c FROM product;
SELECT MAX(prodprice) INTO p FROM product;
END//
DELIMITER;
CALL findtypecount(@x,@y);
SELECT @x,@y;
未完待續