《MySQL必知必會》閱讀筆記(二)——增刪改

第19章  插入數據

若是數據檢索是最重要的,在INSERT和INTO之間添加關鍵字LOW_PRIORITY,可下降INSERT語句的優先級,也適用於UPDATE和DELETE語句html

從一個新表中導入數據到另外一個表中
INSERT INTO p1(.......)  SELECT  (......)  FROM p2;mysql

若不能保證主鍵值不重複,可省略此列,MySQL會自動生成新值git

導入時使用的是列的位置而不是列名github

第20章  更新和刪除數據

基本的UPDATE語句由3部分構成:要更新的表,列名和它們的新值,肯定更新行的過濾條件sql

UPDATE customers SET cust_name = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 1005;

DELETE刪除的是整行,刪除指定的列則使用UPDATE語句數據庫

DELETE FROM customers WHERE cust_id = 1006;

第21章  建立和操縱表

建立表的兩種方法:直接用MySQL語句操縱,使用具備交互式建立和管理表的工具(其內部也是使用MySQL語句操縱)工具

CREATE TABLE osc_customers
{ 
   id     int(11)    NOT NULL AUTO_INCREMENT,
   user   int(16)    NOT NULL,
   email  char(255)  NULL,
   PRIMARY KEY (id)
}ENGINE=InnoDB

AUTO_INCREMENT  鍵值自增,每一個表只容許一個且它必須被索引性能

NULL,容許缺值spa

PRIMARY KEY   指定主鍵,可指定多個,主鍵不能爲null.net

表名後給出IF NOT EXISTS表示僅在一個表不存在時建立它

DEFAULT  指定默認值

引擎類型

MySQL具備多個引擎,它們各自有不一樣的功能特性,爲不一樣的任務選擇合適的引擎能得到良好的功能

不指定則使用默認引擎

InnoDB:可靠的事物處理引擎,不支持全文本搜索

MyISAM:性能極高的引擎,支持全文本搜索,不支持事物處理

MEMORY:在功能上等同於MyISAM,但因爲數據存儲在內存中,速度很快(特別適合於臨時表)

引擎完整列表及其特性:http://dev.mysql.com/doc/refman/5.7/en/storage_engines.html 誤

外鍵不能跨引擎:即一個引擎的表不能引用具備使用不一樣引擎的表的外鍵

更新表

使用ALTER TABLE更新表

給表增長一個列

ALTER TABLE vendors ADD vend_phone CHAR(20);

刪除一個列

ALTER TABLE vendors DROP COLUMN vend_phone;

ALTER TABLE的一種常見用途是定義外鍵

刪除表

DROP TABLE tableName;

重命名錶

RENAME TABLE tableName1 TO tableName2;

第22章  使用視圖

視圖是虛擬的表,與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。

1. 重用SQL語句

2. 簡化複雜的SQL操做,在編寫查詢後,能夠方便的重用它而沒必要知道它的基本查詢細節

3. 使用表的組成部分而不是整個表

4. 保護數據。能夠給用戶表的特定部分的訪問權限而不是整個表的訪問權限

5. 更改數據格式和表示

建立視圖:CREATE VIEW

刪除視圖:DROP VIEW

第23章  使用存儲過程

常常會有一個完整的操做須要多條語句才能完成,存儲過程就是將多條操做語句封裝在容易使用的單元中,簡化複雜的操做

可簡化對變更的管理。提升性能,使用存儲過程比使用單條SQL語句要快

存在一些只能用在單個請求中的MySQL中的元素和特性,存儲過程可使用它們來編寫更強的代碼

執行存儲過程

MySQL稱存儲過程的執行爲調用,語句爲CALL,接受存儲過程的名字以及須要傳遞給它的任意參數

CALL productpricing(@pricelow, @pricehigh, @priceaverage);

執行名爲productpricing的存儲過程,它計算並返回產品的最低、最高和平均價格

建立存儲過程

CREATE PROCEDURE productpricing()
BEGIN
     SELECT Avg(prod_price) AS priceaverage
     FROM products;
END;

mysql命令行實用程序分隔符默認爲 ; 

可臨時更改,DELIMITER //     定義分隔符爲//

DELIMITER //

CREATE PROCEDURE productpricing()
BEGIN
     SELECT Avg(prod_price) AS priceaverage
     FROM products;
END//

DELIMITER ;

刪除存儲過程    DROP PROCEDURE productpricing;

使用參數

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
)
BEGIN
    SELECT Min(prod_price) INTO pl FROM products;
    SELECT Max(prod_price) INTO ph FROM products;
    SELECT Avg(prod_price) INTO pa FROM products;
END;

OUT:指出相應的參數用來從存儲過程當中傳出一個值(返回給調用者)

IN:傳遞給存儲過程

調用該存儲過程,調用時並不顯示任何數據

CALL productpricing(@pricelow, @pricehigh, @priceaverage);

 顯示數據

SELECT @pricehigh, @pricelow, @priceaverage;

使用IN和OUT參數

CREATE PROCEDURE ordertotal(
       IN onumber INT,
       OUT ototal DECIMAL(8,2)
)COMMENT ‘This is a test'
BEGIN
    SELECT Sum(item_price*quanity) FROM orderitems 
           WHERE order_num = onumber INTO ototal;
END;

調用該存儲過程

CALL ordertotal(20005,@total);

存儲過程當中註釋  --

COMMENT關鍵字:非必需,若是給出,將在SHOW PROCEDURE STATUS的結果中顯示

檢查全部存儲過程:SHOW PROCEDURE STATUS

第24章  使用遊標

遊標:是一種能從包括多條數據的結果集中每次提取一條記錄的機制,充當指針的做用,用於對查詢數據庫所返回的記錄進行遍歷,以便進行相應的操做

只能用於存儲過程

使用遊標

  • 使用前進行聲明(定義)。這個過程實際上沒有檢索數據,它只是定義要使用的SELECT語句
  • 一旦聲明後,必須打開遊標以供使用。這個過程用前面定義的SELECT語句把數據實際檢索出來
  • 對於填有數據的遊標,根據須要取出(檢索)各行
  • 結束遊標使用時,必須關閉遊標

書上的例子,具體參考https://my.oschina.net/githubhty/blog/909052

CREATE PROCEDURE processorders()
BEGIN
       -- Declare local variables
       DECLARE o INT;
       DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;

       -- Open the cursor
       OPEN ordernumbers;

       -- Get order number
       FETCH ordernumbers INTO o;

       -- Close the cursor
       CLOSE ordernumbers;
end;

第25章  使用觸發器

觸發器:使某些語句在事件發生時自動執行

每一個表最多支持6個觸發器(INSERT、UPDATE和DELETE的以前和以後)

INSERT觸發器

在INSERT觸發器代碼內,可引用一個名爲NEW的虛擬表,訪問被插入的行

在BEFORE INSERT觸發器中,NEW中的值能夠被更新(容許更改被插入的值)

對於AUTO_INCREMENT列,NEW在INSERT執行以前包含0,在INSERT執行以後自動包含新的自動生成值

DELETE觸發器

能夠引用一個名爲OLD的虛擬表,訪問被刪除的行

OLD中的值全都是隻讀的,不能被更新

CREATE TRIGGER deleteorder BERORE DELETE ON orders FOR EACH ROW
BEGIN
    INSERT INTO archive_orders(order_num, order_date, cust_id)
    VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;

在任意訂單被刪除前將執行此觸發器。它使用一條INSERT語句將OLD中的值(要被刪除的訂單)保存到一個名爲archive_orders的存檔表中

使用BEGIN和END語句標記觸發體,可包含多條SQL語句

相對於AFTER DELETE,使用BEFORE DELETE的優勢爲:若是由於某種緣由觸發體中的語句沒有成功執行(如上述例子訂單沒有存檔),DELETE語句也不會執行

UPDATE觸發器

在UPDATE觸發器代碼中,能夠引用一個名爲OLD的虛擬表訪問UPDATE執行以前的值,引用名爲NEW的虛擬表訪問UPDATE執行以後的值

在BEFORE UPDATE觸發器中,NEW中的值能夠被更新

下面的例子保證州名縮寫老是大寫

CERATE TRIGGER updatevendor BEFORE UPDATE ON vendors
FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);

第26章  管理事物處理

事務處理:保證成批的MySQL操做要麼徹底所有執行,要麼徹底不執行

事物(transaction):指一組SQL語句

回退(rollback):指撤銷指定SQL語句的過程

提交(commit):指將未存儲的SQL語句結果寫入數據庫表

保留點(savepoint):指事務處理中設置的臨時佔位符(place-holder),能夠對它發佈回退(與回退整個事務不一樣)

控制事務處理

START TRANSACTION;

...

ROLLBACK;

通常的SQL語句都是隱含提交即提交操做是自動進行的,可是在事務處理塊中,提交不會隱含進行。需使用COMMIT語句進行明確提交

START TRANSACTION;

...

COMMIT;

簡單的ROLLBACK和COMMIT語句就能夠寫入或撤銷整個事務處理。可是更復雜的事務處理可能須要部分提交或回退,可以使用保留點進行佔位

START TRANSACTION;
...
SAVEPOINT delete1;
...
ROLLBACK TO delete1;

更改默認的提交行爲,autocommit值爲0指示MySQL不會自動更改,直至autocommit被設置爲真爲止

SET autocommit=0;
相關文章
相關標籤/搜索