Mysql必知必會筆記——下

操作表

視圖

視圖是虛擬的表。使用視圖可以重用SQL語句,簡化復(fù)雜的SQL操作,更改數(shù)據(jù)格式和表示等;創(chuàng)建視圖后可以用與表基本相同的方式使用之,可以SELECT,過濾,排序,聯(lián)結(jié),甚至添加和更新數(shù)據(jù)(添加與更新存在某些限制)。
視圖本身不包含數(shù)據(jù),它們返回的數(shù)據(jù)是從其他表中檢索出來的,在添加或更改源數(shù)據(jù)時(shí)視圖將返回改變過的數(shù)據(jù)。
部署使用大量視圖的應(yīng)用前應(yīng)該進(jìn)行性能測試。

  • 與表一樣,視圖必須唯一命名
  • 對于可以創(chuàng)建的視圖數(shù)目沒有限制
  • 創(chuàng)建視圖必須有足夠的訪問權(quán)限
  • 視圖可以嵌套,可以利用從其他視圖中檢索數(shù)據(jù)的查詢來創(chuàng)建視圖
  • ORDER BY可以用在視圖中,如果檢索視圖時(shí)也用了ORDER BY則會將視圖中的ORDER BY覆蓋
  • 視圖不能索引,也不能有關(guān)聯(lián)的觸發(fā)器或默認(rèn)值
  • 視力可以和表一起使用,比如SELECT時(shí)聯(lián)結(jié)表和視圖
// 創(chuàng)建一個名為productcustomers的視圖,隱藏了一個復(fù)雜的多表查詢
CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
  AND orderitems.order_num = orders.order_num;

// 從視圖中檢索數(shù)據(jù)
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';

存儲過程

存儲過程就是為了方便以后使用而保存的一條或多條SQL語句的集合,可視為批處理,雖然它們的作用不僅限于批處理。
使用存儲過程的理由:簡單、安全、高性能:

//創(chuàng)建
CREATE PROCEDURE productpricing() 
BEGIN
  SELECT Avg(prod_price) AS priceaverage FROM products;
END;
//調(diào)用
CALL productpricing(); 
//刪除
DROP PROCEDURE productpricing;

使用命令行時(shí),如果存儲過程內(nèi)含有;字符,可以使用 DELIMITER臨時(shí)更改語句分隔符。
存儲過程可以接受參數(shù);可以使用DECLARE語句聲明變量,結(jié)合IF等實(shí)現(xiàn)更高級、更強(qiáng)的功能;
使用SHOW CREATE PROCEDURE或SHOW PROCEDURE STATUS獲取存儲過程的信息;

游標(biāo)

觸發(fā)器

觸發(fā)器是Mysql在響應(yīng)以下語句時(shí)自動執(zhí)行的一條MySQL語句(或位于BEGIN與END之間的一組語句):DELETE、INSERT、UPDATE;
創(chuàng)建時(shí)應(yīng)給出:1、唯一的觸發(fā)器名;2、關(guān)聯(lián)的表;3、應(yīng)該響應(yīng)的語句;4、在處理之前還是之后執(zhí)行。
每個表最多支持6個觸發(fā)器;單一觸發(fā)器不能與多個事件或多個表關(guān)聯(lián);
觸發(fā)器不能更新或覆蓋,只能先刪除再重新創(chuàng)建;
如果BEFORE觸發(fā)器失敗,則請求的操作不會被執(zhí)行;如果BEFORE觸發(fā)器或語句本身失敗,AFTER觸發(fā)器將不會得到執(zhí)行;

CREATE TRIGGER neworder AFTER INSERT ON orders
FOR EACH ROW SELECT NEW.order_num

DROP TRIGGER newproduct;

INSERT觸發(fā)器

  • INSERT觸發(fā)器代碼內(nèi)可引用一個名為NEW的虛擬表訪問被插入的行
  • BEFORE INSERT觸發(fā)器中可以更新NEW中的值
  • AUTO_INCREMENT列,NEW在INSERT之前包含0,INSET后包含新的自動生成值
    DELETE觸發(fā)器
  • DELETE觸發(fā)器代碼內(nèi)可以一個名為OLD的虛擬表訪問被刪除的行
  • OLD中的值全為只讀,不能更新
    UPDATE觸發(fā)器
  • UPDATE觸發(fā)器的代碼內(nèi)可以引用OLD訪問舊的值,引用NEW訪問新更新的值
  • BEFORE UPDATE觸發(fā)器中,NEW中的值可以更新
  • OLD中的值全為只讀,不能更新
    總結(jié)
    1、通常before用于數(shù)據(jù)的驗(yàn)證和凈化(為了保證插入表中的數(shù)據(jù)確實(shí)是需要的數(shù)據(jù)) 也適用于update觸發(fā)器。
    2、與其他DBMS相比,MySQL 5中支持的觸發(fā)器相當(dāng)初級,未來的MySQL版本中估計(jì)會存在一些改進(jìn)和增強(qiáng)觸發(fā)器的支持。
    3、創(chuàng)建觸發(fā)器可能需要特殊的安全訪問權(quán)限,但是觸發(fā)器的執(zhí)行時(shí)自動的,如果insert,update,或者delete語句能夠執(zhí)行,則相關(guān)的觸發(fā)器也能執(zhí)行。
    4、用觸發(fā)器來保證數(shù)據(jù)的一致性(大小寫,格式等)。在觸發(fā)器中執(zhí)行這種類型的處理的優(yōu)點(diǎn)就是它總是進(jìn)行這種處理,而且透明的進(jìn)行,與客戶機(jī)應(yīng)用無關(guān)。
    5、觸發(fā)器的一種非常有意義的使用就是創(chuàng)建審計(jì)跟蹤。使用觸發(fā)器,把更改(如果需要,甚至還有之前和之后的狀態(tài))記錄到另外一個表是非常容易的。
    6、MySQL觸發(fā)器不支持call語句,無法從觸發(fā)器內(nèi)調(diào)用存儲過程。

事務(wù)

保證成批的SQL操作要么完全執(zhí)行,要么完全不執(zhí)行;
MyISAM不支持事務(wù),InnoDB支持;
START TRANSACTION開始一個事務(wù);
ROLLBACK回滾事務(wù);
COMMIT提交事務(wù);
SAVEPOINT創(chuàng)建保留點(diǎn),可以回滾到該處:ROLLBACK TO ...
默認(rèn)的MySQL行為是自動提交所有更改,可以使MySQL不自動提交更改(針對每個連接,而不是服務(wù)器):SET autocommit = 0;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀其大綱 page 01 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 M...
    周少言閱讀 3,255評論 0 33
  • MYSQL 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評論 5 115
  • 一、MySQL架構(gòu)與歷史 A.并發(fā)控制 1.共享鎖(shared lock,讀鎖):共享的,相互不阻塞的 2.排他...
    ZyBlog閱讀 20,023評論 3 177
  • 這一年大概是想教會我,有所得,有所失去吧。世間沒有絕對的公平,沒有絕對你理所應(yīng)當(dāng)??傆幸恍┦虑閛ut of con...
    青鳳閩月閱讀 262評論 0 0
  • 國慶放假休息了8天,一大籮筐的事情等著處理,一直忙到晚上很晚才到回家,10:30才到家。明天繼續(xù)加快速度把手頭上事...
    鄭清文閱讀 129評論 0 2

友情鏈接更多精彩內(nèi)容